小记Linux/UNIX下错删文件恢复

711 查看

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

一个月前,我的洁癖犯了,想执行find . -name "*~" -exec rm {} \;清下某目录下由vim生成的~文件,不料漏打了~,把一些文件删掉了...好在有用git做版本控制,即使.git/index也被删没了,但也可以通过git reset恢复,之后再用git恢复版本管理中的其他被删文件即可。不料今天二月二号,我又犯二了,被做死历史find . -name "*" -exec rm {} \;坑了一把...这次被删的还有不少特意不放在版本控制的配置文件,这次不得不做文件恢复了。

最简单的情况是被删除的文件被某个进程打开,这个时候可以通过该进程在/proc下的文件描述符来恢复。首先由lsof找到打开文件的进程,有了PIDFD之后,就可以执行以下命令恢复文件:

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

不幸的是,我删的文件并没有被打开...所以不能用这种方式了。df -T查到被删文件所在的文件系统是ext4,于是可以试试ext的文件恢复方法。

ext3/ext4文件系统的恢复可以用extundelete,例如恢复被误删的目录可以用:

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

恢复被误删的文件可以用:

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

此外也可以用debugfs工具,相较extundeletedebugfs适用于ext2/ext3/ext4文件系统

debugfs -w /dev/<device>

debugfs中用lsdel查找最近的删除操作,找到被删文件的inode:

debugfs: lsdel

接下来当然还是可以用extundelete

extundelete --restore-inode <inode>

不过也可以用debugfs

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恢复的文件