Linux檔案系統刪除檔案深入剖析

2021-06-05 22:38:42 字數 4566 閱讀 7890

與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 

; 3. i節點表 

i節點表存放在超級塊之後,其長度是由超級塊中的s_isize欄位

決定的,其作用是用來描述檔案的屬性、長度、屬主、屬組、數

據塊表等,其資料結構在/usr/include/sys/ino.h中,如下: 

struct dinode 

; 4. 目錄結構 

unix所有檔案均存放於目錄中,目錄本身也是乙個檔案。目

錄存放檔案的機制如下:首先,目錄檔案本身也象普通檔案一

樣,占用乙個索引節點,其次,由這個索引節點得到目錄內容的

存放位置,再次,從其內容中取出乙個個的檔名和它對應的節

點號,從而訪問乙個檔案。目錄結構如下: 

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

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

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

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

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

由上可知檔名是依靠目錄來描述的,檔案的內容和其他信

息則由索引節點來描述。 

二、檔案的刪除過程 

unix下刪除乙個檔案的過程很簡單,那就是釋放索引節點表

和檔案占用的資料塊,清空檔案占用的索引節點,但不清除檔案

內容。但刪除檔案與刪除目錄的處理不盡相同,不同命令刪除文

件的過程也不相同。 

1. 刪除乙個檔案 

一釋放檔案占用的磁碟資料塊,然後清空相應的節點,最後釋放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())   

fclose(fp); 

return -1; /* 未找到符合條件的塊,返回-1*/ 

} ⑵精確長度搜尋法 

如果知道被刪除檔案的精確長度(位元組數),那麼可根據乙個數

據塊的大小,計算出檔案的最後乙個資料塊中資料的精確長度,

該資料塊中其他位元組必然是全0。根據這一條件,通過搜尋整個文

件系統,找出其中符合條件的資料塊,若出現多個塊符合要求,

則還需要根據其他條件區分。但不管怎樣,根據精確長度分析也

是恢復資料的乙個策略。 

⑶內容關聯法 

如果知道檔案內容中存在某種可實現的關聯,例如檔案的校

驗和,或者檔案內容的某種上下文關係,那麼也可通過搜尋整個

檔案系統,通過反覆嘗試尋找符合關聯條件的磁碟資料塊,進而

恢復乙個檔案。 

⑷環境比較法 

如果知道刪除檔案所在的檔案系統的安裝過程,那麼,另行

找一台完全相的機器,按原來完全相同的步驟安裝相同版本的

unix和相應的其他軟體,可以想象,新的機器環境會與原來的環

境基本相同,比較兩個機器上相同檔案系統的內容,可以推斷出

被刪除檔案的大致位置,至少可以大大減少查詢的範圍,一旦查

找的範圍足夠小時,可以用逐個觀察和嘗試的方法結合其他條件

恢復資料,降低恢復的難度,增加恢復的可靠性。 

unix系統下檔案系統恢復的具體實現依賴於不同作業系統和

不同版本的具體檔案系統結構和磁碟塊分配演算法。本文試圖總結

出一種一般性的思路和策略,限於篇幅,不能詳細討論它們的具

體實現過程。 

深入EXT檔案系統型別(linux系統)

一 檔案系統型別和檔案型別的區別 root lbc ls al total 104052dr xr x 32 root root 4096 aug4 13 53.dr xr xr x.28 root root 4096 aug4 01 23.rw r r 1root root 0jul 2318 1...

linux 檔案系統 Linux 檔案系統結構介紹

ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...

linux檔案系統與根檔案系統

檔案系統 與 根檔案系統 要不我們就統一簡稱為fs和rfs 檔案系統 file system fs 根檔案系統 root file system rfs。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...