天天看點

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

當使用者意外地删除了一個仍然需要的檔案時,大多數情況下,是沒有簡便的方法可以重新找回或重建這個檔案。不過,幸運的是檔案是可以通過一些方法恢複的。當使用者删除了一個檔案,該檔案并沒有消失,隻是被隐藏了一段時間。

這裡将解釋它是如何工作的。在一個檔案系統中,有一個叫做 檔案配置設定表 的東西,這個表跟蹤檔案在存儲單元(如硬碟, microsd 卡,閃存驅動器等等)中的位置。當一個檔案被删除,檔案系統将會在檔案配置設定表中執行以下兩個任務之一:這個檔案在檔案配置設定表上的條目被标記為 “自由空間” 或删除檔案配置設定表裡這個檔案的條目,且将相應的空間被标記為自由空間 。現在,如果有一個新的檔案需要被放置在一個存儲單元上,作業系統将會把這個檔案放置到标記為空位的地方。在新檔案被寫入到這個空位後,被删除的檔案就徹底消失了。當需要恢複一個已經删除的檔案時,使用者絕對不能再對任何檔案進行操作,因為假如該檔案對應的“空位”被占用,這個檔案就永遠也不能恢複了。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

<a target="_blank"></a>

大多數的檔案系統(在删除檔案時)隻是标記空間為空白。在這些檔案系統下,恢複軟體檢視檔案配置設定表這個檔案,然後複制被删除的檔案到另外的存儲單元中。假如該檔案被複制到其它需要恢複的被删除的存儲單元中,那麼使用者将有可能會失去那個所需的删除檔案。

檔案系統很少會擦除檔案配置設定表中的條目。假如檔案系統真的這樣做了, 這便是恢複軟體在恢複檔案了。恢複軟體在存儲單元中掃描檔案頭,所有檔案都擁有一個特殊的編碼字元串,它們位于檔案的最前面,也被叫做 魔法數字。例如,一個編譯的 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 在各種檔案系統中恢複檔案的指南。

使用 root 權限從終端中打開 testdisk 可以通過鍵入 sudo testdisk 指令。

現在, testdisk 指令行應用将會被執行。終端的顯示将會改變。testdisk 詢問使用者它是否可以保留日志,這完全由使用者決定。假如一個使用者正從系統存儲中恢複檔案,則不必保留日志。可選擇的選項有“生成”、 “追加” 和 “無日志”。假如使用者想保留日志,則日志将會保留在該使用者的主目錄。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

在接着的螢幕中,儲存設備以 /dev/*的方式被羅列出來。對于我的系統,系統的存儲單元為 /dev/sda,這意味着我的存儲單元為 一個 sata硬碟(sd)且它是第一個硬碟(a)。每個存儲單元的容量以 gigabyte(千兆位元組)為機關顯示的。使用上下鍵來選擇一個儲存設備然後點選進入。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

下一屏顯示出一個列有分區表(也叫做分區映射表)的清單。正如檔案有檔案配置表,分區有着分區表。分區是儲存設備上的分段。例如在幾乎所有的 linux 系統中,至少存在兩種分區類型 - ext3/4 和 swap 。每一個分區表将會在下面被簡要地描述。testdisk 并不支援所有類型的分區表,是以這并不是完整的清單。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

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 按照使用者的選擇執行,則它可能猜測錯誤。(下面的圖檔顯示的是當分區表類型錯誤時的輸出)

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

當使用者為他們的裝置選擇了正确的選項,則在下一屏中,選擇 “進階” 選項。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

現在,使用者将看到一個列有使用者儲存設備中所有的檔案系統或分區的清單。假如使用者選擇了錯誤的分區映射表,則在這一步中使用者就将會知道他們做出了錯誤的選擇。假如沒有錯誤,通過移動文字光标來高亮選擇含有被删除檔案的分區。使用 左右鍵來高亮位于終端底部的 “清單”。接着,按下回車确認。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

新的一屏便會呈現出列有檔案和目錄的清單。那些白色的檔案名就是未被删除的檔案,而紅色的檔案名是那些已被删除的檔案。最右邊的一列是檔案的名稱,從右到左方向的接着一列是檔案的建立日期,再往左的一列是檔案的大小(以 byte/ 比特為機關),最左邊帶有“-”,“d” ,“r”, “w” 和"x"的一列則代表的是檔案的權限情況。“d” 表示該檔案為一個目錄,其他的權限術語與本文關系不大。在清單的最頂端以“.”代表的一項表示目前目錄,第二行以".."代表的一項表示目前目錄的上級目錄,是以使用者可以通過選擇目錄所在行到達該目錄。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

舉個例子,我想進入"xaiml_dataset" 目錄,該目錄基本上由被删除的檔案組成。通過按鍵盤上的 "c"鍵,我将恢複檔案 "computers.xaiml",接着我被詢問選擇一個目标目錄,當然,我應該放置該檔案到另一個分區中。現在,當我在我的家目錄時,按下了“c”鍵。(選擇目标目錄時)哪個目錄被高亮并沒有什麼影響,目前目錄就是目标目錄,在螢幕的上方,将會顯示“複制完成”的消息。在我的家目錄中便會有一個名為"xaiml_dataset"的目錄,裡面裡有一個 xaiml 檔案。 假如我在更多的已删除檔案上按“c” 鍵,則這些檔案将會被放置到新的檔案夾中而無需再向我詢問目标目錄。

怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案
怎樣在 Linux 系統中恢複已删除檔案怎樣在 Linux 系統中恢複已删除檔案

當這些步驟完成後,重複按“q”鍵直到看到正常的終端模樣。目錄"xaiml_dataset" 隻能被 root 使用者通路。為了解決這個問題,使用 root 權限改變該目錄及其子目錄的權限。做完這些後,檔案便被恢複了且使用者可以通路它們。

為了從 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

假如電腦實際去清除那些删除的檔案,那麼就需要花費更長的時間去執行删除任務。将某些空間标記為空位是快速且容易的,但使得檔案永遠消失需要花費一定的時間。例如,擦除一個存儲單元,可能需要花費幾個小時的時間(根據磁盤容量大小)。總之,現在的系統工作的就挺好,因為即便使用者清空了垃圾箱,他們仍然有另一次機會來改變他們當初的想法(或錯誤)。

----------------------------------------------------------------------------------------------------------------------------

原文釋出時間:2015-02-25

本文來自雲栖合作夥伴“linux中國”

繼續閱讀