紹介する
最近まで、extファイルシステムでは、inodeにディレクトリエントリまたはファイル記述子がファイルを参照した回数を数える参照カウンタがあると思いました。
その後、参照カウンタはそれを参照するディレクトリエントリの数だけを計算することがわかりました。これを偽造するには、ビデオファイルの参照カウントを読み取る方法を使用しますls -l
。期待どおりに追加のハードリンクを作成しなかったので、1でした。その後、ビデオプレーヤーでビデオファイルを開き、同じコマンドを再実行しました。驚くべきことに、参照数はまだ1です。したがって、私の偽造は失敗しました。
ただし、唯一のディレクトリエントリを削除した後でもビデオを視聴し続けることはできます。大容量のビデオファイルを開いてそのディレクトリエントリを削除しても、ファイルシステムで使用可能なストレージ容量は変更されません。プレーヤーがビデオの終わりに到達し、ファイル記述子を閉じるか、プレーヤーが自己終了した場合にのみ変更されます(ビデオファイルのサイズによって)(使用されているビデオプレーヤーによって異なります)。
質問
外部ファイルシステムからファイルを解放するための正確な条件は何ですか? ext2、ext3、ext4でどのように処理されるのか疑問に思います。使用されているカーネルやOSの他の部分によって違いはありますか?
ベストアンサー1
ファイルシステムリンクカウンタとファイル記述子参照カウンタという2つのカウンタを混同しています。
ファイルシステムリンクカウンタは、ファイルシステム自体のinodeへのリンク数を計算します。 inodeはファイルメタデータを含む構造です。 ext* ファイルシステムでは、このカウンタはファイルシステム自体に保存されます。
inodeのあるリンク数を確認するために使用できます
ls -l
。また、をls -i
使用してファイルのinode番号を取得することもできます。たとえば、ファイルを倍増するリンクを使用して、ln
すべてのリンクの inode 番号が同じであることを確認します。andcoz@tseenfoo:~/refcount> ls -li total 40 2248813 -rw-r--r-- 1 andcoz users 40960 7 feb 21.34 test andcoz@tseenfoo:~/refcount> ln test test2 andcoz@tseenfoo:~/refcount> ln test test3 andcoz@tseenfoo:~/refcount> ls -li total 120 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test2 2248813 -rw-r--r-- 3 andcoz users 40960 7 feb 21.34 test3
ファイル記述子参照カウンタは、プロセスがファイルを開いた回数、より正式にはそのinodeを参照するファイル記述子の数を計算します。この情報はカーネルメモリに保存されます。
コマンドを使用して、この値のおおよその値を取得できます
fuser
。このコマンドは、ファイルが開いているすべてのプロセスを一覧表示します。単一のプロセスが同じファイルを複数回開くことができるので、フューザリストのサイズは通常、参照カウンタより小さいか等しい。andcoz@tseenfoo:~/refcount> tail -f test & [3] 4226 andcoz@tseenfoo:~/refcount> fuser test /home/andcoz/refcount/test: 4226 andcoz@tseenfoo:~/refcount> tail -f test2 & [4] 4354 andcoz@tseenfoo:~/refcount> fuser test /home/andcoz/refcount/test: 4226 4354
次の場合、ファイルはファイルシステムから削除されます。両方カウンタは0です。