Filesystems

打開的文件句柄死後去了哪裡?

  • December 22, 2020

當文件句柄對它們打開時,被刪除的文件會發生什麼?

自從我發現我可以在MPlayer中播放影片文件時刪除它並且它仍然會播放到最後,我一直想知道這一點。它從哪裡提取數據?它仍然來自硬碟驅動器嗎?刪除文件後是否將其複製到 RAM 中?

如果它仍在硬碟驅動器上,如果我在程序執行時從本質上未分配的空間讀取文件系統,會發生什麼情況?如果它緩沖在 RAM 中,如果我刷新緩衝區會發生什麼?

如果文件在 NFS 共享上會發生什麼——它是否儲存在伺服器上?(這不是一個安全風險——大量打開的遠端文件句柄的 DoS 嗎?)

有時lsof -n |grep '(deleted)'會產生有趣的結果;如果我正在升級交換共享庫文件的軟體包,那麼執行一直使用這些庫的程序仍然可以使用它們,就好像沒有任何改變一樣。

額外的問題:在這種情況下,有什麼方法可以從死者那裡取回數據嗎?

inode 仍然保留在磁碟上,儘管不再存在指向 inode 的硬連結。當文件描述符關閉時,它們將被刪除。在此之前,可以正常修改文件,除非需要文件名/硬連結的操作。

debugfs和類似的工具可用於恢復 inode 的內容。

核心對 inode 的引用進行引用計數。請參閱我對close() 文件描述符時會發生什麼的回答?.

刪除打開的文件可能並不比僅僅打開文件更有效的 DOS 機制。ulimit打開文件提供了一些針對這種 DOS 嘗試的保護。它適用於所有打開的文件,無論是否刪除。

引用自:https://unix.stackexchange.com/questions/27097