フォルダ用に作成された特別なハードリンク「.」のリンクを解除(削除)する方法は?

フォルダ用に作成された特別なハードリンク「.」のリンクを解除(削除)する方法は?

Linuxでは、フォルダを作成すると自動的に2つのフォルダが作成されます。ハードリンクそのinodeに。 1 つは作成を要求したフォルダー、もう 1 つは.このフォルダー用の特別なフォルダーです。

例:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

ご覧のとおり、内部的にfolderも両方とも同じinode番号を持っています(オプションとともに表示されます)。.folder-i

.この特定のハードリンクを削除する方法はありますか?

これは単なる実験と好奇心のためのものです。 ..また、答えは特殊ファイルにも適用されるようです。

私は人を調べてみましたが、rmどの方法も見つかりませんでした。すべてを削除しようとすると、.次の結果が表示されます。

RM: 「。」と「..」は削除できません。

私はこれらのものが動作する全体的な方法について本当に疑問に思います。したがって、このトピックについて冗長に説明することを控えないでください。

.編集:私の投稿がわからないかもしれませんが、ファイルを担当する基本的なメカニズムとそのファイルを削除できない理由を理解したいと思います。

POSIX標準は、2つ未満のフォルダへのハードリンクを許可しないことを知っていますが、その理由を理解していません。これが可能かどうか知りたいです。

答え1

.技術的には、少なくともEXT4ファイルシステムから削除できます。でファイルシステムイメージを作成し、test.imgそれをマウントし、testフォルダを作成して再度マウント解除する場合は、次のように編集できますdebugfs

debugfs -w test.img
cd test
unlink .

debugfs文句を言わずに.ファイルシステムからディレクトリエントリを誠実に削除します。驚くべきことに、このtestディレクトリはまだ利用可能です。

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

のみ表示

..

だから.本当に消えました。しかしcd .、パフォーマンスはls .まだpwd以前と同じです!

使用する前にこのテストを実行しましたが、rmdir .これによりディレクトリのinode(巨大なありがとう赤いボウル~のためこれを指摘する)、これはtestディレクトリエントリを吊り下げて発生した問題の実際の原因です。この場合、イメージのインストールtest後にフォルダが利用できなくなります。ls

ls: cannot access '/mnt/test': Structure needs cleaning

カーネルログの表示

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

e2fsckこの場合、イメージを実行するとtestディレクトリが完全に削除されます(ディレクトリinodeが消えたため、回復は不要です)。

これらすべては、.EXT4ファイルシステムに特定のエンティティとして存在することを示します。カーネルのファイルシステムコードから得られた印象は、それが期待して.存在..し、存在しない場合に警告することです(参照namei.c)、しかし、unlink .以下に基づくテストでは、対応する警告は表示されません。e2fsck見つからないディレクトリエントリが気に入らず、.修正を提案しました。

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

これにより、.ディレクトリエントリが再生成されます。

答え2

このディレクトリエントリは削除できません。この.項目は「このディレクトリ」を意味し、この..項目は「このディレクトリの親ディレクトリ」を意味します。実際にはハードリンクではなく、ディレクトリ構造が作成/表示される方法にすぎません。

答え3

で述べたようにUnix 6ソースコードに関するLionのコメント初期のUnixには、ファイルとディレクトリがinode構造でディスクに表示されるディスクファイルがありました。ファイルの内容がディレクトリであることを示す特別なビットがあります。各 inode には自分が属する inode へのリンクがあり、ファイルが自分があるディレクトリを知ることができます。独自のディレクトリを持つ "/" ディレクトリは例外です。コンテンツリンクもあります。インデックスノードにコンテンツがない場合は、利用可能なリストとして返すことができます。ディレクトリは祝福されたファイルにすぎないため、空のディレクトリでもガベージコレクションを防ぐためにコンテンツを含める必要があります。したがって、..は親inodeへのinodeへのリンクであり、..はディレクトリがまだ利用可能であることを示します。 unlink を呼び出して rmdir を削除することができます。参照がない場合、inode は使用可能リストに移動されます。

答え4

〜のように「重複の可能性」投稿答えは、POSIX標準がrmdirが現在のディレクトリを削除しようとすると失敗することを指定することです。

何をしても基礎がなければなりません。 「ここ」と言う方法がなければ、相対パスを定義することは困難です。だから」。 'は'ここ'と定義されます。

あなたはできる「ドット」と「ドットポイント」を削除します。独自のオペレーティングシステムを作成しますが、定義しないでください。 Unix(およびMac OSX拡張)、Linux、さらにはMS DOS、およびWindowsもすべてドットとドットを使用します。

TL;DR - 「ドット」はオペレーティングシステムの定義です。

関連情報