我們知道Unix刪除一個文件的過程很簡單,那就是釋放索引節點表和文件占用的數據塊,清空文件占用的索引節點,但不清除文件內容。但刪除文件與刪除目錄的處理不盡相 同,不同命令刪除文件的過程也不相同。
Unix刪除一個文件的具體步驟是: 根據文件i節點的地址表逐一釋放文件占用的磁盤數據塊,然後清空相應的節點,最後釋放i節點。 刪除一個目錄的過程是: 首先逐一刪除目錄裡的所有文件,然後刪除目錄。目錄本身也是一個文件,故Unix刪除方法與刪除文件一致。
要恢復被刪除的文件,只能根據刪除後留下的東西去做文章。Unix刪除文件後留下了什麼呢?由上述分析可知: 其一,留下了文件的內容; 其二,留下了“現場”。文件的恢復策略只能從這兩個方面來分析。
1.根據磁盤現場進行恢復
如果文件被刪除,現場未被破壞(即文件被刪除後硬盤未發生過寫操作),而且假定只Unix刪除了一個文件,那麼可根據系統的分配算法進行恢復。因為系統建立一個文 件時,必定根據某一特定的分配算法決定文件占用的數據塊位置。
而當Unix刪除該文件後,它所占用的數據塊被釋放,又回到系統的分配表中,這時如果重新建立一個 文件,系統根據原來的分配算法分配出的數據塊必定跟該文件原來占用的數據塊一致。
而且我們知道,Unix文件最後一個數據塊尾部多出的字節是全部置0的, 據此只要調用系統的數據分配算法,在系統中一塊一塊地申請數據塊,只要發現一個分配出的數據塊中尾部全為0,即可認為文件結束,由此可確定文件長度和內 容,進而實現恢復。方法如下:
● 申請一個索引節點,即向系統申請創建一個新文件名而不寫入任何內容。如: #>/tmp/xx。
● 調用系統分配數據塊算法getnextfreeblock()得到一個數據塊號,記入某一地址表變量中。
● 讀出這個數據塊,判斷其尾部是否全部連續為0,若不是,則回到第二步,若是,則進行第四步。
● 首先用系統函數fstat得到/tmp/xx的i節點號,然後將第二步所得的地址表寫入索引節點的地址表中(注意間址問題),並根據數據塊個數和最後一塊中有效數據長度計算出文件大小,寫入i節點的di_size字段。
● 回寫系統的索引節點表即可。
需要說明的是: 第一,系統分配數據塊的算法因不同的Unix版本而不同; 第二,有的Unix如SCO Unix 5.0版,其空閒數據塊的分配和回收是使用一種動態鏈表的數據結構來實現的,它們的文件恢復更加容易,只要在空閒鏈表中的表尾去尋找即可。 Unix刪除的文件找回方法,我們就講解到這裡。