UNIX系統被刪檔案的恢復策略(轉)

amyz發表於2007-08-10
UNIX系統被刪檔案的恢復策略(轉)[@more@]

  與DOS/Windows不同,UNIX檔案被刪除後很難恢復,這是由UNIX獨特的檔案系統結構決定的。UNIX檔案目錄不像DOS/Windows那樣,檔案即使被刪除之後仍儲存有完整的檔名、檔案長度、始簇號(即檔案佔有的第一個磁碟塊號)等重要資訊;相反,它的檔案資訊全部依靠一種被稱為i節點的資料結構來描述,而i節點在相應檔案被刪除之後即被清空,因此,要想直接恢復被刪除的檔案內容幾乎是不可能的,必須另闢蹊徑。本文結合實際,討論幾種檔案恢復策略及其關鍵步驟的具體實現。

  一、UNIX檔案系統結構

  我們知道,UNIX是以檔案卷作為其檔案系統儲存格式的,而不同的UNIX系統,檔案卷格式是有差異的,甚至即使是同一UNIX作業系統的不同版本,其檔案系統未必完全相同,例如:SCO UNIX 4.1版與5.0版檔案系統結構就有明顯差異,但只要是UNIX系統,其檔案卷的基本結構是一致的。分析如下:

  不管是什麼UNIX系統,不管什麼版本,其檔案卷至少包括引導塊、超級塊、i節點表、資料區等幾個部分。除此之外,不同UNIX版本可能還有不同的差異。例如:SCO UNIX系統的點陣圖索引塊和點陣圖塊AIX的邏輯卷表等。這些系統的特殊性不影響下文的恢復策略,故這裡不作討論,僅介紹標準UNIX檔案卷結構。

  1. 引導塊

  位於檔案卷最開始的第一扇區,這512位元組是檔案系統的引導程式碼,為根檔案系統所特有,其他檔案系統這512位元組為空。

  2. 超級塊

  位於檔案系統第二扇區,緊跟引導塊之後,用於描述本檔案系統的結構。如i節點長度、檔案系統大小等,其結構存放於/usr/include/sys/filsys.h中,其結構如下:

  struct filsys

{

ushort s_isize; /*磁碟索引節點區所佔用的資料塊數*/

daddr_t s_fsize; /*整個檔案系統的資料塊數*/

short s_nfree; /*在空閒塊登入表中當前登記的空閒塊數目*/

daddr_t s_free[NICFREE]; /*空閒塊登記表*/

short s_ninode; /*空閒索引節點數*/

ino_t s_inode[NICINOD]; /*空閒節點登記表*/

char s_flock; /*加鎖標誌位*/

char s_ilock; /*節點加鎖標誌位*/

char s_fmod; /*超級塊修改標誌*/

char s_ronly; /*檔案系統只讀標誌*/

time_t s_time; /*超級塊上次修改的時間*/

short s_dinfo[4]; /*裝置資訊*/

daddr_t s_tfree; /*空閒塊總數*/

ino_t s_tinode; /*空閒節點總數*/

char s_fname[6]; /*檔案系統名稱*/

char s_fpack[6];

long s_fill[13]; /*填空位*/

long s_magic; /*指示檔案系統的幻數*/

long s_type; /*新檔案系統型別*/

};

  3. i節點表

  i節點表存放在超級塊之後,其長度是由超級塊中的s_isize欄位決定的,其作用是用來描述檔案的屬性、長度、屬主、屬組、資料塊表等,其資料結構在/usr/include/sys/ino.h中,如下:

  struct dinode

{

ushort di_mode;

short di_nlink;

ushort di_uid;

ushort di_gid;

off_t di_size;

char di_addr[40];

time_t di_atime;

time_t di_mtime;

time_t di_ctime;

};

  4. 目錄結構

  UNIX所有檔案均存放於目錄中,目錄本身也是一個檔案。目錄存放檔案的機制如下:首先,目錄檔案本身也象普通檔案一樣,佔用一個索引節點,其次,由這個索引節點得到目錄內容的存放位置,再次,從其內容中取出一個個的檔名和它對應的節點號,從而訪問一個檔案。目錄結構如下:

  索引節點號(2位元組) .(本目錄)(14位元組)

  索引節點號(2位元組) ..(父目錄)(14位元組)

  索引節點號(2位元組) 檔名(14位元組)

  索引節點號(2位元組) 檔名(14位元組)

  索引節點號(2位元組) 檔名(14位元組)

  由上可知檔名是依靠目錄來描述的,檔案的內容和其他資訊則由索引節點來描述。

  二、檔案的刪除過程

  UNIX下刪除一個檔案的過程很簡單,那就是釋放索引節點表和檔案佔用的資料塊,清空檔案佔用的索引節點,但不清除檔案內容。但刪除檔案與刪除目錄的處理不盡相同,不同命令刪除檔案的過程也不相同。

  1. 刪除一個檔案

  UNIX 刪除一個檔案的具體步驟是:根據檔案i節點的地址表逐一釋放檔案佔用的磁碟資料塊,然後清空相應的節點,最後釋放i節點。

  2. 刪除一個目錄

  刪除一個目錄的過程:首先逐一刪除目錄裡的所有檔案,然後刪除目錄。目錄本身也是一個檔案,故刪除方法與刪除檔案一致。

  3. 幾種不同的刪除命令

  .rm 命令

  一般刪除命令,刪除過程上述已說明。

  .mv命令

  格式:mv 檔案1 檔案2

  處理過程是將檔案2的資料塊釋放,然後將檔案1的名稱改為檔案2,再釋放檔案2所佔的i節點。

  . > 命令

  格式:>檔名

  若產生一個新檔案,>命令僅僅申請一個i節點,而不寫入任何檔案內容;若清空一個已經存在的檔案,則釋放檔案所佔的資料塊,並將檔案長度清零。

  三、被刪檔案的恢復策略

  要恢復被刪除的檔案,只能根據刪除後留下的東西去做文章。檔案被刪除後留下了什麼呢?由上述分析可知:其一、留下了檔案的內容;其二、留下了“現場”。檔案的恢復策略只能從這兩個方面來分析。以下談幾種恢復策略。

  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系統下檔案系統恢復的具體實現依賴於不同作業系統和不同版本的具體檔案系統結構和磁碟塊分配演算法。本文試圖總結出一種一般性的思路和策略,限於篇幅,不能詳細討論它們的具體實現過程。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941408/,如需轉載,請註明出處,否則將追究法律責任。

相關文章