以前總是在網上看到很多人問怎么恢復 linux 分區下誤刪的文件。當時并沒有仔細關注過,真沒想到昨天這事攤我身上了。
大致說說這場悲劇的整個過程吧(為了避免一些不必要的麻煩,本文中的文件夾名和設備名都作了修改)
當時我的工作目錄是 /source/needrecovered 。
$ pwd /source/needrecovered
原本打算清空其中的一個子文件
$ rm -rf canbedeleted/*
卻把命令給打錯了。
$ rm -rf canbedeleted/ *
當時我琢磨著今天怎么刪個小文件夾這么慢呢。等我仔細看了下命令,反應過來的時候,已經太遲了。整個工作目錄被清空了
沒轍了,只能先到網上找找解決方案了,網上大致提到的方法有兩種:一種是利用 debugfs ;第二種是利用 ext3grep 。第一種方法,我嘗試了若干次都以失敗告終,第二種成功了。但是統一的是:兩種方法首先提到的都是將對該分區進行操作的應用先全部關閉,具體如下:
以下的操作盡量使用 root 操作,以提高數據恢復的成功率
#該命令用于列出操作該分區的進程 fuser -v -m /source #如果沒有很重要的進程,利用下面的命令將其全部 kill 掉 fuser -k -v -m /source
執行上面那個命令的時候,務必要將你的工作目錄切換到 /source 以外,否則你的 sshd 會被 kill 掉
這樣子可以達到兩個好處:
- 防止新的文件操作影響數據的恢復
- 方便對磁盤或者分區進行進一步的操作
- 如: mount 和 umount
接下來我們看看磁盤分區情況
$ df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda8 ext3 7.9G 6.3G 1.2G 84% /source /dev/sdb1 fuseblk 299G 266G 33G 90% /data/
需要恢復的分區是 /dev/sda8 ,掛載點是 /source 。
先將此分區卸載,并在 /data 分區建立一個用于存儲備份數據的文件夾
umount -v /source mkdir -p /data/recovery
現在輪到主角登場了,先去下載一份 ext3grep 的源碼,并安裝
cd /data/recovery #此鏈接地址以官網最新版本為準 wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz tar xfz ext3grep-0.10.2.tar.gz cd ext3grep-0.10.2 ./configure --prefix=/data/recovery make make install
接下來就進入正式的恢復工作了,先對需要恢復的磁盤進行掃描。
cd /data/recovery nohup /data/recovery/bin/ext3grep /dev/sda8 --ls --inode 2 & #建議使用 nohup 和 &,因為如果分區很大的話耗時比較長
掃描完畢后, /data/recovery 中會出現兩個分別名為 c0d2.ext3grep.stage1 和 c0d2.ext3grep.stage2 的文件。前者可以直接忽略,后者里面保存著可以被恢復備份的文件名。
由于我需要備份的文件很多,幾十G,就用下面這個命令進行全部恢復
cd /data/recovery nohup /data/recovery/ext3grep/bin/ext3grep /dev/sda8 --restore-all & #建議使用 nohup 和 &,因為如果分區很大的話耗時比較長
需要注意的是,restore-all 參數會將整個磁盤所有文件(已刪除可恢復的文件和未被刪除還存在的文件)進行恢復和備份處理,所以請確認你的存放恢復文件的分區有足夠的空間
如果僅僅是恢復幾個文件的話,建議使用 restore-file 參數
備份的文件會存放在工作目錄的名為 RESTORED_FILES 的文件夾里,本文中就是 cd /data/recovery/RESTORED_FILES
最后補充一句話:慎用 rm -rf 。