當用戶意外地刪除了一個仍然需要的文件時,大多數情況下,是沒有簡便的方法可以重新找回或重建這個文件。不過,幸運的是文件是可以通過一些方法恢復的。當用戶刪除了一個文件,該文件並沒有消失,只是被隱藏了一段時間。
這裡將解釋它是如何工作的。在一個文件系統中,有一個叫做 文件分配表 的東西,這個表跟蹤文件在存儲單元(如硬盤, MicroSD 卡,閃存驅動器等等)中的位置。當一個文件被刪除,文件系統將會在文件分配表中執行以下兩個任務之一:這個文件在文件分配表上的條目被標記為 “自由空間” 或刪除文件分配表裡這個文件的條目,且將相應的空間被標記為自由空間 。現在,如果有一個新的文件需要被放置在一個存儲單元上,操作系統將會把這個文件放置到標記為空位的地方。在新文件被寫入到這個空位後,被刪除的文件就徹底消失了。當需要恢復一個已經刪除的文件時,用戶絕對不能再對任何文件進行操作,因為假如該文件對應的“空位”被占用,這個文件就永遠也不能恢復了。
恢復軟件是如何工作的?
大多數的文件系統(在刪除文件時)只是標記空間為空白。在這些文件系統下,恢復軟件查看文件分配表這個文件,然後復制被刪除的文件到另外的存儲單元中。假如該文件被復制到其它需要恢復的被刪除的存儲單元中,那麼用戶將有可能會失去那個所需的刪除文件。
文件系統很少會擦除文件分配表中的條目。假如文件系統真的這樣做了, 這便是恢復軟件在恢復文件了。恢復軟件在存儲單元中掃描文件頭,所有文件都擁有一個特殊的編碼字符串,它們位於文件的最前面,也被叫做 魔法數字。例如,一個編譯的 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 並不支持所有類型的分區表,所以這並不是完整的列表。
假如用戶選擇了 “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 個程序的程序集,用以確保被刪除的文件不能被恢復。
假如電腦實際去清除那些刪除的文件,那麼就需要花費更長的時間去執行刪除任務。將某些空間標記為空位是快速且容易的,但使得文件永遠消失需要花費一定的時間。例如,擦除一個存儲單元,可能需要花費幾個小時的時間(根據磁盤容量大小)。總之,現在的系統工作的就挺好,因為即便用戶清空了垃圾箱,他們仍然有另一次機會來改變他們當初的想法(或錯誤)。