恢復Unix系統被刪除地文件
恢復Unix系統被刪除地文件
與DOS/Windows不同,Unix文件被刪除后很難恢復,這是由Unix獨特的文件系統結構決定的。所以,要想恢復這些文件,就需要另辟蹊徑。?
(如右圖)Unix文件系統的特殊性決定了它不能像Windows系統那樣恢復被刪除的文件。
Unix文件目錄不像DOS/Windows那樣,文件即使被刪除之后仍保存有完整的文件名、文件長度、始簇號(即文件占有的第一個磁盤塊號)等重要信息。相反,它的文件信息全部依靠一種被稱為i節點的數據結構來描述,而i節點在相應文件被刪除之后即被清空,因此,要想直接恢復被刪除的文件內容幾乎是不可能的,必須另辟蹊徑。本文結合實際,討論幾種文件恢復策略及其關鍵步驟的具體實現。
不過,需要說明的是,Unix系統下文件系統恢復的具體實現依賴于不同操作系統和不同版本的具體文件系統結構和磁盤塊分配算法(見附文)。本文只是試圖總結出一種一般性的思路和策略,限于篇幅,不能詳細討論它們的具體實現過程。
Unix文件系統結構
我們知道,Unix是以文件卷作為其文件系統存儲格式的,而不同的Unix系統,文件卷格式是有差異的,甚至即使是同一Unix操作系統的不同版本,其文件系統也未必完全相同,例如: SCO Unix 4.1版與5.0版文件系統結構就有明顯差異,但只要是Unix系統,其文件卷的基本結構是一致的。
不管是什么Unix系統,不管什么版本,其文件卷至少包括引導塊、超級塊、i節點表、數據區等幾個部分。
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所有文件均存放于目錄中,目錄本身也是一個文件。目錄存放文件的機制如下: 首先,目錄文件本身也象普通文件一樣,占用一個索引節點; 其次,由這個索引節點得到目錄內容的存放位置; 再次,從其內容中取出一個個的文件名和它對應的節點號,從而訪問一個文件。
由此可知文件名是依靠目錄來描述的,文件的內容和其他信息則由索引節點來描述。
被刪文件的恢復策略
Unix下刪除一個文件的過程很簡單,那就是釋放索引節點表和文件占用的數據塊,清空文件占用的索引節點,但不清除文件內容。但刪除文件與刪除目錄的處理不盡相同,不同命令刪除文件的過程也不相同。 Unix 刪除一個文件的具體步驟是: 根據文件i節點的地址表逐一釋放文件占用的磁盤數據塊,然后清空相應的節點,最后釋放i節點。 刪除一個目錄的過程是: 首先逐一刪除目錄里的所有文件,然后刪除目錄。目錄本身也是一個文件,故刪除方法與刪除文件一致。
要恢復被刪除的文件,只能根據刪除后留下的東西去做文章。文件被刪除后留下了什么呢?由上述分析可知: 其一,留下了文件的內容; 其二,留下了“現場”。文件的恢復策略只能從這兩個方面來分析。
1.根據磁盤現場進行恢復
如果文件被刪除,現場未被破壞(即文件被刪除后硬盤未發生過寫操作),而且假定只刪除了一個文件,那么可根據系統的分配算法進行恢復。因為系統建立一個文件時,必定根據某一特定的分配算法決定文件占用的數據塊位置。而當該文件被刪除后,它所占用的數據塊被釋放,又回到系統的分配表中,這時如果重新建立一個文件,系統根據原來的分配算法分配出的數據塊必定跟該文件原來占用的數據塊一致。而且我們知道,Unix文件最后一個數據塊尾部多出的字節是全部置0的,據此只要調用系統的數據分配算法,在系統中一塊一塊地申請數據塊,只要發現一個分配出的數據塊中尾部全為0,即可認為文件結束,由此可確定文件長度和內容,進而實現恢復。方法如下:
● 申請一個索引節點,即向系統申請創建一個新文件名而不寫入任何內容。如: #>/tmp/xx。
● 調用系統分配數據塊算法getnextfreeblock()得到一個數據塊號,記入某一地址表變量中。
● 讀出這個數據塊,判斷其尾部是否全部連續為0,若不是,則回到第二步,若是,則進行第四步。
● 首先用系統函數fstat得到/tmp/xx的i節點號,然后將第二步所得的地址表寫入索引節點的地址表中(注意間址問題),并根據數據塊個數和最后一塊中有效數據長度計算出文件大小,寫入i節點的di_size字段。
● 回寫系統的索引節點表即可。
需要說明的是: 第一,系統分配數據塊的算法因不同的Unix版本而不同; 第二,有的Unix如SCO Unix 5.0版,其空閑數據塊的分配和回收是使用一種動態鏈表的數據結構來實現的,它們的文件恢復更加容易,只要在空閑鏈表中的表尾去尋找即可。
2. 根據內容恢復
若現場已被破壞,即硬盤發生過寫操作,那么只好根據內容來恢復。而且,由于Unix是一個多進程、多用戶系統,它每一次開關機或硬件、通信故障等都會記錄系統日志、.sh_history等,硬盤現場被破壞的可能性極大。因此討論按內容恢復的方法具有更大的實用價值。筆者經過實際探索得出下列四種恢復策略供參考。
● 關鍵字搜索法
如果知道被刪除的文件內容中若干字節的內容,而且該文件長度又不超過一個磁盤塊,那么可以在整個文件系統中搜索這一字節串,得出一個文件所在的數據塊,將它們的塊號填入一個i節點,即可恢復一個文件。搜索文件系統的算法很簡單,說明如下: 首先,用“#df -k”命令確定文件系統的設備文件名(如/dev/root); 然后,用下述函數搜索,若成功,返回數據塊號,反之返回-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和相應的其他軟件。可以想象,新的機器環境會與原來的環境基本相同,比較兩個機器上相同文件系統的內容,可以推斷出被刪除文件的大致位置,至少可以大大減少查找的范圍,一旦查找的范圍足夠小時,就可以用逐個觀察和嘗試的方法結合其他條件恢復數據,降低恢復的難度,增加恢復的可靠性。 (作者單位: 中國人民銀行撫州市中心支行 )
鏈接
SCO Unix磁盤塊分配算法
由于一個磁盤塊的大小為1024字節,所以一個位圖塊可以管理0x400×8=0x2000個磁盤塊。那么,下一個位圖塊的塊號就是0x61d+0x2000=0x261d。這與位圖索引塊中的數據是相符的。那么,位圖塊0x61d管理著塊號為0x61d-0x261c的磁盤塊。由以上數據可見,在這個位圖塊中,第一個被使用的磁盤塊塊號是0x61d,即位圖塊本身。第一個空閑塊塊號由0x187401處字節0x1c的第2位指示,是0x627。由于該位圖塊是文件卷中的第一個位圖塊,所以0x627號磁盤塊也是文件卷中的第一個空閑塊。當我們向系統申請磁盤塊時,系統通過超級塊、位圖索引塊、位圖塊來尋找那些標志位為1的塊,然后將相應的標置位置0。當釋放一個磁盤塊時,系統就將相應的標志位置1。現在,我們就可以判斷出文件卷中的每一個磁盤塊是否被使用了。但是僅憑這些還不能完全恢復誤刪的文件,我們還得了解SCO Unix分配磁盤塊的算法。為了使一個文件所占用的磁盤塊相對集中,SCO Unix是按照特定的算法來選擇空閑塊分配給文件的。假設某文件所占用的最后一個磁盤塊的塊號為m,現在要再分配一磁盤塊給該文件,若該文件是新文件,則m=0。
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
相關閱讀:
- [通信網絡] SSH端口號是什么?SSH原理詳解分析 2023-10-16
- [軍用/航空電子] 聊聊無人機飛控的兩類操作系統介紹 2023-10-08
- [控制/MCU] 工控領域PLC時間轉換為UNIX時間做網絡同步比較 2023-10-04
- [嵌入式技術] linux知識中常用到的管道符號有哪些 2023-09-29
- [電子說] 服務器數據恢復-UNIX類文件系統常見故障&數據恢復可能性分析 2023-09-19
- [電子說] 在Linux或類Unix系統下如何確定端口是否正在使用? 2023-09-14
- [嵌入式技術] 如何應對重復的嵌入式開發工作的問題 2023-09-08
- [嵌入式技術] 什么是VIM?VIM文本編輯器的三種工作模式 2023-09-06
( 發表人:admin )