開いたファイルハンドルが死んだ後、どこに行きますか?

開いたファイルハンドルが死んだ後、どこに行きますか?

ファイルハンドルが開いている間に削除されたファイルはどうなりますか?

動画ファイルの再生中に削除できることがわかったので、これについて疑問に思いました。プレイヤーそして最後まで再生されます。どこからデータをインポートしますか?まだハードドライブから出ていますか?ファイルを削除するとRAMにコピーされますか?

まだハードドライブにある場合、プログラムの実行中にデフォルトで割り当てられていない領域からデータを読み取ってファイルシステムを埋めるとどうなりますか? RAMにバッファリングされている場合、バッファをフラッシュするとどうなりますか?

ファイルがNFS共有にある場合はどうなりますか?サーバーに保存されますか? (これはセキュリティリスクではありませんか?開いているリモートファイルハンドルが多すぎるとDoSが発生する可能性がありますか?)

何かをすると、lsof -n |grep '(deleted)'時には興味深い結果が出ることがあります。共有ライブラリファイルを交換するパッケージをアップグレードすると、そのライブラリを使用するプログラムを実行すると、何も変更されていないかのように使用できます。

ボーナス質問:この状況でデータを再度有効にする方法はありますか?

答え1

もはやinodeへのハードリンクはありませんが、inodeはディスクに残ります。ファイル記述子が閉じると削除されます。それまでは、ファイル名/ハードリンク操作が必要ない限り、ファイルを正常に変更できます。

debugfs同様のツールを使用してinodeの内容を復元できます。

答え2

カーネルは、inodeへの参照の参照計算を実行します。私の答えを見るファイル記述子を閉じるとどうなりますか?

開いたファイルを削除することは、ファイルを開くよりも効率的なDOSメカニズムではありません。開かれたファイルは、ulimitそのようなDOSの試みに対してある程度の保護を提供します。削除するかどうかに関係なく、開いているすべてのファイルで機能します。

答え3

ファイルへのすべての参照が消えた場合にのみ、ファイルシステムからファイルが削除されます。名前とオープンハンドルの両方が参照と見なされます。ファイルがプログラムで開かれている間は削除されません。ただし、ほとんどのシステムではファイル名を再作成できません。

データはまだドライブにありますが、ファイル内のリンク数はゼロで表されます。システムがクラッシュした場合は、次にfsckを再起動するときにデータを削除する必要があることがわかります。これにより、削除されていないファイルよりもサービス拒否が発生しなくなります。

私が知っている限り、既存のLinuxシステムからファイルへのリンクを再作成することはできませんが(debugfsまたは同様の方法を使用してファイルシステムドライバをバイパスしない限り)、内容を簡単に復元できます。cat /proc/12345/fd/42ここで、12345は開かれたプロセスIDです。ファイル42はファイル記述子である。

NFS を使用してクライアントにまだ開いているファイルを削除すると、NFS サーバーはサーバー上のファイルの名前を変更しますが、すべてのクライアントがファイルを解放するまで削除しません。私の経験によると、新しい名前はありますが、.nfs…その名前がす​​べてのNFS実装で同じかどうかはわかりません。

関連情報