web-dev-qa-db-ja.com

特別なハードリンク "。"をリンク解除(削除)する方法フォルダ用に作成されましたか?

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つ未満のフォルダーが許可されていないことがわかっていますが、実際には理由がわかりません。とにかくそれが可能かどうか知りたいと思います。

29
Fantattitude

技術的には、少なくとも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>?

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

46
Stephen Kitt

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

5
John

nix 6ソースコードに関するライオンズノートで説明したように、初期のUnixにはディスクファイルがあり、ファイルとディレクトリの両方がディスク上でiノード構造によって表されていました。ファイルの内容がディレクトリであることを示す特別なビットがありました。各iノードには、ファイルがどのディレクトリにあるかを知ることができる、それを所有するiノードへのリンクがありました。例外は、それ自体を所有する「/」ディレクトリでした。コンテンツへのリンクもありました。 iノードにコンテンツがない場合は、フリーリストに戻すことができます。ディレクトリは祝福されたファイルにすぎなかったため、空のディレクトリであっても、ガベージコレクションの対象とならないようにコンテンツを含める必要がありました。したがって、..は親iノードと。へのiノードのリンクでした。ディレクトリがまだ使用可能であることを示すためにありました。 rmdir(unlinkを呼び出すことにより)は削除できます。他にコンテンツがなく、参照がなくなったときにiノードが空きリストに移動する場合は、ディレクトリ。

2
verisimilidude

'possible duplicate of' post の回答にあるように、POSIX標準では、rmdirが現在のディレクトリを削除しようとすると失敗することを指定しています。

何を構築しても、基盤が必要です。 「ここ」と言わずに相対パスを定義するのは難しい。したがって、「。」 「ここ」と定義されています。

また、「ドット」と「ドットドット」を削除できます。それらを定義しない独自のOSを作成してください。 Unix(およびMac OSXの拡張)、Linux、さらにはMS DOSとWindowsでさえ、すべてドットとドットドットを使用しています。

TL; DR-「ドット」はOSの定義に含まれます。

0
Xalorous