小記Linux/UNIX下錯刪文件恢復

原文請猛戳:
http://galoisplusplus.gitcafe.io/blog/2016/02/02/how-to-restore-deleted-file-in-linux/php

一個月前,個人潔癖犯了,想執行find . -name "*~" -exec rm {} \;清下某目錄下由vim生成的~文件,不料漏打了~,把一些文件刪掉了...好在有用git作版本控制,即便.git/index也被刪沒了,但也能夠經過git reset恢復,以後再用git恢復版本管理中的其餘被刪文件便可。不料今天二月二號,我又犯二了,被作死歷史find . -name "*" -exec rm {} \;坑了一把...此次被刪的還有很多特地不放在版本控制的配置文件,此次不得不作文件恢復了。html

最簡單的狀況是被刪除的文件被某個進程打開,這個時候能夠經過該進程在/proc下的文件描述符來恢復。首先由lsof找到打開文件的進程,有了PIDFD以後,就能夠執行如下命令恢復文件:node

cp /proc/<PID>/fd/<FD> <recovered-file>

不幸的是,我刪的文件並無被打開...因此不能用這種方式了。df -T查到被刪文件所在的文件系統是ext4,因而能夠試試ext的文件恢復方法。linux

ext3/ext4文件系統的恢復能夠用extundelete,例如恢復被誤刪的目錄能夠用:git

extundelete /dev/<device> --restore-directory <path>

恢復被誤刪的文件能夠用:github

extundelete --restore-file <path/to/deleted/file>

此外也能夠用debugfs工具,相較extundeletedebugfs適用於ext2/ext3/ext4文件系統shell

debugfs -w /dev/<device>

debugfs中用lsdel查找最近的刪除操做,找到被刪文件的inode:vim

debugfs: lsdel

接下來固然仍是能夠用extundelete工具

extundelete --restore-inode <inode>

不過也能夠用debugfspost

debugfs: dump <inode> <recovered-file>

很多資料還提到,能夠先在debugfs中用:

debugfs: logdump -i <inode>

找到如下信息

Blocks: (<block id>): <block offset>

再經過dd命令恢復文件。

不過個人問題竟也沒法經過extundeletedebugfs搞定,無奈只好用PhotoRec「黑科技」了...PhotoRec恢復後的文件名好亂,好在我還有ag這種大殺器,找到被刪的配置文件是分分鐘的事XDD

參考資料

  1. man proc

  2. Finding open files with lsof

  3. Bring back deleted files with lsof

  4. How to recover deleted file if it is still opened by some process?

  5. 身爲Arch黨天然要安利一發Archwiki:File recovery

  6. Recovering files from ext4 partition

  7. man debugfs

  8. Linux debugfs Hack: Undelete Files

  9. Linux file deleted recovery

  10. undelete a just deleted file on ext4 with extundelete

  11. Unix/Linux undelete/recover deleted files

  12. debugfs總結

  13. 恢復Ext3下被刪除的文件

  14. 這裏有一些腳本用來整理PhotoRec恢復的文件

相關文章
相關標籤/搜索