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

2021-03-31 08:56:28 字數 3786 閱讀 6412

與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. 超級塊

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. 刪除乙個檔案

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,***p()引數是實現搜尋條件的函式。

long searchfs(char *fsname , int ***p())

fclose(fp);

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

} ⑵精確長度搜尋法

如果知道被刪除檔案的精確長度(位元組數),那麼可根據乙個資料塊的大小,計算出檔案的最後乙個資料塊中資料的精確長度,該資料塊中其他位元組必然是全0。根據這一條件,通過搜尋整個檔案系統,找出其中符合條件的資料塊,若出現多個塊符合要求,則還需要根據其他條件區分。但不管怎樣,根據精確長度分析也是恢復資料的乙個策略。

⑶內容關聯法

如果知道檔案內容中存在某種可實現的關聯,例如檔案的校驗和,或者檔案內容的某種上下文關係,那麼也可通過搜尋整個檔案系統,通過反覆嘗試尋找符合關聯條件的磁碟資料塊,進而恢復乙個檔案。

⑷環境比較法

如果知道刪除檔案所在的檔案系統的安裝過程,那麼,另行找一台完全相的機器,按原來完全相同的步驟安裝相同版本的unix和相應的其他軟體,可以想象,新的機器環境會與原來的環境基本相同,比較兩個機器上相同檔案系統的內容,可以推斷出被刪除檔案的大致位置,至少可以大大減少查詢的範圍,一旦查詢的範圍足夠小時,可以用逐個觀察和嘗試的方法結合其他條件恢復資料,降低恢復的難度,增加恢復的可靠性。

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

摘自:ccpi.gov.**

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

與dos windows不同,unix檔案被刪除後很難恢復,這是由unix獨特 的檔案系統結構決定的。unix檔案目錄不像dos windows那樣,文 件即使被刪除之後仍儲存有完整的檔名 檔案長度 始簇號 即 檔案占有的第乙個磁碟塊號 等重要資訊 相反,它的檔案資訊全部 依靠一種被稱為i節點的資料...

Unix系統下的檔案恢復

具體 熊雄 unix操作系統自七十年代初在bell實驗室誕生以來,以其高效率 良好的開放性 安全性和穩定性深受使用者的歡迎,到目前歷經三十餘年市場風雲變換,依然在企業級操作系統市場上佔據巨大份額。特別是與其他主流操作系統相比,unix系統突出的穩定性和安全性使其成為資料伺服器或者檔案伺服器的首選操作...

git 恢復被刪除的檔案

剛接觸 git 的時候,當碰到之前刪除某個檔案 比如 後面開發又需要恢復的時候,會採取非常笨的方法。從某乙個檔案存在的 commit 切換出乙個新的分支,再將需要的某個檔案拷貝出來。像是類的檔案有時候會直接叫 ui 設計師再發乙份。這種需要恢復檔案情況不多時 好像確實也不是太多,目前本人遇到這種情況...