運維日記002-extundelete恢復Linux系統誤刪除的文件

運維日記002-extundelete恢復Linux系統誤刪除的文件

關於extundelete

extundelete是一個用來恢復ext3/ext4分區的文件的工具。它會利用分區中的日誌信息嘗試恢復被刪除的文件。但是,並非每個被刪除的文件都能確保被恢復,所以養成良好的備份習慣是非常重要的。

extundelete恢復文件的原理

在介紹使用extundelete進行恢復數據之前,簡單介紹下關於inode的知識。在Linux下可以通過“ls –id”命令來查看某個文件或者目錄的inode值,例如查看根目錄的inode值,可以輸入:

# ls -id  / 

可以看到,根目錄的inode值爲2.

在恢復文件時,extundelete會通過文件系統的inode信息(根目錄的inode一般爲2)來獲得當前文件系統下所有文件的信息,包括存在的和已經刪除的文件,這些信息包括文件名和inode。然後利用inode信息結合日誌去查詢該inode所在的block位置,包括直接塊,間接塊等信息。最後利用dd命令將這些信息備份出來,從而恢復數據文件。

下載與安裝

首先請注意,切勿將extundelete安裝到你誤刪除的文件所在的硬盤,這樣會有一定機率將需要恢復的數據徹底覆蓋。請將待恢復文件的分區掛載爲只讀。如:

#mount -o remount,ro /dev/sda2

目前最新的版本是2013年1月發佈的版本0.2.4,請到以下網址下載源代碼:
https://sourceforge.net/projects/extundelete/files/latest/download

安裝過程

#tar jvxf extundelete-0.2.4.tar.bz2 
#cd extundelete-0.2.4
#./configure
#make
#make install

configure過程中可能會提示缺少g++或者e2fsprogs-devel等包,yum install安裝即可。安裝完成後,可執行程序默認安裝在/usr/local/bin/extundelete位置

用法詳解

命令格式:
extundelete [options] [action] device-file

其中選項(options)主要有:
–version, -[vV],顯示軟件版本號。
–help,顯示軟件幫助信息。
–superblock,顯示超級塊信息。
–journal,顯示日誌信息。
–after dtime,時間參數,表示在某段時間之後被刪的文件或目錄。
–before dtime,時間參數,表示在某段時間之前被刪的文件或目錄。

動作(action)主要有:
–inode #,顯示節點“#”的信息。
–block #,顯示數據塊“#”的信息。
–restore-inode #[,#,…],恢復命令參數,表示恢復節點“#”的文件,恢復的文件會自動放在當前目錄下的RESTORED_FILES文件夾中,使用節點編號作爲擴展名。
–restore-file ‘path’,恢復命令參數,表示將恢復指定路徑的文件,並把恢復的文件放在當前目錄下的RECOVERED_FILES目錄中。
–restore-files ‘path’,恢復命令參數,表示將恢復在路徑中已列出的所有文件。
–restore-all,恢復命令參數,表示將嘗試恢復所有目錄和文件。
-j journal,表示從已經命名的文件中讀取擴展日誌。
-b blocknumber,表示使用之前備份的超級塊來打開文件系統,一般用於查看現有超級塊是不是當前所要的文件。
-B blocksize,表示使用數據塊大小來打開文件系統,一般用於查看已經知道大小的文件。

實戰

例如在sdb1分區創建一些文件和文件夾,然後用rm -rf刪除之,我們嘗試恢復一下,恢復後的文件保存在/tmp下:

#mount /dev/sdb1 /mnt/data
#cp /etc/fstab /mnt/data
#cp /etc/passwd /mnt/data
#vim /mnt/data/a.txt
#mkdir /mnt/data/b
#cd /mnt/data
#cp a.txt b/
#cd b
#mkdir c
#cd ..
#rm -rf fstab passwd a.txt b
#mount -o remount,ro /dev/sdb1
#cd /tmp
#extundelete /dev/sdb1 --inode 2

從輸出的信息可以看到被刪除的文件及其inode號。例如inode12和13號兩個節點對應的文件(分別爲fstab和passwd)被刪除,則通過以下命令恢復之:

#extundelete /dev/sdb1 --restore-inode 12
#extundelete /dev/sdb1 --restore-inode 13

恢復後的文件存放在當前目錄的RECOVERED_FILES目錄下,命名爲file.#(#爲inode號)。然後用diff對比一下恢復後的文件和原文件是否一樣:

#diff /etc/fstab file.12
#diff /etc/passwd file.13

沒有輸出,則表示恢復的文件和原文件是一模一樣的。也可以通過文件名或者目錄名來恢復文件或整個目錄:

# extundelete /dev/sdb1 --restore-file a.txt
# extundelete /dev/sdb1 --restore-directory b

也可以一次性的恢復分區內所有被刪除的文件

# extundelete /dev/sdb1 --restore-all

在實驗中作者發現,extundelete在恢復一些空白文件夾或者零字節文件時會失敗。

【參考文獻】
http://bbs.51cto.com/thread-1128928-1.html
http://extundelete.sourceforge.net/
http://extundelete.sourceforge.net/options.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章