周五下午7點接到電話並沒有什麼希奇;當一個人在家中工作時,別人總是可以找到他的。不尋常的電話另外一端說話的語調;其嚴重程度是絕對不會弄錯的。電話的另一端,我的一個同事正向我解釋一個腳本中的錯誤空格是如何把我們開發用的計算機上的整個home目錄樹都刪除的。 在我向他解釋Linux自己並沒有一個真正恢復的工具之後,我們就開始從備份磁帶上恢復文件了。到星期一早晨為止,大部分內容已經恢復原樣了。 在事情發生的那一刻,我忘記了一點事情。在Linux系統中,恢復刪除的文件是可能的,但是這需要在文件被刪除之後就盡快進行。和Windows中的情況類似,如果你等的時間太長了,那麼這些文件的內容可能就已經被覆蓋了。 在1998年我使用Midnight Commander文件管理器工作時我就已經知道這種特性了。delete鍵會刪除鼠標所在的文件,也可能會把已經選中的文件全部刪除。我希望刪除鼠標所在的文件愛你,但是卻忘記了自己文檔目錄下所有的文件都已經選中了——你可以猜想會發生什麼事情。當然,這不是文件管理器的錯;在想到自己已經選定了多個文件這一事實之前,我就對刪除請求進行了確認。 後來當然我又想起來了!*笑* Steven Hirsch,一個Linux的良師益友,他是如此的友善,給我解釋了如何使用(一個特定編譯的版本)Midnight Commander來恢復文件。具有諷刺意義的是,這個曾經以Linux裡所能見到的瘋狂的速度刪除文件的工具居然是我恢復文件的最佳希望。 在我真誠地希望你不會看到成百上千的必須文件高速消失時,我希望你已經准備好了黎明的到來。你可能希望作為root用戶執行;我們會加載並卸載分區,並使用這些原始的磁盤分區進行工作。就象下面的例子一樣,如果你要卸載諸如/home之類的分區,這可能尤其必要。 在你的系統上取得Midnight Commander的一份拷貝 雖然它不是唯一具有恢復刪除文件能力的程序,但是它是我最熟悉的恢復刪除文件的工具。現在,缺省情況下MC已經包含了恢復刪除文件的代碼。如果你的發行版本中沒有MC,就從http://www.gnome.org/mc/獲取一份拷貝並在系統中安裝上。 進行恢復的最好時機是在你刪除文件之後——你希望要把恢復的文件盡可能少變動地恢復到文件系統中。 建立一個測試文件並將這個文件刪除 你應該在需要的時候可以加載並卸載的分區上執行這些操作——不要在你的web server的主分區上執行這些操作。 選取一個非root的分區(使用mount命令來查看已經加載的分區)。對於本例來說,讓我們假定/dev/sdd1是加載在/home上的。這樣創建一個測試文件: echo "Just a test file" >/home/testfile rm -f /home/testfile 如果你是在root分區(或者更糟糕的情況,你只有一個分區)上創建的這個文件,那麼你就要在下個月我介紹如何在root分區上安全操作時再來看一下了。 卸載刪除文件的分區 在本例中,這可以通過執行下面的命令來實現: umount /dev/sdd1 不要試圖在一個已經加載的分區上恢復文件——這樣你可能會破壞磁盤。 啟動Midnight Command並選擇要恢復的文件 mc 在mc中,輸入: cd undel:/dev/sdd1 你只能在mc中使用這個命令,其它地方都不行。在mc中使用“cd”命令和在命令提示符中的效果相同;該命令會改變目錄。這個特定語法的命令指示mc顯示該分區上所有刪除的可以恢復的文件,而不是顯示目錄中的文件。 耐心等待一會,mc正在整個ext2文件系統上查找刪除的inode(i節點)(一個inode中包含了一個文件的_contents_,但是沒有文件名)。大約一分鐘左右,你就會在這個窗口中看到一個顯示有一些名字類似“23434632:2”的文件列表。這些項的日期和時間是對應的inode被刪除的日期和時間。我發現最有用的是對這個窗口根據時間進行排序: , r, s, m, 或者 , l, s, m, 你也可以使用 “查看”特性來觀察inode的內容。在你認為刪除文件的時間靠近窗口中列出的時間的文件上面按下<ins>鍵。這樣就把這些文件立即標記成已恢復的。 恢復文件 在其它窗口(使用鍵在mc中切換窗口)中,在/tmp下建立一個空目錄,例如/tmp/deletedfiles。 mkdir /tmp/deletedfiles 現在切換回unel窗口並按下鍵把這些文件拷貝到實際的文件系統中。如果你已經處理完了,就可以按下鍵離開mc——見屏幕底部的說明。 現在是重新加載/home分區的最好時機,使用下面的命令: mount /home 現在,你可能希望逐個查看一下這些文件,並確定實際的名字應該是什麼。既然這些文件都在/tmp/deletedfiles目錄中,你可以把它們和其它文件一樣處理,例如: cd /tmp/deletedfiles mv 23434632:2 /home/testfile 如果你多次刪除了一個文件,那麼你就會得到一個文件的多個拷貝;你需要確定哪個文件是你希望保留的。 就是這樣,你已經從Linux分區中恢復出文件來了。 對於這種處理方法有幾點需要注意。首先,這種特殊的恢復技巧只能在ext2分區上工作。其次,如果文件是在運行2.0.x版本的內核的系統上刪除的,那麼恢復過程只能最大可以恢復文件的前面12288字節。這是刪除過程中的一個bug,它沒有把文件作為一個整體保留到文件刪除為止。可能在比我使用的更新的2.0.x版本的內核中已經修正了這個問題,但是我知道在2.2.x版本的內核中這個問題已經修正了。 這種特性的榮譽應該歸功於Ted T’so和其它ext2文件系統的作者,也應該歸功於Miguel de Icaza和其它的MC的作者。 十分感謝Bob DeRosa,感謝他允許我再次在LinuxMonth中發表文章。 William 是Vermont, USA的一個Open-Source的開發者、狂熱的追求者和倡導者。