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

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

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>?

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

おすすめ記事