指定された順序で次のコマンドを実行しました。
$ln a b
$ls -i a b
523669 a 523669 b
$rm -f a
$ls -i b
523669 b
私はこのテストでコマンドがrm
実際にファイル名(a
このテストでは)だけを削除し、ファイルは削除しないと結論付けました。なぜなら、inodeがまだ存在し、他のファイル名(b
)で検索できるからです。
私の質問は、ファイルがファイル名にのみハードリンクされている場合、そのファイルrm
で実行されたときに実際のファイル(つまりinode)が完全に削除されるのですか?そうでない場合は、ファイル名なしでinodeだけでファイルinodeを検索できますか?
ベストアンサー1
inodeを介してファイルを開こうとすると、すべてのディレクトリナビゲーションがバイパスされます。ファイルの権限とファイルを指すディレクトリを決定するには、ディレクトリの巡回が必要です。ディレクトリナビゲーションがないと、カーネルは呼び出しプロセスがファイルにアクセスできるかどうかを判断できません。
一つあるファイル記述子からファイルリンクを生成できるように、Linuxカーネルにパッチを適用することをお勧めします。。それこれを安全に実装することは非常に難しいので拒否されました。。
Linuxでは(おそらく同じ理由で他のUNIXバリアントでも)削除されたファイルへのリンクを作成できないため、ファイルに名前がない場合は名前を再追加できません。 1削除したファイルを開いて開くことができます/proc/$pid/fd/
。
ファイルにリンクがなくなり、開かれていない場合、そのファイルは存在しなくなり、以前にそのデータが使用していたスペースをいつでも回収できます。
1 ext2 / ext3 / ext4を使用して、ファイルシステムに応じてファイルシステムのバイトを直接調整します。debugfs
これには、ファイルシステムがマウントされたデバイスへのアクセスが必要です(つまり、通常はルートのみを試すことができます)。ただし、debugfsはinodeを介してファイルにアクセスできますが、ファイルが削除されても役に立ちません。アプリケーションがファイルを閉じると、ファイルは実際に削除され、マウントされたファイルシステムで読み取り/書き込みモードでdebugfsを実行するのはレシピ災害です。