Linuxでは、フォルダを作成すると、対応するiノードに2つのハードリンクが自動的に作成されます。 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
内のfolder
と.
の両方のiノード番号は同じです(-i
オプションで表示)。
とにかくこの特別な.
ハードリンクを削除しますか?
それは実験と好奇心のためだけです。また、答えは..
特殊ファイルに適用できると思いますよく。
私はrm
人を調べようとしましたが、それを行う方法が見つかりませんでした。 .
を削除しようとすると、次のようになります。
rm: "。"および「..」は削除できません
私はこれらのものがどのように機能するのかについて本当に興味がありますので、この件についてあまり冗長にしないでください。
編集:多分私は私の投稿が明確ではなかったかもしれませんが、.
ファイルの原因となる根本的なメカニズムとそれらを削除できない理由を理解したいと思います。
POSIX標準ではハードリンクが2つ未満のフォルダーが許可されていないことがわかっていますが、実際には理由がわかりません。とにかくそれが可能かどうか知りたいと思います。
技術的には、少なくとも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 .
を使用してこのテストを実行しましたが、- BowlOfRed のおかげでディレクトリのiノード(hugeが削除されます) for pointing this out )、これは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
ディレクトリが完全に削除されます(ディレクトリiノードがなくなっているため、復元するものはありません)。
これらすべては、.
が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>?
これにより、.
ディレクトリエントリが再作成されます。
このディレクトリエントリを削除する方法はありません。 .
エントリは「このディレクトリ」を意味し、..
エントリは、「このディレクトリの親ディレクトリ」を意味します。これらは実際にはハードリンクではなく、ディレクトリ構造が作成/表示される方法です。
nix 6ソースコードに関するライオンズノートで説明したように、初期のUnixにはディスクファイルがあり、ファイルとディレクトリの両方がディスク上でiノード構造によって表されていました。ファイルの内容がディレクトリであることを示す特別なビットがありました。各iノードには、ファイルがどのディレクトリにあるかを知ることができる、それを所有するiノードへのリンクがありました。例外は、それ自体を所有する「/」ディレクトリでした。コンテンツへのリンクもありました。 iノードにコンテンツがない場合は、フリーリストに戻すことができます。ディレクトリは祝福されたファイルにすぎなかったため、空のディレクトリであっても、ガベージコレクションの対象とならないようにコンテンツを含める必要がありました。したがって、..は親iノードと。へのiノードのリンクでした。ディレクトリがまだ使用可能であることを示すためにありました。 rmdir(unlinkを呼び出すことにより)は削除できます。他にコンテンツがなく、参照がなくなったときにiノードが空きリストに移動する場合は、ディレクトリ。
'possible duplicate of' post の回答にあるように、POSIX標準では、rmdirが現在のディレクトリを削除しようとすると失敗することを指定しています。
何を構築しても、基盤が必要です。 「ここ」と言わずに相対パスを定義するのは難しい。したがって、「。」 「ここ」と定義されています。
また、「ドット」と「ドットドット」を削除できます。それらを定義しない独自のOSを作成してください。 Unix(およびMac OSXの拡張)、Linux、さらにはMS DOSとWindowsでさえ、すべてドットとドットドットを使用しています。
TL; DR-「ドット」はOSの定義に含まれます。