GNU/Linux >> Linux の 問題 >  >> Linux

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

. を削除することは技術的に可能です 、少なくとも 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 がフリー リストに移動する場合は、ディレクトリに移動します。


Linux
  1. Linux でディレクトリの空きディスク領域をプログラムで取得する方法

  2. Git for Windows で Git Bash のディレクトリを変更するにはどうすればよいですか?

  3. ARM ベースのシステムで RAM のデータ破損をテストするにはどうすればよいですか?

  1. Linuxターミナルでディレクトリを開いたり閉じたりする方法

  2. csv の二重引用符を削除する方法

  3. GOPATH の最初のディレクトリの bin サブディレクトリを PATH に追加するにはどうすればよいですか?

  1. 自分のディレクトリにR3.3.1をインストールする方法は?

  2. ubuntuでターミナルからディレクトリを検索する方法

  3. 検索対象のフォルダーを除外するにはどうすればよいですか?