大家都知道,在linux系統中是沒有資源回收筒的概念的,一旦rm指令删除某個檔案之後,就找不回來。不過其實這時還是有救的,之前大概清楚個概念,知道有救,但如何救就沒怎麼詳細去了解了。那麼這次我們來實際操作下。

其實為什麼說還有救呢?說這個之前需要對ext3檔案系統有個大概的了解。 在ext3檔案系統中我們建立一個檔案時,它首先會在ext3檔案系統的inode表申請個inode号,然後再将檔案的資訊以及資料寫入。那麼inode号又是什麼呢? inode号裡面包括兩部分,一個是metadata,即是中繼資料,簡單了解就是這個檔案的檔案名,大小,權限,通路時間等等,也就是除了這個檔案的内容資料之外的資訊。 如圖,建立了一個新檔案“testfile”,我們可以用stat指令來檢視它的資訊;
另一個是一個 pointer 指針。該指針指向真正的資料存放的block資料區。是以通常在我們檢視一個檔案内容時,我們通過檔案名找到對應的inode号,然後再通過這個inode号裡面的指針,再找到真正的資料。
ext3檔案系統恢複被删檔案
而一個檔案對應一個inode号,無論檔案小到1,2k還是大到1,2gb都一樣。在我們建立檔案系統時,就會自動建立inode表,我們的inode号也就屬于,來自于這個inode表。當然預設的inode表也是有大小的。達到了預設的上限值後,我們就無法建立檔案咯。 我們可以通過“df -i”這個指令去檢視,每個檔案系統的inode的使用情況。通常按照預設的劃分都夠用了。當然如果你的伺服器專門處理些小郵件,小檔案的,你可以适當調整inode表的大小,讓它更大一些。 如圖,我們可以看到各檔案系統的inode的總數量,以及使用了多少,剩餘多少,以及占用的百分比;
那麼當我們執行指令,“rm -f testfile” 時,這時其實删除的隻是對應這個檔案的檔案名與其inode的關聯,資料其實還在,同時這個檔案之前所占用的inode号被标記為可用狀态,是以這個使用就不要再建立新的檔案了,也就是對這個檔案系統不要做任何動作,我想這個大家也都清楚。因為如果再建立新的檔案,在ext3檔案系統中,新的檔案會複用之前被标記為可用狀态的inode号,而這時你的資料也就岌岌可危了。
如上圖,test檔案inode号為98315,而删除之後,再建立個新的檔案,它的inode号使用了之前空餘出的相同的inode号。當然這個在不同檔案系統是不同的,例如在redhat的gfs檔案系統中,被删的檔案的inode号是會保留下來的,新的檔案會用新的inode号。當然在gfs中也可以通過指令的形式去清空無效被删的inode号,将其還原成可被用的狀态。
那麼我們現在知道資料還是存在的,那麼接着我們如何來恢複呢? 首先我們需要一個恢複資料的工具,所謂工欲善其事,必先利其器; 我們先來下載下傳,編譯下這個ext3grep軟體吧,當然前提要安裝好gcc噢!
<code>wget http://ext3grep.googlecode.com/files/ext3grep-0.10.1.tar.gz</code>
<code>tar -zxvf ext3grep-0.10.1.tar.gz</code>
<code>cd ext3grep-0.10.1</code>
<code>./configure</code>
<code>make</code>
<code>make install</code>
安裝好後,我們就先在準備下環境,單獨挂載個檔案系統,在删除個檔案。這時我們看到之前檔案的inode号為8052。在處理前,我們需要先解除安裝該檔案系統。
但若因某程序,持續通路該檔案系統,無法解除安裝,可通過以下方式 kill掉正在使用這個目錄的程序:
<code>fuser -k /test</code>
當然,這樣做如果你不好確定是否安全的話,可以先運作lsof這個指令,來檢視是以連接配接到這個目錄的程序:
<code>lsof +d /test </code>
确認好了然後再kill掉。
我們首先執行:
<code>ext3grep /dev/sdb1 --ls --inode 2</code>
/dev/sdb1 是我之前解除安裝的ext3檔案系統。
--inode 2 的意思是指定從/dev/sdb1的檔案系統的root根來尋找。
這時我們從上圖黃色辨別的地方找到了web目錄的inode号,然後我們接着對web目錄的inode号來搜尋,當然這裡還顯示了一個之前删除的檔案web.txt。
如上圖,我們可以看到webfile和它的inode号,8052。 然後指定相關路徑,以及被删的檔案。
當我們看到 restoring web/webfile時,說明已經成功恢複了。 接着在執行指令的目前目錄下找到restored_files目錄下的對應目錄的被删檔案,然後我們可以看到被删檔案的内容和之前一樣。 然後我們再将之前的/dev/sdb1挂載起來。
這時我們可以看到在該目錄的檔案已經被恢複成功了。
<b> 原文釋出時間為:2013-03-31</b>
<b>本文來自雲栖社群合作夥伴“linux中國”</b>