如何恢復被刪除的文件
信息來源:
優度網絡 發布日期:2009/3/25 瀏覽數量:
1077次
文章導讀:
被刪文件的恢復策略
要恢復被刪除的文件,只能根據刪除后留下的東西去做文章。文件被刪除后留下了什么呢?由上述分析可知:其一、留下了文件的內容;其二、留下了“現場”。文件的恢復策略只能從這兩個方面來分析。以下談幾種恢復策略。
1.根據磁盤現場進行恢復
如果文件被刪除,現場未被破壞(即文件被刪除后硬盤未發生過寫操作),而且假定只刪除了一個文件,那么可根據系統的分配算法進行恢復。因為系統建立一個文件時,必定根據某一特定的分配算法決定文件占用的數據塊位置。而當該文件被刪除后,它所占用的數據塊被釋放,又回到系統的分配表中,這時如果重新建立一個文件,系統根據原來的分配算法分配出的數據塊必定跟該文件原來占用的數據塊一致,而且我們知道,UNIX文件最后一數據塊尾部多出的字節是全部置0的,據此只要調用系統的數據分配算法,在系統中一塊塊的申請數據塊,因為UNIX文件最后一個數據塊尾部多出的字節全部為0,所以,只要發現一個分配出的數據塊中尾部全為0,即可認為文件結束,由此可確定文件長度和內容,進而實現恢復。方法如下:
⑴申請一個索引節點,即向系統申請創建一個新文件名而不寫入任何內容。如:#>/tmp/xx
⑵調用系統分配數據塊算法getnextfreeblock()得到一個數據塊號,記入某一地址表變量中。
⑶讀出這個數據塊,判斷其尾部是否全部連續為0,若不是,則回到(2),若是,則進行(4)。
⑷首先用系統函數fstat得到/tmp/xx的i節點號,然后將(2)步所得的地址表寫入索引節點的地址表中(注意間址問題),并根據數據塊個數和最后一塊中有效數據長度計算出文件大小,寫入i節點的di_size字段。
⑸回寫系統的索引節點表即可。
需要說明的是,第一,系統分配數據塊的算法因不同的UNIX版本而不同;第二,有的UNIX如SCO UNIX 5.0版,其空閑數據塊的分配和回收是使用一種動態鏈表的數據結構來實現的,它們的文件恢復更加容易,只要在空閑鏈表中的表尾去尋找即可,筆者另行描述。
2. 根據內容恢復。
若現場已被破壞,即硬盤發生過寫操作,那么只好根據內容來恢復。而且,由于UNIX是一個多進程、多用戶系統,它每一次開關機或硬件、通訊故障等都會記錄系統日志、.sh_history等,硬盤現場被破壞可能性極大。因此討論按內容恢復的方法具有更大的實用價值。筆者經過實際探索得出下列四種恢復策略供參考。
⑴關鍵字搜索法
如果知道被刪除的文件內容中若干字節的內容,而且該文件長度又不超過一個磁盤塊,那么可以在整個文件系統中搜索這一字節串,得出一個文件所在的數據塊,將它們的塊號填入一個i節點,即可恢復一個文件,搜索文件系統的算法很簡單,說明如下:
a. #df -k 確定文件系統的設備文件名(如/dev/root)
b.用下述函數搜索,若成功,返回數據塊號,反之返回-1。其中fsname是文件系統的設備名,如/dev/root,comp()參數是實現搜索條件的函數。
long searchfs(char *fsname , int comp())
{
FILE *fp;
char buf[1024];
long i=0;
fp=fopen(fsname,"r");
while (!feof(fp))
{
fread(buf,1024,1,fp);
if (comp()) /* 檢查是否符合搜索條件 */
return i; /* 若成功返回塊號 */
i++;
}
fclose(fp);
return -1; /* 未找到符合條件的塊,返回-1*/
}
⑵精確長度搜索法
如果知道被刪除文件的精確長度(字節數),那么可根據一個數據塊的大小,計算出文件的最后一個數據塊中數據的精確長度,該數據塊中其他字節必然是全0。根據這一條件,通過搜索整個文件系統,找出其中符合條件的數據塊,若出現多個塊符合要求,則還需要根據其他條件區分。但不管怎樣,根據精確長度分析也是恢復數據的一個策略。
⑶內容關聯法
如果知道文件內容中存在某種可實現的關聯,例如文件的校驗和,或者文件內容的某種上下文關系,那么也可通過搜索整個文件系統,通過反復嘗試尋找符合關聯條件的磁盤數據塊,進而恢復一個文件。
⑷環境比較法
如果知道刪除文件所在的文件系統的安裝過程,那么,另行找一臺完全相的機器,按原來完全相同的步驟安裝相同版本的UNIX和相應的其他軟件,可以想象,新的機器環境會與原來的環境基本相同,比較兩個機器上相同文件系統的內容,可以推斷出被刪除文件的大致位置,至少可以大大減少查找的范圍,一旦查找的范圍足夠小時,可以用逐個觀察和嘗試的方法結合其他條件恢復數據,降低恢復的難度,增加恢復的可靠性。
UNIX系統下文件系統恢復的具體實現依賴于不同操作系統和不同版本的具體文件系統結構和磁盤塊分配算法。本文試圖總結出一種一般性的思路和策略,限于篇幅,不能詳細討論它們的具體實現過程。