被覆蓋的文件可以恢復嗎?
我說的不是恢復 已刪除的文件,而是覆蓋的文件。即通過以下方法:
# move mv new_file old_file # copy cp new_file old_file # edit vi existing_file > D > i new_content > :x
假設 linux 機器上沒有安裝特殊程序,如果執行上述三個操作中的任何一個,是否可以檢索任何內容?
答案是“可能是的,但這取決於文件系統類型和時間”。
這三個範例都不會覆蓋 old_file 或 existing_file 的物理數據塊,除非是偶然的。
mv new_file old_file
. 這將取消連結 old_file。如果有指向 old_file 的其他硬連結,則這些剩餘連結中的塊將保持不變。否則,這些塊通常(取決於文件系統類型)將被放置在空閒列表中。然後,如果mv
需要複製(而不是僅僅移動目錄條目),新塊將被分配為mv
寫入。這些新分配的塊可能與剛剛釋放的塊相同,也可能不同。在像UFS這樣的文件系統上,如果可能,從與創建文件的目錄相同的柱面組分配塊。因此,從目錄中取消連結文件並在同一目錄中創建文件將有可能被重新使用 (並覆蓋)一些剛剛釋放的相同塊。這就是為什麼對意外刪除文件的人的標準建議是,在有人可以嘗試文件恢復之前,不要將任何新數據寫入其目錄樹中的文件(最好不要寫入整個文件系統)。
cp new_file old_file
將執行以下操作(您可以使用strace
查看系統呼叫):打開(“舊文件”,O_WRONLY|O_TRUNC)= 4
O_TRUNC 標誌將導致所有數據塊被釋放,就像
mv
上面所做的那樣。如上所述,它們通常會被添加到空閒列表中,並且可能會或可能不會被cp
命令完成的後續寫入重用。
vi existing_file
. 如果vi
is 實際上vim
,該:x
命令執行以下操作:unlink("existing_file~") = -1 ENOENT (沒有這樣的文件或目錄)
重命名(“現有文件”,“現有文件〜”)= 0
打開(“現有文件”,O_WRONLY|O_CREAT|O_TRUNC,0664)= 3
所以它甚至不會刪除舊數據;數據保存在備份文件中。
在 FreeBSD 上,
vi
doesopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
將具有與上述相同的語義cp
。無需特殊程序即可恢復部分或全部數據;您只需要
grep
和dd
,並訪問原始設備。對於小文本文件,您連結到的問題中@Steven D
grep
的答案中的單個命令是最簡單的方法:grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
但是對於可能位於多個非連續塊中的較大文件,我這樣做:
grep -a -b "text in the deleted file" /dev/sda1 13813610612:this is some text in the deleted file
這將為您提供匹配行的字節偏移量。遵循一系列
dd
命令,從dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
您還想在該塊之前和之後閱讀一些塊。在 UFS 上,文件塊通常為 8KB,並且通常被相當連續地分配,單個文件的塊與來自其他文件或空閒空間的 8KB 塊交替交錯。UFS 上文件的尾部最多為 7 個 1KB 片段,這些片段可能是連續的,也可能不是連續的。
當然,在壓縮或加密數據的文件系統上,恢復可能不會這麼簡單。
Unix 中實際上很少有實用程序會覆蓋現有文件的數據塊。想到的一個是
dd conv=notrunc
。另一個是shred
.