Linux下高效資料恢複軟體extundelete應用實戰,linuxextundelete
推薦:10年技術力作:《高效能Linux伺服器構建實戰Ⅱ》全網發行,附試讀章節和全書執行個體源碼下載!
作為一名營運人員,保證資料的安全是根本職責,所以在維護系統的時候,要慎之又慎,但是有時難免會出現資料被誤刪除的情況,在這個時候改如何快速、有效地恢複資料呢?本文我們就來介紹一下Linux系統下常用的幾個資料恢複工具。
一、如何使用“rm -rf”命令
在Linux系統下,通過命令“rm -rf”可以將任何資料直接從硬碟刪除,並且沒有任何提示,同時Linux下也沒有與Windows下資源回收筒類似的功能,也就意味著,資料在刪除後通過常規的手段是無法恢複的,因此使用這個命令要非常謹慎。在使用rm命令的時候,比較穩妥的方法是把命令參數放到後面,這樣有一個提醒的作用。其實還有一個方法,那就是將要刪除的東西通過mv命令移動到系統下的/tmp目錄下,然後寫個指令碼定期執行清除操作,這樣做可以在一定程度上降低誤刪除資料的危險性。
其實保證資料安全最好的方法是做好備份,雖然備份不是萬能的,但是沒有備份是萬萬不行的。任何資料恢複工具都有一定局限性,都不能保證完整地恢複出所有資料,因此,把備份作為核心,把資料恢複工具作為輔助是營運人員必須堅持的一個準則。
二、extundelete與ext3grep的異同
在Linux下,基於開源的資料恢複工具有很多,常見的有debugfs、R-Linux、ext3grep、extundelete等,比較常用的有ext3grep和extundelete,這兩個工具的恢複原理基本一樣,只是extundelete功能更加強大,本文重點介紹extundelete的使用。
三、extundelete的恢複原理
在介紹使用extundelete進行恢複資料之前,簡單介紹下關於inode的知識。在Linux下可以通過“ls –id”命令來查看某個檔案或者目錄的inode值,例如查看根目錄的inode值,可以輸入:
[root@cloud1 ~]# ls -id /
2 /
由此可知,根目錄的inode值為2。
在利用extundelete恢複檔案時並不依賴特定檔案格式,首先extundelete會通過檔案系統的inode資訊(根目錄的inode一般為2)來獲得當前檔案系統下所有檔案的資訊,包括存在的和已經刪除的檔案,這些資訊包括檔案名稱和inode。然後利用inode資訊結合日誌去查詢該inode所在的block位置,包括直接塊,間接塊等資訊。最後利用dd命令將這些資訊備份出來,從而恢複資料檔案。
四、 安裝extundelete
extundelete的官方網站是http://extundelete.sourceforge.net/ ,其目前的穩定版本是extundelete-0.2.4。,在安裝extundelete之前需要安裝e2fsprogs和e2fsprogs-libs兩個依賴包。
e2fsprogs和e2fsprogs-libs安裝非常簡單,這裡不做介紹。下面是extundelete的編譯安裝過程:
[root@cloud1 app]#tar jxvf extundelete-0.2.4.tar.bz2
[root@cloud1 app]#cd extundelete-0.2.4
[root@cloud1 extundelete-0.2.4]#./configure
[root@cloud1 extundelete-0.2.4]#make
[root@cloud1 extundelete-0.2.4]#make install
成功安裝extundelete後,會在系統中產生一個extundelete可執行檔。extundelete的使用非常簡單,讀者可以通過“extundelete --help”獲得此軟體的使用方法。
五、extundelete用法詳解
extundelete安裝完成後,就可以執行資料恢複操作了,本節詳細介紹下extundelete每個參數的含義。extundelete用法如下:
extundelete --help
命令格式:
1
extundelete [options] [action] device-file
其中參數(options)有:
--version, -[vV],顯示軟體版本號碼。
--help,顯示軟體協助資訊。
--superblock,顯示超級塊資訊。
--journal,顯示日誌資訊。
--after dtime,時間參數,表示在某段時間之後被刪的檔案或目錄。
--before dtime,時間參數,表示在某段時間之前被刪的檔案或目錄。
動作(action)有:
--inode ino,顯示節點“ino”的資訊。
--block blk,顯示資料區塊“blk”的資訊。
--restore-inode ino[,ino,...],恢複命令參數,表示恢複節點“ino”的檔案,恢複的檔案會自動放在目前的目錄下的RESTORED_FILES檔案夾中,使用節點編號作為副檔名。
--restore-file 'path',恢複命令參數,表示將恢複指定路徑的檔案,並把恢複的檔案放在目前的目錄下的RECOVERED_FILES目錄中。
--restore-files 'path',恢複命令參數,表示將恢複在路徑中已列出的所有檔案。
--restore-all,恢複命令參數,表示將嘗試恢複所有目錄和檔案。
-j journal,表示從已經命名的檔案中讀取擴充日誌。
-b blocknumber,表示使用之前備份的超級塊來開啟檔案系統,一般用於查看現有超級塊是不是當前所要的檔案。
-B blocksize,表示使用資料區塊大小來開啟檔案系統,一般用於查看已經知道大小的檔案。
六、實戰:extundelete恢複資料的過程
在資料被誤刪除後,第一時間要做的是卸載被刪除資料所在的磁碟或磁碟分割,如果是系統根分區的資料遭到誤刪除,就需要將系統進入單使用者,並且將根分區以唯讀模式掛載。這樣做的原因很簡單,因為將檔案刪除後,僅僅是將檔案的inode結點中的扇區指標清零,實際檔案還儲存在磁碟上,如果磁碟以讀寫入模式掛載,這些已刪除的檔案的資料區塊就可能被作業系統重新分配出去,在這些資料區塊被新的資料覆蓋後,這些資料就真的丟失了,恢複工具也回力無天。所以,以唯讀模式掛載磁碟可以盡量降低資料區塊中資料被覆蓋的風險,以提高恢複資料成功的比率。
6.1通過extundelete恢複單個檔案
1.類比資料誤刪除環境
在示範通過extundelete恢複資料之前,我們首先要類比一個資料誤刪除環境,這裡我們以ext3檔案系統為例,在ext4檔案系統下的恢複方式與此完全一樣。簡單的類比操作過程如下:
[root@cloud1 ~]#mkdir /data
[root@cloud1 ~]#mkfs.ext3 /dev/sdc1
[root@cloud1 ~]#mount /dev/sdc1 /data
[root@cloud1 ~]# cp /etc/passwd /data
[root@cloud1 ~]# cp -r /app/ganglia-3.4.0 /data
[root@cloud1 ~]# mkdir /data/test
[root@cloud1 ~]# echo "extundelete test" > /data/test/mytest.txt
[root@cloud1 ~]#cd /data
[root@cloud1 data]# md5sum passwd
0715baf8f17a6c51be63b1c5c0fbe8c5 passwd
[root@cloud1 data]# md5sum test/mytest.txt
eb42e4b3f953ce00e78e11bf50652a80 test/mytest.txt
[root@cloud1 data]# rm -rf /data/*
2.卸載磁碟分割
在將資料誤刪除後,立刻需要做的就是卸載這塊磁碟分割:
[root@cloud1 data]#cd /mnt
[root@cloud1 mnt]# umount /data
3.查詢可恢複的資料資訊
通過extundelete命令可以查詢/dev/sdc1分區可恢複的資料資訊:
[root@cloud1 /]# extundelete /dev/sdc1 --inode 2
......
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11 Deleted
passwd 49153 Deleted
test 425985 Deleted
ganglia-3.4.0 245761 Deleted
根據上面的輸出,標記為Deleted狀態的是已經刪除的檔案或目錄。同時還可以看到每個已刪除檔案的inode值,接下來就可以恢複檔案了。
4.恢複單個檔案
執行如下命令開始恢複檔案:
[root@cloud1 /]# extundelete /dev/sdc1 --restore-file passwd
Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 54 descriptors loaded.
Successfully restored file passwd
[root@cloud1 /]# cd RECOVERED_FILES/
[root@cloud1 RECOVERED_FILES]# ls
passwd
[root@cloud1 RECOVERED_FILES]# md5sum passwd
0715baf8f17a6c51be63b1c5c0fbe8c5 passwd
extundelete恢複單個檔案的參數是“--restore-file”,這裡需要注意的是,“--restore-file”後面指定的是恢複檔案路徑,這個路徑是檔案的相對路徑。相對路徑是相對於原來檔案的儲存路徑而言的,比如,原來檔案的儲存路徑是/data/passwd,那麼在參數後面直接指定passwd檔案即可,如果原來檔案的儲存路徑是/data/test/mytest.txt,那麼在參數後面通過“test/mytest.txt”指定即可。
在檔案恢複成功後,extundelete命令預設會在執行命令的目前的目錄下建立一個RECOVERED_FILES目錄,此目錄用於存放恢複出來的檔案,所以執行extundelete命令的目前的目錄必須是可寫的。
根據上面的輸出,通過md5sum命令校正,校正碼與之前的完全一致,表明檔案恢複成功。
6.2通過extundelete恢複單個目錄
extundelete除了支援恢複單個檔案,也支援恢複單個目錄,在需要恢複目錄時,通過 “--restore-directory”選項即可恢複指定目錄的所有資料。
繼續在上面類比的誤刪除資料環境下操作,現在要恢複/data目錄下的ganglia-3.4.0檔案夾,操作如下:
[root@cloud1 mnt]# extundelete /dev/sdc1 --restore-directory /ganglia-3.4.0
Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory /ganglia-3.4.0 ...
781 recoverable inodes found.
Looking through the directory structure for deleted files ...
4 recoverable inodes still lost.
[root@cloud1 mnt]# ls
RECOVERED_FILES
[root@cloud1 mnt]# cd RECOVERED_FILES/
[root@cloud1 RECOVERED_FILES]# ls
ganglia-3.4.0
可以看到之前刪除的目錄ganglia-3.4.0已經成功恢複了,進入這個目錄檢查發現:所有檔案內容和大小都正常。
6.3 通過extundelete恢複所有誤刪除資料
當需要恢複的資料較多時,一個個地指定檔案或目錄將是一個非常繁重和耗時的工作,不過,extundelete考慮到了這點,此時可以通過“--restore-all”選項來恢複所有被刪除的檔案或檔案夾。
仍然在上面類比的誤刪除資料環境下操作,現在要恢複/data目錄下所有資料,操作過程如下:
[root@cloud1 mnt]# extundelete /dev/sdc1 --restore-all
Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory / ...
781 recoverable inodes found.
Looking through the directory structure for deleted files ...
0 recoverable inodes still lost.
[root@cloud1 mnt]# ls
RECOVERED_FILES
[root@cloud1 mnt]# cd RECOVERED_FILES/
[root@cloud1 RECOVERED_FILES]# ls
ganglia-3.4.0 passwd test
[root@cloud1 RECOVERED_FILES]# du -sh /mnt/RECOVERED_FILES/*
15M /mnt/RECOVERED_FILES/ganglia-3.4.0
4.0K /mnt/RECOVERED_FILES/passwd
8.0K /mnt/RECOVERED_FILES/test
可以看到所有資料全部完整地恢複了。
6.4通過extundelete恢複某個時間段的資料
有時候刪除了大量的資料量,其中很多資料都是沒用的,我們僅需要恢複其中的一部分資料,此時,如果採用恢複全部資料的辦法,不但耗時,而且浪費資源,在這種情況下,就需要採用另外的一種恢複機制有選擇地恢複,extundelete提供了“—after”“和”--before“參數,可以通過指定某個時間段,進而只恢複這個時間段內的資料。
下面通過一個簡單樣本,描述下如何恢複某個時間段內的資料。
我們首先假定在/data目錄下有個剛剛建立的壓縮檔ganglia-3.4.0.tar.gz,然後刪除此檔案,接著卸載/data分區,開始恢複一小時內的檔案,操作如下:
[root@cloud1 ~]#cd /data/
[root@cloud1 data]# cp /app/ganglia-3.4.0.tar.gz /data
[root@cloud1 data]# date +%s
1379150309
[root@cloud1 data]# rm -rf ganglia-3.4.0.tar.gz
[root@cloud1 data]# cd /mnt
[root@cloud1 mnt]# umount /data
[root@cloud1 mnt]# date +%s
1379150340
[root@cloud1 mnt]# extundelete --after 1379146740 --restore-all /dev/sdc1
Only show and process deleted entries if they are deleted on or after 1379146740 and before 9223372036854775807.
Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory / ...
779 recoverable inodes found.
[root@cloud1 mnt]# cd RECOVERED_FILES/
[root@cloud1 RECOVERED_FILES]# ls
ganglia-3.4.0.tar.gz
可以看到,剛才刪除的檔案,已經成功恢複,而在/data目錄下還有很多被刪除的檔案卻沒有恢複,這就是”--after“參數控制的結果,因為/data目錄下其他檔案都是在一天之前刪除的,而我們恢複的是一個小時之內被刪除的檔案,這就是沒有恢複其他被刪除檔案的原因。
在這個操作過程中,需要注意是“--after”參數後面跟的時間是個總秒數。起算時間為“1970-01-01 00:00:00 UTC”,通過“date +%s”命令即可將目前時間轉換為總秒數,因為恢複的是一個小時之內的資料,所以“1379146740”這個值就是通過“1379150340”減去“60*60=3600”獲得的。
Linux下 怎恢複目錄
用extundelete,下載附件
編譯
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4
make
恢複資料:
mount –o remout,ro /dev/sda2 //此舉意在保護/dev/sda2的資料被覆蓋
恢複所有刪除的
src/extundelete /dev/sda2 --restore-all
根據時間恢複:假如刪除的時間大概是2013-10-8 14:30date -d " oct 8 14:30" +%s得出秒數 1381213800恢複此時間後刪除的所有檔案src/extundelete /dev/sda2 --after 1381213800 --restore-all
恢複誤刪除的檔案夾
src/extundelete /dev/sda2 --restore-directory /opt/filebox/box/18
注意!!!以上並未安裝extundelete,工作目錄一直在extundelete-0.2.4
恢複的資料在RECOVERED_FILES下
在Linux下格式化的資料恢複
在什麼作業系統下格式化並不重要,在linux下也可以格成NTFS的,主要看你在格式化後有沒有再向該分區中寫入資料,推薦你用EASYRECOVERY裡的進階恢複,可以進行不記分區格式的恢複。