與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。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...