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>?
これにより、.
ディレクトリエントリが再生成されます。