文件恢復
這篇文章列舉了一系列在 Linux 下恢復數據的方法。
本文主要用於教學目的。如果你意外地刪除或損壞了有價值且不可替代的數據,並且毫無數據恢復的經驗的話,請立刻關閉你的電腦(只要長按電源鍵或直接拔插頭即可,不要使用系統的關機功能),然後尋求專業人員的幫助。
在數據恢復的領域裡,操作一個磁碟的鏡像會比直接操作物理磁碟會更好些。總體上來說,一個壞掉的硬碟的情況會隨著時間惡化。我們的目標應當是首先儘快地搶救出儘可能多的數據,並且拋棄故障的磁碟。ddrescue包 和 dd_rescue包 工具與 dd 不同,它們會反覆嘗試從錯誤中恢復,並且從硬碟往返讀取以搶救出數據。它們會保留日誌文件,所以恢復過程中的暫停並不會損失進度。
參閱硬碟克隆。
由類如 ddrescue 這樣的工具創建的鏡像文件可以像物理設備一樣被掛載,並且安全地對其進行操作。請務必做好原始鏡像的備份以便在恢復工作黃掉的時候重新做人。
改善故障硬碟讀取的一個久經考驗的方法是保持硬碟清涼。在冰箱裡放一會兒是個好主意,但不要讓硬碟升溫太快,因為這樣會產生冷凝水。如果能在進行恢復工作的時候把硬碟放在冰箱裡,並用線材連接電腦就再好不過了.
不要嘗試對故障硬碟進行文件系統檢查,這很可能會使情況變得更糟糕。請務必把它掛載為只讀。
在出問題的文件系統不大或硬碟空間足夠的情況下,優先選擇在鏡像上進行操作,而不是在活躍分區上進行(與是否掛載無關)。類似 U 盤,相機,便攜播放器,手機等快閃記憶體介質的設備通常鏡像都足夠小。
請務必閱讀下列工具的 man 手冊,以確保這些工具能夠處理映像文件。
可以使用如下命令通過 dd 創建鏡像:
# dd if=/dev/target_partition of=/home/user/partition.image
為使下一節提到的工具能正常在快閃記憶體設備上工作,需要將設備掛載為塊設備(即出現在 /dev 下)。在圖片傳輸協議(Picture Transfer,PTP)模式下工作的數位相機不會以該形式出現,而是由 libgphoto 和/或 libptp 透明處理。在這種情況下,「透明」意味著 PTP 設備不會被獲取為塊設備。不是所有相機都支持作為 PTP 模式替代的 USB 大容量存儲設備(USB Mass Storage,UMS)模式。有些相機可以在菜單中切換這兩種模式,具體信息請參考相機的用戶手冊。如果你的相機不支持 UMS 模式,就無法被作為塊設備讀取,唯一解決方法是將介質從相機中取出,然後使用讀卡器連到電腦。
See also Wikipedia:List of data recovery software#File Recovery
- ddrutility — Compliment to GNU ddrescue包. Find what files are related to the bad sectors and some special tools for NTFS. No longer actively supported.
- dvdisaster — Additional error protection for CD/DVD media.
- Foremost — Console program to recover files based on their headers, footers, and internal data structures. This process is commonly referred to as data carving. The headers and footers can be specified by a configuration file or command line switches can be used to specify built-in file types.
- PhotoRec — File data recovery software designed to recover lost files including video, documents and archives from hard disks, CD-ROMs, and lost pictures (thus the Photo Recovery name) from digital camera memory.
- R-Linux — A free file recovery utility for the Ext2/Ext3/Ext4 file systems.
- Scalpel — File carving and indexing application originally based on Foremost, although significantly more efficient. It allows an examiner to specify a number of headers and footers to recover filetypes from a piece of media.
- TestDisk — Data recovery software primarily designed to help recover lost partitions and/or make non-booting disks bootable again when these symptoms are caused by faulty software: certain types of viruses or human error (such as accidentally deleting a Partition Table).
- xfs_undelete — Traverses the inode B+trees of each allocation group and tries to recover all files on an XFS filesystem marked as deleted.
TestDisk 和 Photorec 都是在 GNU 通用公共許可證(GPL)下發布的開源數據恢復工具。
TestDisk 設計用於在出現軟體錯誤,特定類別的病毒或人為原因導致分區表損壞等情況時,幫助恢復丟失的分區並/或使得硬碟可再起啟動。TestDisk 可以檢測包括 NTFS, FAT12, FAT16, FAT32, exFAT, ext2, ext3, ext4, btrfs, BeFS, CramFS, HFS, JFS, Linux Raid, Linux Swap, LVM, LVM2, NSS, ReiserFS, UFS, XFS 在內的多種文件系統。它還可以從 FAT,NTFS,exFAT 和 ext2 文件系統中恢復被刪除的文件。
TestDisk 可以修復分區表,恢復被刪除的分區,從備份恢復 FAT32 啟動扇區,重建 FAT12/FAT16/FAT32 啟動扇區,修復 FAT 表,重建 NTFS 啟動扇區等等。
PhotoRec 是一個文件恢復軟體,設計用於從硬碟和 CD-ROM 找回圖片(也是名稱來源:PhotographRecovery),視頻,文檔,壓縮包等文件。PhotoRec 會無視文件系統並直接讀取底層數據,使得其可以在被重新格式化或出現嚴重損壞的文件系統和/或分區表上運行。
安裝 testdisk包,其提供了 TestDisk 和 PhotoRec。
在執行類似 ddrescue包 的工具創建 image.img 後,使用 photorec image.img 會打開一個命令行交互界面,以供選擇要搜尋的文件類型和被恢復文件的存放位置。更詳細的內容請參考 wiki。
photorec 會將恢復的文件存放在編號目錄下,多數文件都是隨機名稱,例如 ./recup_dir.1/f872690288.jpg,./recup_dir.1/f864563104_wmclockmon-0.1.0.tar.gz。
- 如何獲取原始文件名:PhotoRec FAQ
- 如何添加自定義文件特徵:CGSecurity Wiki
- Wiki(TestDisk):https://www.cgsecurity.org/wiki/TestDisk
- Wiki(Photorec):https://www.cgsecurity.org/wiki/PhotoRec
- 主頁:https://www.cgsecurity.org/
e2fsck 是一個 ext2/ext3 文件系統檢查器,已包含在 Arch 的基本安裝環境中。e2fsck 依賴於有效的超級塊(superblock),其中描述了整個文件系統的參數。由於該數據非常重要,其內容被多次複製到了分區的多個分散位置中。使用 -b 選項可以向 e2fsck 傳入替代 superblock 參數,適用於主(即首個)超級塊出現損壞的情況。
對未掛載的目標執行 dumpe2fs -h 可找到超級塊的位置。取決於創建文件系統時塊大小的設置不同,超級塊的間距也會變動。
另一種確定超級塊位置的方法是向 mke2fs 傳入 -n 選項。務必確保使用了 -n 選項,根據 mke2fs(8) 所說,它會讓 mke2fs 不要實際創建文件系統,而是顯示在創建文件系統時會進行的更改。只要傳入和創建文件系統時一致的參數(另外要加上 -n),就可以用它來確定特定文件系統中備份超級塊的位置。
e2fsck 和 dumpe2fs 已作為 e2fsprogs包 的一部分包含著默認 Arch 安裝中。
另請參考 e2fsck(8) 和 dumpe2fs(8)。
該部分適用於已通過 ddrescue 或 dd 將硬碟進行備份,並需要將鏡像掛載為物理硬碟的情況。
要將整個硬碟掛載到下個可用迴環設備上,請使用 losetup 命令:
# losetup -f -P /path/to/image
-
-f標誌會將硬碟掛載到下一個可用迴環設備上。 -
-P標誌會為每個分區創建一個額外的設備。
另請參考 QEMU#loop模塊自動檢測分區.
為掛載整個硬碟鏡像中的單個分區,請先參考以上步驟。
在掛載了整個硬碟鏡像後,可以對迴環設備使用正常的 mount 命令:
# mount /dev/loop0p1 /mnt/example
該命令會將 loop0 中的鏡像的首個分區掛載到 /mnt/example 下。記住,指定的掛載點文件夾必須已經存在!
在將硬碟鏡像掛載為迴環設備後,就可以檢查其硬碟布局。
由於 Linux 下沒有好的 NTFS 檢查工具,包含一個或多個 NTFS 分區的硬碟需要使用 Windows 進行 chkdsk。 QEMU 可以在虛擬機中將 raw 原始磁碟映像作為物理硬碟使用:
# qemu -hda /path/to/primary.img -hdb /path/to/DamagedDisk.img
然後, 假設 Windows 被安裝在 primary.img,它就可以用來檢查 /path/to/DamagedDisk.img 上的分區。
在塊設備上有可能通過直接搜索找出被刪掉的純文本文件。你需要一段來自待恢復的文件中的比較獨一無二的字符串。
使用 grep 在分區上直接篩選固定字符串(-F):
$ grep -a -C 200 -F 'Unique string in text file' /dev/sdXN > OutputFile
如果運氣好的話,被刪除文件的內容會出現在 OutputFile 中,可直接從文本的上下文中提取。
-C -200 選項告訴 grep 列印每個匹配字符串的前後 200 行。也可以使用 -A 和 -B 參數,分別會輸出匹配字符串之後和之前的內容。如果你在尋找的文本很長,則需要視情況調整。- Data Recovery on the Ubuntu wiki