.
を削除することは技術的に可能です 、少なくとも EXT4 ファイルシステムでは。 test.img
でファイルシステム イメージを作成する場合 、マウントして test
を作成します debugfs
を使用して編集できます。 :
debugfs -w test.img
cd test
unlink .
debugfs
文句を言わず、忠実に .
を削除します ファイルシステムのディレクトリエントリ。 test
ディレクトリはまだ使用可能ですが、驚くべきことが 1 つあります:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
のみ表示
..
だから .
本当になくなりました。まだ cd .
、 ls .
、 pwd
通常どおりに動作します!
以前に rmdir .
を使用してこのテストを行いました 、しかし、それはディレクトリの inode を削除します (巨大な これを指摘してくれた BowlOfRed に感謝します)、残りは 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 .
-based test その警告は表示されませんでした。 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>?
これにより、.
が再作成されます ディレクトリ エントリ。
このディレクトリ エントリを削除する方法はありません。 .
エントリは「このディレクトリ」を意味し、..
エントリは「このディレクトリの親ディレクトリ」を意味します。それらは実際にはハード リンクではなく、ディレクトリ構造が作成/表現される方法です。
Lion's Notes on the Unix 6 Source Code で説明されているように 初期の Unix には、ディスク上でファイルとディレクトリの両方が inode 構造によって表されるディスク ファイルがありました。ファイルの内容がディレクトリであることを示す特別なビットがありました。各 i ノードには、ファイルがどのディレクトリにあるかをファイルが認識できるように、所有する i ノードへのリンクがありました。例外は、それ自体を所有する「/」ディレクトリでした。内容へのリンクもありました。 i ノードにコンテンツがない場合は、空きリストに戻すことができます。ディレクトリは単なる祝福されたファイルであるため、空のディレクトリであっても、ガベージコレクションされないようにするためのコンテンツが必要でした。したがって、.. は親 i ノードへの i ノードのリンクであり、.ディレクトリがまだ使用可能であることを示すためにそこにありました。 rmdir (unlink を呼び出すことにより) は、.他のコンテンツがなく、inode への参照がなくなったときに inode がフリー リストに移動する場合は、ディレクトリに移動します。