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
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 。
# mkdir –p /backupdate/deldate # mkfs.ext4 /dev/sdd1 # mount /dev/sdd1 /backupdate #cd /backupdate/deldate # touch del1.txt # echo " test 1" > del1.txt 獲取文件校驗碼 # md5sum del1.txt 66fb6627dbaa37721048e4549db3224d del1.txt 刪除文件 # rm -fr /backupdate/* 卸載文件系統或者掛載為只讀 # umount /backupdate 查詢恢復數據信息,注意這里的--inode 2 這里會掃描分區 : # extundelete /dev/sdd1 --inode 2 ..... File name | Inode number | Deleted status Directory block 8657: . 2 .. 2 lost+found 11 Deleted del1.txt 12 Deleted
?
上面標記為 Deleted 是已經刪除的文件或目錄
開始恢復文件
默認恢復到當前目錄下的 RECOVERED_FILES 目錄中去。
# extundelete /dev/sdd1 --restore-file del1.txt 如果恢復一個目錄 # extundelete /dev/sdd1 --restore-directory /backupdate/deldate 恢復所有文件 # extundelete /dev/sdd1 --restore-all 獲取恢復文件校驗碼,對比檢測是否恢復成功 # md5sum RECOVERED_FILES/ del1.txt 66fb6627dbaa37721048e4549db3224d RECOVERED_FILES/del1.txt
?
查看校驗碼與之前的是否完全一致。
應 用總結:筆者在現實使用過程中發現 extundelete 還是有很大的不完整性,基于整個磁盤的恢復功能較為強大,基于目錄和文件的恢復還不夠強大。在 Linux 下誤刪除了文件,當發現數據丟失以后,不要進行任何操作,保留現場。要想辦法把數據丟失的文件系統經過 dd 命令或者 AIR(Automated Image Restore, http://cdnetworks-kr-2.dl.sourceforge.net/ )工具到另外的存儲空間上作為最原始的備份,以便數據恢復專家現場診斷恢復。
?
使用 scalpel
以上介紹的工具主要使用在 ext3 和 ext4 的文件系統,如果用戶使用的那些沒有日志機制的舊有文件系統,可以使用 scalpel 工具。scalpel 是一種快速文件恢復工具,它通過讀取文件系統的數據庫來恢復文件。它是獨立于文件系統的。
?
用戶可以在 http://www.digitalforensicssolutions.com/Scalpel/ 下載源代碼編譯安裝。下面看看使用方法:
使用 scalpel 工具之前,首先要修改配置文件:?/etc/scalpel/scalpel.conf。
例如用戶要恢復所有刪除 pdf 文件,那么要在/etc/scalpel/scalpel.conf 把包括 pdf 文件格式的兩行之前的# 去掉。
[...] pdf y 5000000 %PDF %EOF\x0d REVERSE pdf y 5000000 %PDF %EOF\x0a REVERSE [...]
?
然后保存文件。
下面看看使用方法
# scalpel /dev/sdb1 -o /RECOVERY/
?
其中/dev/sdb1 是目標驅動器,/RECOVERY/ 是恢復文件存儲目錄。目錄下的 audit.txt 文件是恢復文件列表。
?
使用字符終端工具 testdisk 和 phtorec
testdisk 簡介
testdisk 是分區表恢復、raid 恢復、分區恢復的開源免費工具(testdisk 支持如下文件系統: FAT12/FAT16/FAT32/NTFS/ext2/ext3/ext4)。testdisk 支持的功能: 修復分區表, 恢復已刪除分區,用 FAT32 備份表恢復啟動扇區,重建 FAT12/FAT16/FAT32 啟動扇區,修復 FAT 表,重建 NTFS 啟動扇區,用備份表恢復 NTFS 啟動扇區,用 mft 鏡像表(mft mirror)修復 mft 表,查找 ext2/ext3 備份的 superblock,從 FAT,NTFS 及 ext2 文件系統恢復刪除文件,從已刪除的 FAT,NTFS 及 ext2/ext3 分區復制文件。
?
使用方法
首先安裝
#apt-get install testdisk
?
其它 Linux 發行版用戶可以在 http://www.cgsecurity.org/wiki/TestDisk_Download 下載源代碼編譯安裝。下載安裝 testdisk 之前要安裝幾個軟件包 libjpeg8 ,libncursesw5, libuuid1, zlib1g 。下面看看使用方法
啟動 testdisk
#testdisk
?
testdisk 啟動后的工作界面首先是選擇恢復操作中的 log 文件(testdisk.log)的紀錄方式見圖 1。
?
圖 1.選擇恢復操作中的 log 文件的紀錄方式
[Create]新建
[Append]追加
[No Log]不紀錄
選擇了 log 文件的記錄方式后、系統顯示處于連接狀態的磁盤設備見圖 2。
?
圖 2.處于連接狀態的磁盤設備
在列出的磁盤設備中,選擇要恢復的分區,然后選擇磁盤分區的種類。若是 ext4 文件系統的話,請選擇 [None ] Non partitioned media 見圖 3
?
圖 3.選擇 [None ] Non partitioned media
說明:一般選擇[Intel] Intel/PC partition(如果是 GPT 分區,請選擇 EFI GPT),對于 ext4 文件系統選擇 [Intel] Intel/PC partition 也能正確識別,只是分析硬盤時比較慢。
下面的畫面中選擇[Analyse],對分區進行分析見圖 4。
?
圖 4.對分區進行分析
下面顯示了當前分區的狀態。這是軟件分析的當前分區表的分區結果,我們選擇“Deep Search”進行一次深入檢測見圖 5。
?
圖 5.選擇“Deep Search”進行一次深入檢測
下面是檢測完成界面見圖 6
?
圖 6.檢測完成界面
在這個畫面時,按 P 鍵就可以列出硬盤上的文件見圖 7
?
圖 7.紅色的文件名稱就是已經被刪除的文件
紅色的文件名稱就是已經被刪除的文件,選擇好你要恢復的文件后,按 c 鍵之后,它就會問你要復制到哪個目錄,這時請選擇你要 復制的目地地(destination)即可。
?
photorec 簡介
photorec 是一款用于恢復硬盤、光盤中丟失的視頻、文檔、壓縮包等文件,或從數碼相機存儲卡中恢復丟失圖片的數據恢復軟件(因此,該軟件命名為 photo recovery 這個名字)。 photorec 忽略文件系統,能直接從介質底層恢復數據,因此,在介質的文件系統嚴重破壞或被重新格式化后,它也能進行數據恢復。出于安全考慮, photorec 以只讀方式來訪問您要恢復數據所在的磁盤或存儲卡介質。提示: 一旦發現丟失或意外刪除了某個圖片、文件, 請不要繼續往該存儲設備或磁盤保存新文件;否則您可能會覆蓋原來的數據。 這意味著您在使用 photorec 時,您千萬不要將恢復的文件寫入到原數據所存儲的同一分區。
?
使用 photorec 恢復文件
photorec 是 testdisk 的伴侶程序,安裝 testdisk 后 photorec 就可以使用了。
啟動 photorec
# photorec
?
圖 8 中顯示了已連接磁盤設備,準備恢復的文件在那個設備上就選擇它,然后在選擇 Proceed 按鈕繼續下一步。
?
圖 8.已連接磁盤設備
接下來,選擇恢復的磁盤分區格式。這里選擇 ext4 見圖 9。
?
圖 9.選擇恢復的磁盤分區格式
畫面下方[File Opt]中有可供恢復的文件種類提供被選擇見圖 10。
?
圖 10.可供恢復的文件種類
說明:如果只是 root 據某些文件簽名要恢復部分文件類型,那么可以按 s 取消全部勾選,然后移動光標到要恢復的文件類型,可按空格來選擇高亮選中的類型。
下面設定要分析的磁盤空間區域,可整個分區搜索,也可只搜索自由空間(相當于未分配簇)見圖 11 。
?
圖 11.設定要分析的磁盤空間區域
下面選擇分區所使用的文件系統類型,然后設定導出的文件目錄,一般輸入 Y 并回車即可。圖 12 是恢復完成界面。
?
圖 12.恢復完成
恢復完了選擇 Quit 退出 PhtoRec。被恢復的文件是 recup_dir.x 的若干數字子組合為文件名被保存在當前目錄的/recup_dir 子目錄下的。
?
功能對比
表 1 是 Linux 刪除文件恢復工具
?
表 1.Linux 刪除文件恢復工具
工具名稱/功能對比 工作界面 功能簡介
foremost
|
命令行
|
formost 是一個基于文件頭和尾部信息以及文件的內建數據結構恢復文件的命令行工具
|
extundelete
|
命令行
|
Extundelete
是
ext3、ext4
文件系統的恢復工具
|
s
calpel
|
命令行
|
scalpel
是一種快速文件恢復工具,它通過讀取文件系統的數據庫來恢復文件。它是獨立于文件系統的
|
testdisk
|
字符終端
|
Testdisk 支持分區表恢復、raid 恢復、分區恢復 |
phtorec
|
字符終端
|
photorec 用來恢復硬盤、光盤中丟失的視頻、文檔、壓縮包等文件,或從數碼相機存儲卡中恢復丟失的圖片 |
?
總結
可以使用 testdisk 進行文件恢復的場合,也就是硬盤上的分區(該分區有原有數據紀錄)已經損壞的情形。但是如果損壞之后,重新再次做成了新分區的話,文件恢復的可能性比較小,很困難。photorec 不僅針對 硬盤、USB 設備、CD-ROM、SD 卡,而且還可以對其它存儲設備進行應用。因此大多數常用的文件如果被誤操作的話,均可利用其來進行恢復,只不過它的初衷是針對照片而制作的。
?
參考資料
學習
- 訪問 foremost 官方網站 ,可以查看更多關于 foremost 操作的信息。
- 訪問 extundelete 官方網站 ,可以查看更多關于 extundelete 操作的信息。
- 訪問 scalpel 官方網站 ,可以查看更多關于 scalpel 操作的信息。
- 訪問 testdisk 和 phtorec 官方維基網頁 ,可以查看更多關于 testdisk 和 phtorec 操作的信息。
- 在 developerWorks Linux 專區 尋找為 Linux 開發人員(包括 Linux 新手入門 )準備的更多參考資料。
討論
- 加入 developerWorks 中文社區 ,developerWorks 社區是一個面向全球 IT 專業人員,可以提供博客、書簽、wiki、群組、聯系、共享和協作等社區功能的專業社交網絡社區。
來源: http://www.ibm.com/developerworks/cn/linux/1312_caoyq_linuxrestore/index.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
