Linux 系統管理員守則中有這麼一條:“慎用 rm -rf 命令,除非你知道此命令所帶來的後果“,不過 Linux 下刪除文件並不是真實的刪除磁盤分區中的文件,而是將文件的 inode 節點中的扇區指針清除,同時釋放這些數據對應的數據塊,當釋放的數據塊被系統重新分配時,那些被刪除的數據就會被覆蓋,所以誤刪除數據後,應馬上卸載文件所在的分區。然後使用相關工具進行恢復。本文以 Ubuntu 12.04 平台為例介介紹四個(foremost、extundelete、testdisk 和 phtorec)常用的 Linux 刪除文件恢復工具的使用方法。
Linux 文件恢復的原理
inode 和 block
首先簡單介紹一下 Linux 文件系統的最基本單元:inode。inode 譯成中文就是索引節點,每個存儲設備(例如硬盤)或存儲設備的分區被格式化為文件系統後,應該有兩部份,一部份是 inode,另一部份是 block,block 是用來存儲數據用的。而 inode 呢,就是用來存儲這些數據的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權限等。inode 為每個文件進行信息索引,所以就有了 inode 的數值。linux 操作系統下可以使用 ls –id 命令來查看文件或者目錄的 inode 值,一般”root”目錄的 inode 值為 2,一個分區掛載到一個目錄下時,這個”root”目錄的 inode 值為 2
?
1 2 3# mount /dev/sdb2 /tmp
# ls -id /tmp
2
/tmp
文件恢復的原理
本文要介紹的命令是通過文件系統的 inode 值(一般是 2 )來獲取文件系統信息。在 ext3 和 ext4 文件系統中,每個文件都是通過 inode 來描述其數據存放的具體位置,當文件被刪除以後,inode 的數據指針部分被清零,文件目錄區沒有太多變化。文件的讀寫都是通過 inode 來實現,當 inode 數據指針被清零以後,即便文件內容還在,也沒有辦法把文件內容組合出來。當 ext3 和 ext4 文件系統中的元數據 metadata 發生變化時,相應的元數據 metadata 在日志文件會有一份拷貝。比如一個文件被刪除了,它的 inode 信息會在日志文件中先保存一份,然後把要刪除文件 inode 相關信息清零。這個日志文件是循環使用的,當操作過多時,刪除的文件的 inode 日志記錄會被新的數據替換,這就徹底喪失了根據 inode 找回數據的機會了。如果是大量文件的刪除,這個日志文件會被反復循環利用多次,只留給最後刪除的那些文件的恢復機會。
使用命令行工具恢復文件
foremost 和 extundelete 簡介
formost 是一個基於文件頭和尾部信息以及文件的內建數據結構恢復文件的命令行工具。這個過程通常叫做數據挖掘(data carvubg)。formost 可以分析由 dd、Safeback、Encase 等生成的鏡像文件,也可以直接分析驅動器。文件頭和尾可以通過配置文件設置,也可以通過命令行開關使用 formost 內建的文件類型。formost 最初是由美國空軍特別調查室(Air Force Office of Special Investigations)和信息系統安全研究中心(The Center for Information Systems Security Studies and Research)開發的,現在使用 GPL 許可。Foremost 支持恢復如下格式:avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip。
針對 Linux 下的 ext 文件系統來說,常用的 Linux 文件刪除恢復工具有 debugfs、ext3grep、extundelete 等。extundelete 是一個開源的數據恢復工具,支持 ext3、ext4 文件系統,其官方站點位於http://extundelete.sourceforce.net/,目前最新穩定版本為 0.2.0。
上面介紹的兩種命令行工具 foremost 和 extundelete 二者相比,foremost 支持的文件系統比較多(包括 ext2、 ext3 、vfat、NTFS、ufs、jfs 等)和 extundelete 支持的文件系統較少(ext3、ext4)文件系統。不過 foremost 只能支持恢復特定格式的文件。
使用 foremost
首先安裝軟件包
#apt-get install foremost
其它 Linux 發行版用戶可以在 http://foremost.sourceforge.net/ 下載源代碼編譯安裝。下面看看使用方法。
恢復單個類型文件
筆者刪除一個 USB(/dev/sdba1)存儲器中一個 png 文件然後使用 formost 恢復。
#rm -f /dev/sdb1/photo1.png
#foremost -t png -i /dev/sdb1
恢復完成後會在當前目錄建立一個 output 目錄,在 output 目錄下會建立 png 子目錄下會包括所有可以恢復的 png 格式的文件。
需要說明的是 png 子目錄下會包括的 png 格式的文件名稱已經改變,另外 output 目錄下的 audit.txt 文件是恢復文件列表。
恢復多個類型文件
#foremost -v -T -t doc,pdf,jpg,gif -i /dev/sda6 -o /media/disk/Recover
恢復完成後會在當前目錄建立一個 output 目錄,在 output 目錄下會建立四個子目錄(/doc,/pdf,/jpg,/gif),分別包括四種類型文件。另外 output 目錄下的 audit.txt 文件是恢復文件列表。
使用 extundelete
首先安裝軟件包
#apt-get install extundelete
其它 Linux 發行版用戶可以在http://extundelete.sourceforce.net/下載源代碼編譯安裝。下載安裝 extundelete 之前要安裝兩個軟件包 e2fsprogs 和 e2fslibs。下面看看使用方法
模擬數據誤刪除環境
這裡我們使用一個分區/dev/sdd1 掛在在/backupdate 上,建立一個測試目錄/delete 並建立一文件:del1.txt 。
?
1 2 3 4 5