一個(gè)同事不小心使用rm -rf命令誤刪了自己的代碼捷绒,這意味著一個(gè)月的工作丟失了(一個(gè)月沒(méi)有備份過(guò)代碼岸晦,看來(lái)他以前一定沒(méi)經(jīng)歷計(jì)算機(jī)崩潰的災(zāi)難)。我們知道rm命令無(wú)法撤銷褪秀,那么有沒(méi)有辦法恢復(fù)這個(gè)被刪除的目錄以及其中的全部文件呢空猜?
在網(wǎng)上搜索了一下绽慈,找到一個(gè)名為ext3grep的工具恨旱,以及它的作者的一篇文章(見(jiàn)參考文檔)。在這個(gè)工具出現(xiàn)以前坝疼,恢復(fù)ext3文件系統(tǒng)中被刪除的數(shù)據(jù)是不可能的搜贤。因?yàn)閑xt3文件系統(tǒng)不同于ext2文件系統(tǒng),它在刪除一個(gè)文件后钝凶,會(huì)把文件inode結(jié)點(diǎn)中扇區(qū)指針清為0仪芒,而這讓文件恢復(fù)看起來(lái)不太可能。不過(guò)耕陷,正如ext3grep工具作者所說(shuō)的掂名,因?yàn)閑xt3是一個(gè)日志型的文件系統(tǒng),通過(guò)分析日志信息哟沫,有很大的可能重新解析出塊指針饺蔑,從而恢復(fù)出目錄和文件。
以下是Easwy恢復(fù)文件所采用的步驟南用,希望對(duì)大家有幫助膀钠。
[ 卸載被誤刪除文件所在的分區(qū)掏湾,或以只讀方式mount ]
當(dāng)你發(fā)現(xiàn)你誤刪除了文件后裹虫,要做的第一件事是馬上卸載被誤刪除文件所在的分區(qū),或者以只讀的方式來(lái)掛載該分區(qū)融击。原因大家都很清楚筑公,文件被刪除后,文件中的數(shù)據(jù)還存在磁盤上尊浪,除非存放這些數(shù)據(jù)的數(shù)據(jù)塊又被操作系統(tǒng)分配出去了匣屡。我們這一步就是盡量降低數(shù)據(jù)塊中數(shù)據(jù)被覆蓋的風(fēng)險(xiǎn),以提高恢復(fù)數(shù)據(jù)成功的比率拇涤。
如果被誤刪的文件在根分區(qū)捣作,那么你最好重啟計(jì)算機(jī),進(jìn)入單用戶模式鹅士,以只讀的方式掛載根分區(qū)券躁,然后再進(jìn)行恢復(fù)。要進(jìn)行單用戶模式掉盅,請(qǐng)看Grub中進(jìn)入單用戶模式的方法也拜。
進(jìn)入單用戶模式后,根分區(qū)還是以讀寫方式mount的趾痘,用下面的命令慢哈,把掛載方式由讀寫(rw)改為只讀(ro):
mount -o ro,remount /
如果被刪除的文件不是根分區(qū),也可以用unmount的方式將該分區(qū)卸載永票。假設(shè)文件在分區(qū)/dev/sda3中卵贱,該分區(qū)掛載到/home滥沫,那么我們用下面的命令來(lái)卸載:
umount /dev/sda3
或者命令:
umount /home
當(dāng)然,在卸載前要保證沒(méi)有程序在訪問(wèn)該分區(qū)键俱,否則卸載會(huì)失敗佣谐。所以,Easwy一般推薦進(jìn)入單用戶模式來(lái)恢復(fù)文件方妖。
[ 安裝ext3grep工具 ]
恢復(fù)的第一步當(dāng)然是安裝ext3grep工具狭魂。對(duì)于Debian/Ubuntu用戶來(lái)說(shuō),安裝ext3grep工具非常簡(jiǎn)單党觅,只需要執(zhí)行下面的命令:
aptitude install ext3grep
不過(guò)Easwy公司所使用的Linux版本是Centos雌澄,所以需要自己手工編譯ext3grep工具,其實(shí)這也很簡(jiǎn)單杯瞻,首先到ext3grep主頁(yè)上下載它的源代碼镐牺,然后用下面的命令解壓/編譯/安裝這個(gè)工具。
tar zxf ext3grep-0.10.1.tar.gz
cd /home/easwy/ext3grep-0.10.1
./configure
make
make install
注:在網(wǎng)上搜了一下魁莉,ext3grep也有rpm包可以下載睬涧,比如,RHEL/CentOS的RPM包可以在這里下載旗唁。其它Linux發(fā)行版的RPM也可以在rpmfind.net上找到畦浓。
Easwy前面說(shuō)過(guò),發(fā)現(xiàn)誤刪除后检疫,要卸載掉該分區(qū)讶请,或者進(jìn)入單用戶模式。所以最好在另外一臺(tái)計(jì)算機(jī)上來(lái)編譯或安裝這個(gè)工具屎媳,然后把ext3grep這個(gè)可執(zhí)行文件拷貝到U盤中再進(jìn)行恢復(fù)夺溢。這也正是Easwy所用的方法,因?yàn)橥碌奈募『迷诟謪^(qū)中烛谊。如果你也是這種情況风响,那么在用RPM包安裝時(shí),則需要把RPM包安裝到你你指定的目錄中丹禀,然后再把它拷貝到U盤中状勤。
U盤里只需要拷貝ext3grep一個(gè)文件即可,它不需要?jiǎng)討B(tài)加載庫(kù)就可以執(zhí)行湃崩。接下來(lái)把U盤插到待恢復(fù)的電腦上荧降,用下面的命令加載:
mount -t vfat /dev/sdb1 /mnt
把上面的設(shè)備號(hào)和安裝點(diǎn)換成你自己的。如果你的設(shè)備文件還不存在的話(這也剛好是Easwy的情況)攒读,用mknod命令創(chuàng)建一下吧朵诫。
現(xiàn)在,我們可以開始文件恢復(fù)了薄扁。
[ 恢復(fù)文件 ]
在開始恢復(fù)前剪返,選擇一個(gè)目錄來(lái)存放被恢復(fù)的文件废累。ext3grep程序會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為RESTORED_FILES的目錄來(lái)存放被恢復(fù)的文件。因此在運(yùn)行ext3grep命令前脱盲,先要切換到一個(gè)你可讀寫的目錄中邑滨。
對(duì)Easwy來(lái)講,因?yàn)檫M(jìn)入了單用戶模式钱反,并且將根分區(qū)設(shè)成了只讀掖看,那么只能把恢復(fù)出來(lái)的文件放在U盤中了。因此面哥,先cd /mnt進(jìn)入U(xiǎn)盤目錄哎壳。
如果你有幸記得你誤刪除的文件名及其路徑的話,就可以直接用下面的命令進(jìn)行恢復(fù)了:
ext3grep /dev/your-device --restore-file path/to/your/file/filename
需要注意的是尚卫,上面的文件路徑归榕,是在該分區(qū)上文件路徑。假設(shè)我們要恢復(fù)/dev/sda3分區(qū)上文件吱涉,這個(gè)分區(qū)原來(lái)的安裝點(diǎn)是/home刹泄,現(xiàn)在想恢復(fù)文件/home/easwy/vi/tips.xml,那么輸入的命令應(yīng)該是:
ext3grep /dev/sda3 --restore-file easwy/vi/tips.xml
如果你忘記了文件名怎爵,或者你誤刪除的是一個(gè)目錄而你無(wú)法記全該目錄中的文件特石,你可以先用下面的命令查詢一下文件名:
ext3grep /dev/sda3 --dump-names | tee filename.txt
上面的命令把ext3grep命令的輸出記錄到文件filename.txt中,你可以慢慢查看疙咸,或者使用grep命令過(guò)濾出你需要的信息县匠。
當(dāng)你知道了目錄/文件的信息后,就可以用上面說(shuō)的命令進(jìn)行恢復(fù)了撒轮。
在ext3grep命令中有一個(gè)–depth參數(shù),應(yīng)該是用來(lái)恢復(fù)目錄以及其中的所有子目錄和文件的贼穆,不過(guò)Easwy用這個(gè)參數(shù)無(wú)法恢復(fù)出任何文件题山,只好采用笨辦法,寫了個(gè)腳本故痊,一個(gè)個(gè)文件的恢復(fù)顶瞳。
經(jīng)過(guò)幾個(gè)小時(shí)的折磨(中間走了一些彎路),同事的文件終于恢復(fù)成功了愕秫!