前言
今天不小心把一個文件給誤刪了,因為不想花半天時間重新寫,就查找了一下Linux下恢復文件的方法。
因為是剛刪不久,文件實際的數據應該還在
首先查看系統分區
Linux:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 1968417 463571 1504846 24% / tmpfs 16384 4 16380 1% /var/lib/php5 tmpfs 16384 40 16344 1% /var/run tmpfs 131072 4 131068 1% /tmp ssl_service 262144 0 262144 0% /kssl/HRP/cache
使用系統自帶工具debugfs進行修復
打開刪除的文件所在的分區
Linux:~# debugfs debugfs 1.37 (21-Mar-2005) debugfs: open /dev/sda1
用ls -d查看剛剛刪除的文件所在的目錄
如果列表中有我們要找的文件,尖括號<>中是對應的inode號
debugfs: ls -d /root/rand-test 180331 (12) . 180225 (12) .. 180333 (16) assess 180334 (32) experiments <180451> (12) 4913 180358 (32) data <180451> (20) .1.swp 180359 (68) periodtest.sh <180337> (44) .singletest.input.swp 180451 (24) periodtest.input 180356 (828) singletest.input <180366> (32) .periodtest.input.swp <180375> (748) .singletest.input.swp <180338> (716) periodtest.input~
查看inode的日志文件
debugfs: logdump -i <180338>
Inode 180338 is at group 176, block 1441809, offset 128
Journal starts at block 3434, transaction 90549
FS block 1441809 logged at sequence 90622, journal block 3950
...
quit退出debugfs,使用dd命令進行恢復,bs為前面得到的offset,skip為前面得到的block
debugfs: quit Linux:~/rand-test# dd if=/dev/sda1 of=/root/rand-test/periodtest.input~ bs=128 count=1 skip=1441809 1+0 records in 1+0 records out 128 bytes transferred in 0.000081 seconds (1582468 bytes/sec)
遺憾的是,我要恢復的文件已經不在了
好在對於文本文件還有另一種方法,使用grep
第一步同樣是找到文件所在的分區
然后使用grep對分區進行搜索,只要你記得文檔中的某些關鍵字
grep -a -B 30 -A 150 'function checkInt() ' /dev/sda1 > tmp.txt
其中-a表示把分區看成文本形式(分區本身是二進制形式的),-B 30 -A 150表示找到搜索的內容就打印前面30行和后面150行
如果分區比較大可能需要一定的搜索時間,完成之后打開tmp.txt,你會發現在一堆亂碼中鑲嵌着你要恢復的本文
至此,大功告成,總結
使用debugfs的方法適用於所有文件,不過需要inode信息仍然存在。使用grep的方法,只需要實際的block中數據還存在即可恢復,不過只適用於文本文件。
另外,切記rm需謹慎