當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 遼寧OA系統(tǒng) > 沈陽OA系統(tǒng) > 沈陽OA快博
如何恢復(fù)Unix系統(tǒng)被刪除的文件
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
文章來源:泛普軟件與DOS/Windows不同,Unix文件被刪除后很難恢復(fù),這是由Unix獨(dú)特的文件系統(tǒng)結(jié)構(gòu)決定的。所以,要想恢復(fù)這些文件,就需要另辟蹊徑。
(如右圖)Unix文件系統(tǒng)的特殊性決定了它不能像Windows系統(tǒng)那樣恢復(fù)被刪除的文件。
Unix文件目錄不像DOS/Windows那樣,文件即使被刪除之后仍保存有完整的文件名、文件長度、始簇號(hào)(即文件占有的第一個(gè)磁盤塊號(hào))等重要信息。相反,它的文件信息全部依靠一種被稱為i節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)來描述,而i節(jié)點(diǎn)在相應(yīng)文件被刪除之后即被清空,因此,要想直接恢復(fù)被刪除的文件內(nèi)容幾乎是不可能的,必須另辟蹊徑。本文結(jié)合實(shí)際,討論幾種文件恢復(fù)策略及其關(guān)鍵步驟的具體實(shí)現(xiàn)?!?
不過,需要說明的是,Unix系統(tǒng)下文件系統(tǒng)恢復(fù)的具體實(shí)現(xiàn)依賴于不同操作系統(tǒng)和不同版本的具體文件系統(tǒng)結(jié)構(gòu)和磁盤塊分配算法(見附文)。本文只是試圖總結(jié)出一種一般性的思路和策略,限于篇幅,不能詳細(xì)討論它們的具體實(shí)現(xiàn)過程。
Unix文件系統(tǒng)結(jié)構(gòu)
我們知道,Unix是以文件卷作為其文件系統(tǒng)存儲(chǔ)格式的,而不同的Unix系統(tǒng),文件卷格式是有差異的,甚至即使是同一Unix操作系統(tǒng)的不同版本,其文件系統(tǒng)也未必完全相同,例如: SCO Unix 4.1版與5.0版文件系統(tǒng)結(jié)構(gòu)就有明顯差異,但只要是Unix系統(tǒng),其文件卷的基本結(jié)構(gòu)是一致的。
不管是什么Unix系統(tǒng),不管什么版本,其文件卷至少包括引導(dǎo)塊、超級(jí)塊、i節(jié)點(diǎn)表、數(shù)據(jù)區(qū)等幾個(gè)部分。
1. 引導(dǎo)塊
位于文件卷最開始的第一扇區(qū),這512字節(jié)是文件系統(tǒng)的引導(dǎo)代碼,為根文件系統(tǒng)所特有,其他文件系統(tǒng)這512字節(jié)為空。
2. 超級(jí)塊
位于文件系統(tǒng)第二扇區(qū),緊跟引導(dǎo)塊之后,用于描述本文件系統(tǒng)的結(jié)構(gòu)。如i節(jié)點(diǎn)長度、文件系統(tǒng)大小等,其結(jié)構(gòu)存放于/usr/include/sys/filsys.h中,其結(jié)構(gòu)如下:
struct filsys
{ ushort s_isize; /*磁盤索引節(jié)點(diǎn)區(qū)所占用的數(shù)據(jù)塊數(shù)*/
daddr_t s_fsize; /*整個(gè)文件系統(tǒng)的數(shù)據(jù)塊數(shù)*/
short s_nfree; /*在空閑塊登錄表中當(dāng)前登記的空閑塊數(shù)目*/
daddr_t s_free[NICFREE]; /*空閑塊登記表*/
short s_ninode; /*空閑索引節(jié)點(diǎn)數(shù)*/
ino_t s_inode[NICINOD]; /*空閑節(jié)點(diǎn)登記表*/
char s_flock; /*加鎖標(biāo)志位*/
char s_ilock; /*節(jié)點(diǎn)加鎖標(biāo)志位*/
char s_fmod; /*超級(jí)塊修改標(biāo)志*/
char s_ronly; /*文件系統(tǒng)只讀標(biāo)志*/
time_t s_time; /*超級(jí)塊上次修改的時(shí)間*/
short s_dinfo[4]; /*設(shè)備信息*/
daddr_t s_tfree; /*空閑塊總數(shù)*/
ino_t s_tinode; /*空閑節(jié)點(diǎn)總數(shù)*/
char s_fname[6]; /*文件系統(tǒng)名稱*/
char s_fpack[6];
long s_fill[13]; /*填空位*/
long s_magic; /*指示文件系統(tǒng)的幻數(shù)*/
long s_type; /*新文件系統(tǒng)類型*/ };
3. i節(jié)點(diǎn)表
i節(jié)點(diǎn)表存放在超級(jí)塊之后,其長度是由超級(jí)塊中的s_isize字段決定的,其作用是用來描述文件的屬性、長度、屬主、屬組、數(shù)據(jù)塊表等,其數(shù)據(jù)結(jié)構(gòu)在/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. 目錄結(jié)構(gòu)
Unix所有文件均存放于目錄中,目錄本身也是一個(gè)文件。目錄存放文件的機(jī)制如下: 首先,目錄文件本身也象普通文件一樣,占用一個(gè)索引節(jié)點(diǎn); 其次,由這個(gè)索引節(jié)點(diǎn)得到目錄內(nèi)容的存放位置; 再次,從其內(nèi)容中取出一個(gè)個(gè)的文件名和它對(duì)應(yīng)的節(jié)點(diǎn)號(hào),從而訪問一個(gè)文件。
由此可知文件名是依靠目錄來描述的,文件的內(nèi)容和其他信息則由索引節(jié)點(diǎn)來描述。
被刪文件的恢復(fù)策略
Unix下刪除一個(gè)文件的過程很簡單,那就是釋放索引節(jié)點(diǎn)表和文件占用的數(shù)據(jù)塊,清空文件占用的索引節(jié)點(diǎn),但不清除文件內(nèi)容。但刪除文件與刪除目錄的處理不盡相同,不同命令刪除文件的過程也不相同。 Unix 刪除一個(gè)文件的具體步驟是: 根據(jù)文件i節(jié)點(diǎn)的地址表逐一釋放文件占用的磁盤數(shù)據(jù)塊,然后清空相應(yīng)的節(jié)點(diǎn),最后釋放i節(jié)點(diǎn)。 刪除一個(gè)目錄的過程是: 首先逐一刪除目錄里的所有文件,然后刪除目錄。目錄本身也是一個(gè)文件,故刪除方法與刪除文件一致。
要恢復(fù)被刪除的文件,只能根據(jù)刪除后留下的東西去做文章。文件被刪除后留下了什么呢?由上述分析可知: 其一,留下了文件的內(nèi)容; 其二,留下了“現(xiàn)場”。文件的恢復(fù)策略只能從這兩個(gè)方面來分析。
1.根據(jù)磁盤現(xiàn)場進(jìn)行恢復(fù)
如果文件被刪除,現(xiàn)場未被破壞(即文件被刪除后硬盤未發(fā)生過寫操作),而且假定只刪除了一個(gè)文件,那么可根據(jù)系統(tǒng)的分配算法進(jìn)行恢復(fù)。因?yàn)橄到y(tǒng)建立一個(gè)文件時(shí),必定根據(jù)某一特定的分配算法決定文件占用的數(shù)據(jù)塊位置。而當(dāng)該文件被刪除后,它所占用的數(shù)據(jù)塊被釋放,又回到系統(tǒng)的分配表中,這時(shí)如果重新建立一個(gè)文件,系統(tǒng)根據(jù)原來的分配算法分配出的數(shù)據(jù)塊必定跟該文件原來占用的數(shù)據(jù)塊一致。而且我們知道,Unix文件最后一個(gè)數(shù)據(jù)塊尾部多出的字節(jié)是全部置0的,據(jù)此只要調(diào)用系統(tǒng)的數(shù)據(jù)分配算法,在系統(tǒng)中一塊一塊地申請(qǐng)數(shù)據(jù)塊,只要發(fā)現(xiàn)一個(gè)分配出的數(shù)據(jù)塊中尾部全為0,即可認(rèn)為文件結(jié)束,由此可確定文件長度和內(nèi)容,進(jìn)而實(shí)現(xiàn)恢復(fù)。方法如下:
● 申請(qǐng)一個(gè)索引節(jié)點(diǎn),即向系統(tǒng)申請(qǐng)創(chuàng)建一個(gè)新文件名而不寫入任何內(nèi)容。如: #>/tmp/xx。
● 調(diào)用系統(tǒng)分配數(shù)據(jù)塊算法getnextfreeblock()得到一個(gè)數(shù)據(jù)塊號(hào),記入某一地址表變量中。
● 讀出這個(gè)數(shù)據(jù)塊,判斷其尾部是否全部連續(xù)為0,若不是,則回到第二步,若是,則進(jìn)行第四步。
● 首先用系統(tǒng)函數(shù)fstat得到/tmp/xx的i節(jié)點(diǎn)號(hào),然后將第二步所得的地址表寫入索引節(jié)點(diǎn)的地址表中(注意間址問題),并根據(jù)數(shù)據(jù)塊個(gè)數(shù)和最后一塊中有效數(shù)據(jù)長度計(jì)算出文件大小,寫入i節(jié)點(diǎn)的di_size字段。
● 回寫系統(tǒng)的索引節(jié)點(diǎn)表即可。
需要說明的是: 第一,系統(tǒng)分配數(shù)據(jù)塊的算法因不同的Unix版本而不同; 第二,有的Unix如SCO Unix 5.0版,其空閑數(shù)據(jù)塊的分配和回收是使用一種動(dòng)態(tài)鏈表的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的,它們的文件恢復(fù)更加容易,只要在空閑鏈表中的表尾去尋找即可。
2. 根據(jù)內(nèi)容恢復(fù)
若現(xiàn)場已被破壞,即硬盤發(fā)生過寫操作,那么只好根據(jù)內(nèi)容來恢復(fù)。而且,由于Unix是一個(gè)多進(jìn)程、多用戶系統(tǒng),它每一次開關(guān)機(jī)或硬件、通信故障等都會(huì)記錄系統(tǒng)日志、.sh_history等,硬盤現(xiàn)場被破壞的可能性極大。因此討論按內(nèi)容恢復(fù)的方法具有更大的實(shí)用價(jià)值。筆者經(jīng)過實(shí)際探索得出下列四種恢復(fù)策略供參考。
● 關(guān)鍵字搜索法
如果知道被刪除的文件內(nèi)容中若干字節(jié)的內(nèi)容,而且該文件長度又不超過一個(gè)磁盤塊,那么可以在整個(gè)文件系統(tǒng)中搜索這一字節(jié)串,得出一個(gè)文件所在的數(shù)據(jù)塊,將它們的塊號(hào)填入一個(gè)i節(jié)點(diǎn),即可恢復(fù)一個(gè)文件。搜索文件系統(tǒng)的算法很簡單,說明如下: 首先,用“#df -k”命令確定文件系統(tǒng)的設(shè)備文件名(如/dev/root); 然后,用下述函數(shù)搜索,若成功,返回?cái)?shù)據(jù)塊號(hào),反之返回-1。其中fsname是文件系統(tǒng)的設(shè)備名,如/dev/root,comp()參數(shù)是實(shí)現(xiàn)搜索條件的函數(shù)。
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; /* 若成功返回塊號(hào) */
i++;
}
fclose(fp);
return -1; /* 未找到符合條件的塊,返回-1*/ }
● 精確長度搜索法
如果知道被刪除文件的精確長度(字節(jié)數(shù)),那么可根據(jù)一個(gè)數(shù)據(jù)塊的大小,計(jì)算出文件的最后一個(gè)數(shù)據(jù)塊中數(shù)據(jù)的精確長度,該數(shù)據(jù)塊中其他字節(jié)必然是全0。根據(jù)這一條件,通過搜索整個(gè)文件系統(tǒng),找出其中符合條件的數(shù)據(jù)塊,若出現(xiàn)多個(gè)塊符合要求,則還需要根據(jù)其他條件區(qū)分。但不管怎樣,根據(jù)精確長度分析也是恢復(fù)數(shù)據(jù)的一個(gè)策略。
● 內(nèi)容關(guān)聯(lián)法
如果知道文件內(nèi)容中存在某種可實(shí)現(xiàn)的關(guān)聯(lián),例如文件的校驗(yàn)和或者文件內(nèi)容的某種上下文關(guān)系,那么也可通過搜索整個(gè)文件系統(tǒng),通過反復(fù)嘗試尋找符合關(guān)聯(lián)條件的磁盤數(shù)據(jù)塊,進(jìn)而恢復(fù)一個(gè)文件。
● 環(huán)境比較法
如果知道刪除文件所在的文件系統(tǒng)的安裝過程,那么,另找一臺(tái)完全相同的機(jī)器,按原來完全相同的步驟安裝相同版本的Unix和相應(yīng)的其他軟件??梢韵胂?,新的機(jī)器環(huán)境會(huì)與原來的環(huán)境基本相同,比較兩個(gè)機(jī)器上相同文件系統(tǒng)的內(nèi)容,可以推斷出被刪除文件的大致位置,至少可以大大減少查找的范圍,一旦查找的范圍足夠小時(shí),就可以用逐個(gè)觀察和嘗試的方法結(jié)合其他條件恢復(fù)數(shù)據(jù),降低恢復(fù)的難度,增加恢復(fù)的可靠性。 (作者單位: 中國人民銀行撫州市中心支行 )
鏈接
SCO Unix磁盤塊分配算法
由于一個(gè)磁盤塊的大小為1024字節(jié),所以一個(gè)位圖塊可以管理0x400×8=0x2000個(gè)磁盤塊。那么,下一個(gè)位圖塊的塊號(hào)就是0x61d+0x2000=0x261d。這與位圖索引塊中的數(shù)據(jù)是相符的。那么,位圖塊0x61d管理著塊號(hào)為0x61d-0x261c的磁盤塊。由以上數(shù)據(jù)可見,在這個(gè)位圖塊中,第一個(gè)被使用的磁盤塊塊號(hào)是0x61d,即位圖塊本身。第一個(gè)空閑塊塊號(hào)由0x187401處字節(jié)0x1c的第2位指示,是0x627。由于該位圖塊是文件卷中的第一個(gè)位圖塊,所以0x627號(hào)磁盤塊也是文件卷中的第一個(gè)空閑塊。當(dāng)我們向系統(tǒng)申請(qǐng)磁盤塊時(shí),系統(tǒng)通過超級(jí)塊、位圖索引塊、位圖塊來尋找那些標(biāo)志位為1的塊,然后將相應(yīng)的標(biāo)置位置0。
當(dāng)釋放一個(gè)磁盤塊時(shí),系統(tǒng)就將相應(yīng)的標(biāo)志位置1?,F(xiàn)在,我們就可以判斷出文件卷中的每一個(gè)磁盤塊是否被使用了。但是僅憑這些還不能完全恢復(fù)誤刪的文件,我們還得了解SCO Unix分配磁盤塊的算法。為了使一個(gè)文件所占用的磁盤塊相對(duì)集中,SCO Unix是按照特定的算法來選擇空閑塊分配給文件的。假設(shè)某文件所占用的最后一個(gè)磁盤塊的塊號(hào)為m,現(xiàn)在要再分配一磁盤塊給該文件,若該文件是新文件,則m=0。
來源:CCW
- 1布線系統(tǒng)智能化發(fā)展
- 2瞬索給現(xiàn)存信息系統(tǒng)帶來了革新
- 3用圍棋理論指導(dǎo)布線施工
- 4解決信息系統(tǒng)的“亞健康”問題
- 5微軟新開發(fā)技術(shù)一瞥
- 6網(wǎng)絡(luò)安全避開新陷阱
- 7縱論城域網(wǎng)
- 8歸檔變得更容易
- 9為企業(yè)尋找反間諜助手
- 10災(zāi)難恢復(fù):你準(zhǔn)備好了嗎?
- 11可重構(gòu)計(jì)算為何獲芯片業(yè)集體追捧
- 12展望未來IT科技發(fā)展
- 13VPLS技術(shù)及應(yīng)用綜述
- 14解析八種常見的ADSL斷流現(xiàn)象
- 15如何建立持久HTTP連接
- 16如何選擇復(fù)合型的網(wǎng)絡(luò)防火墻
- 17千兆網(wǎng)綜合布線系統(tǒng)設(shè)計(jì)與測試
- 18MPLS VPN困于邊界?
- 19無線技術(shù)又出新花樣
- 20如何構(gòu)筑家庭網(wǎng)絡(luò)
- 21VoIP工作原理
- 22安全是VoIP部署的先決條件
- 23為什么交互式特性會(huì)與安全性相沖突?
- 24CMM通過信息化實(shí)現(xiàn)跨越式發(fā)展
- 25Web應(yīng)用的“軟件構(gòu)件化”進(jìn)程
- 26竭盡WAN網(wǎng)之利
- 27自動(dòng)化機(jī)房管理方法
- 28怎么樣利用VLAN擴(kuò)展企業(yè)網(wǎng)絡(luò)
- 29虛擬化簡化管理
- 30信息安全:過去五種影響最大的攻擊
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓