怎樣在 Linux 系統中恢復已刪除文件
恢復軟體是如何工作的?
大多數的文件系統(在刪除文件時)只是標記空間為空白。在這些文件系統下,恢復軟體查看文件分配表這個文件,然後複製被刪除的文件到另外的存儲單元中。假如該文件被複制到其它需要恢復的被刪除的存儲單元中,那麼用戶將有可能會失去那個所需的刪除文件。
文件系統很少會擦除文件分配表中的條目。假如文件系統真的這樣做了, 這便是恢復軟體在恢復文件了。恢復軟體在存儲單元中掃描文件頭,所有文件都擁有一個特殊的編碼字元串,它們位於文件的最前面,也被叫做 魔法數字。例如,一個編譯的 JAVA 類文件的魔法數字在十六進位中是「CAFEBABE」。所以,假如要恢復該類型的文件,恢復軟體會查找 「CAFEBABE」 然後複製文件到另一個存儲單元。一些恢復軟體可以查找某種特殊的文件類型。若用戶想恢復一個 PDF 文件,則恢復軟體將會查找十六進位的魔法數字 「25504446」,這恰恰是 ASCII 編碼中的 「%PDF」。恢復軟體將會查找所有的魔法數字,然後用戶可以選擇恢復哪個已刪除的文件。
假如一個文件的部分被覆寫了,則整個文件就會被損壞。通常這個文件可以被恢復,但是其中的內容可能已經沒有什麼用處。例如,恢復一個已損壞的 JPEG 文件將會是無意義的,因為圖片查看器不能從這個損壞的文件產生一幅圖片。因此,即使用戶擁有了這個文件,該文件也將毫無用處。
設備的位置:
在我們繼續之前,下面的一些信息將會對指引恢復軟體找到正確的存儲單元起到一定的幫助。所有的設備均掛載在 /dev/ 目錄下。操作系統賦予每個設備的名稱(並不是管理員給予每個分區或設備的名稱)遵循一定的命名規律。
第一個 SATA 硬碟的第二個分區的名稱將會是 sda2。名稱的第一個字母暗示了存儲類型,在這裡指的是 SATA,但字母 「s」 也可能指的是 SCSI、 FireWire(火線埠)或 USB。第二個字母 「d」 指的是 disk(硬碟)。第三個字母指的是設備序數,即字母 「a」 指的是第一個 SATA 而 「b」 指的是第二個。最後的數字代表分區。沒有分區數字的設備名代表該設置的所有分區。對於上面的例子,對應的名稱為 sda 。作為命名的第一個字母還可能是 「h」 ,這對應 PATA 硬碟(IDE)。
以下為命名規律的一些例子。假如一個用戶有一個 SATA 硬碟(sda),這個設備有 4 個分區- sda1、 sda2、 sda3 和 sda4 。該用戶刪除了第三個分區,但直到格式化第四個分區之前,第四個分區名 sda4 都將保留不變。然後該用戶插入了一個帶有一個分區 - 即sdb1- 的 usb 存儲卡(sdb),又增加了一個帶有一個分區 -hda1- 的 IDE 硬碟 ,接著該用戶又增加了一個 SCSI 硬碟 - sdc1 。接著用戶移除了 USB 存儲卡(sdb)。現在,SCSI 硬碟的名稱仍然為 sdc,但如果這個 SCSI 被移除接著再被插入,則它的名稱將變為 sdb。雖然還有其他的存儲設備存在, 那個 IDE 硬碟的名稱仍會有一個 「a」, 因為它是第一個 IDE 硬碟,IDE 設備的命名與 SCSI、 SATA、 FireWire 和 USB 設備要分開計數。
使用 TestDisk 進行恢復:
每個恢復軟體有其不同的功能,特徵及支持的不同文件系統。下面是一些關於 使用 TestDisk 在各種文件系統中恢復文件的指南。
FAT16、 FAT32、 exFAT (FAT64)、 NTFS 以及 ext2/3/4:
TestDisk 是一個運行在 Linux、 *BSD、 SunOS、 Mac OS X、 DOS 和 Windows 等操作系統下的開源的自由軟體。 TestDisk 可以從下面的鏈接中找到 :http://www.cgsecurity.org/wiki/TestDisk。TestDisk 也可以通過鍵入 sudo apt-get install testdisk 來安裝。TestDisk 有著許多的功能,但這篇文章將只關注恢復文件這個功能。
使用 root 許可權從終端中打開 TestDisk 可以通過鍵入 sudo testdisk 命令。
現在, TestDisk 命令行應用將會被執行。終端的顯示將會改變。TestDisk 詢問用戶它是否可以保留日誌,這完全由用戶決定。假如一個用戶正從系統存儲中恢復文件,則不必保留日誌。可選擇的選項有「生成」、 「追加」 和 「無日誌」。假如用戶想保留日誌,則日誌將會保留在該用戶的主目錄。
在接著的屏幕中,存儲設備以 /dev/*的方式被羅列出來。對於我的系統,系統的存儲單元為 /dev/sda,這意味著我的存儲單元為 一個 SATA硬碟(sd)且它是第一個硬碟(a)。每個存儲單元的容量以 Gigabyte(千兆位元組)為單位顯示的。使用上下鍵來選擇一個存儲設備然後點擊進入。
下一屏顯示出一個列有分區表(也叫做分區映射表)的清單。正如文件有文件配置表,分區有著分區表。分區是存儲設備上的分段。例如在幾乎所有的 Linux 系統中,至少存在兩種分區類型 - EXT3/4 和 Swap 。每一個分區表將會在下面被簡要地描述。TestDisk 並不支持所有類型的分區表,所以這並不是完整的列表。
- Intel - 這類分區表在 Windows 系統和許多的 Linux 系統中非常普遍,它也常常稱作 MBR 分區表。
- EFI GPT - 這種類型的分區表通常用在 Linux 系統中。對於 Linux 系統,這種分區表是最為推薦的, 因為邏輯分區或擴展分區的概念並不適用於 GPT (GUID Partition Table) 分區表。 這意味著,如果每個分區中有一個 Linux 系統,一個 Linux 用戶可以從多種類型的 Linux 系統中進行多重啟動。當然使用 GPT 分區表還有其他的優勢,但那些已超出了本文的討論範圍。
- Humax - Humax 分區映射表適用於韓國公司 Humax 生產的設備。
- Mac - Apple 分區映射表 (APM) 適用於 Apple 的設備。
- None - 某些設備並沒有分區表。例如,許多 Subor 遊戲控制台不使用分區映射表。如果一個用戶試圖以其它分區表類型從這類設備中恢復文件,用戶就會困擾 TestDisk 為何找卟到任何的文件系統或者文件。
- Sun - Sun 分區表適用於 Sun 系統。
- Xbox -Xbox 適用於使用 Xbox 分區映射表的存儲設備。
假如用戶選擇了 「Xbox」 ,儘管他的系統使用了 GPT 分區表, 那麼 TestDisk 將不能找到任何分區或文件系統。假如 TestDisk 按照用戶的選擇執行,則它可能猜測錯誤。(下面的圖片顯示的是當分區表類型錯誤時的輸出)
當用戶為他們的設備選擇了正確的選項,則在下一屏中,選擇 「高級」 選項。
現在,用戶將看到一個列有用戶存儲設備中所有的文件系統或分區的列表。假如用戶選擇了錯誤的分區映射表,則在這一步中用戶就將會知道他們做出了錯誤的選擇。假如沒有錯誤,通過移動文字游標來高亮選擇含有被刪除文件的分區。使用 左右鍵來高亮位於終端底部的 「列表」。接著,按下回車確認。
新的一屏便會呈現出列有文件和目錄的列表。那些白色的文件名就是未被刪除的文件,而紅色的文件名是那些已被刪除的文件。最右邊的一列是文件的名稱,從右到左方向的接著一列是文件的創建日期,再往左的一列是文件的大小(以 byte/ 比特為單位),最左邊帶有「-」,「d」 ,「r」, 「w」 和"x"的一列則代表的是文件的許可權情況。「d」 表示該文件為一個目錄,其他的許可權術語與本文關係不大。在列表的最頂端以「.」代表的一項表示當前目錄,第二行以".."代表的一項表示當前目錄的上級目錄,所以用戶可以通過選擇目錄所在行到達該目錄。
舉個例子,我想進入"Xaiml_Dataset" 目錄,該目錄基本上由被刪除的文件組成。通過按鍵盤上的 "c"鍵,我將恢復文件 "computers.xaiml",接著我被詢問選擇一個目標目錄,當然,我應該放置該文件到另一個分區中。現在,當我在我的家目錄時,按下了「c」鍵。(選擇目標目錄時)哪個目錄被高亮並沒有什麼影響,當前目錄就是目標目錄,在屏幕的上方,將會顯示「複製完成」的消息。在我的家目錄中便會有一個名為"Xaiml_Dataset"的目錄,裡面里有一個 Xaiml 文件。 假如我在更多的已刪除文件上按「c」 鍵,則這些文件將會被放置到新的文件夾中而無需再向我詢問目標目錄。
當這些步驟完成後,重複按「q」鍵直到看到正常的終端模樣。目錄"Xaiml_Dataset" 只能被 root 用戶訪問。為了解決這個問題,使用 root 許可權改變該目錄及其子目錄的許可權。做完這些後,文件便被恢復了且用戶可以訪問它們。
特別的 ReiserFS:
為了從 ReiserFS 文件系統中恢復一個文件,首先需將分區中的所有文件做一個備份。因為如果發生某些錯誤, 這個方法可能會引起文件丟失。接著執行下面的命令,其中 DEVICE指的是那些以 sda2 形式命名的設備。一些文件將被放入 lost+found 目錄而其他則會保存到原先被刪除的位置。
reiserfsck --rebuild-tree --scan-whole-partition /dev/DEVICE
恢復被某個程序打開的刪除文件:
假設用戶意外地刪除了一個文件,且該文件被某個程序打開。雖然在硬碟中該文件被刪除了,但這個程序正使用著位於 RAM 中的該文件的副本。幸好,我們有兩種簡單的解決方法來恢復該文件。
假如這個軟體有保存功能,如文本編輯器,則用戶可以重新保存該文件,這樣,文本編輯器可以將該文件寫入硬碟中。
假設在音樂播放器中有一個 MP3 文件,而該音樂播放器並不能保存該 MP3 文件,則這種情形下需要比先前花更多的時間來恢復文件。不幸的是,這種方法並不能保證在所有的系統和應用中有效。首先,鍵入下面的命令。
lsof -c smplayer | grep mp3
上面的命令會列出所有由 smplayer 使用的文件,這個列表由 grep 命令通過管道搜索 mp3 。命令的輸入類似於下面:
smplayer 10037 collier mp3 169r 8,1 676376 1704294 /usr/bin/smplayer
現在,鍵入下面的命令來直接從 RAM(在 Linux 系統中,/proc/映射到 RAM)中恢復文件,並複製該文件到選定的文件夾中。其中 cp 指的是複製命令,輸出中的數字 10037 來自於進程數,輸出中的數字 169 指的是文件描述符,"~/Music/"為目標目錄,最後的 "music.mp3" 為用戶想恢復的文件的名稱。
cp /proc/10037/fd/169 ~/Music/music.mp3
真正的刪除:
為確保一個文件不能被恢復,可以使用一個命令來 「擦除」 硬碟。擦除硬碟實際上是向硬碟中寫入無意義的數據。例如,許多擦除程序向硬碟中寫入零,隨機字母或隨機數據。不會有空間被佔用或丟失,擦除程序只是對空位進行重寫覆蓋。假如存儲單元被文件佔滿而沒有空餘空間,則所有先前被刪除的文件將會消失而不能恢復。
擦除硬碟的目的是確保隱私數據不被他人看見。舉個例子,一個公司可能預訂了一些新的電腦,總經理決定將舊的電腦賣掉,然而,新的電腦擁有者可能會看到公司的一些機密或諸如信用卡號碼,地址等顧客信息。幸好,公司的電腦技術人員可以在賣掉這些舊電腦之前,擦除這些硬碟。
為了安裝擦除程序 secure-delete,鍵入 sudo apt-get install secure-delete,這個命令將會安裝一個包含 4 個程序的程序集,用以確保被刪除的文件不能被恢復。
- srm - 永久刪除一個文件。使用方法: srm -f ./secret_file.txt
- sfill - 擦除空白空間。使用方法: sfill -f /mount/point/of/partition
- sswap - 擦除 swap 空間。使用方法: sswap -f /dev/SWAP_DEVICE
假如電腦實際去清除那些刪除的文件,那麼就需要花費更長的時間去執行刪除任務。將某些空間標記為空位是快速且容易的,但使得文件永遠消失需要花費一定的時間。例如,擦除一個存儲單元,可能需要花費幾個小時的時間(根據磁碟容量大小)。總之,現在的系統工作的就挺好,因為即便用戶清空了垃圾箱,他們仍然有另一次機會來改變他們當初的想法(或錯誤)。
via: http://www.linux.org/threads/undelete-files-on-linux-systems.4316/
作者:DevynCJohnson 譯者:FSSlc 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive