rhel4_如何恢復ext2_ext3檔案系統的刪除資料

wisdomone1發表於2010-03-18

作為一個多使用者、多工的,Linux下的檔案 一旦被刪除,是難以恢復的。儘管刪除命令只是在檔案節點中作刪除標記,並不真正清除檔案內容,但是其他使用者和一些有寫盤動作的程式會很快覆蓋這些資料。不 過,對於家庭單機使用的Linux,或者誤刪檔案後及時補救,還是可以恢復的。

1、 Ext2檔案系統結構的簡單介紹

在Linux所用的Ext2檔案系統中,檔案是 以塊為單位儲存的,預設情況下每個塊的大小是1K,不同的塊以塊號區分。每個檔案還有一個節點,節點中包含有檔案所有者,讀寫許可權,檔案型別等資訊。對於 一個小於12個塊的檔案,在節點中直接儲存檔案資料塊的塊號。假如檔案大於12個塊,那麼節點在12個塊號之後儲存一個間接塊的塊號,在這個間接塊號所對 應的塊中,儲存有256個檔案資料塊的塊號(Ext2fs中每個塊號佔用4位元組,這樣一個塊中所能儲存的塊號就是1024/4=256)。假如有更大的文 件,那麼還會在節點中出現二級間接塊和**間接塊。

2、恢復被誤刪檔案的方法

大多數Linux發行版都提供一個debugfs工具,可以用來對Ext2檔案系統進行編 輯操作。不過在使用這個工具之前,還有一些工作要做。

首先以只讀方式重新掛載被 誤刪的檔案所在分割槽。使用如下命令:(假設檔案在/usr分割槽)

mount –r –n –o remount /usr -r表示只讀方式掛載;-n表示不寫入/etc/mtab,假如是恢復/etc上的檔案,就加上這個引數。假如系統說xxx partion busy,可以用fuser命令檢視一下是哪些程式使用這個分割槽上的檔案:

fuser –v –m /usr

假如沒有什麼重要的程式,用以下命令停掉它們:

fuser -k –v –m /usr

然後就可以重新掛載這些檔案系統了。

假如是把所有的檔案統一安裝在一個大的/分割槽當中,可以在boot提示符下用linux single進入單使用者模式,儘量減少系統程式向硬碟寫入資料的機會,要不乾脆把硬碟掛在別的機器上。另外,恢復出來的資料不要寫到/上面,避免破壞那些 有用的資料。假如機器上有dos/windows,可以寫到這些分割槽上面:

mount –r –n /dev/hda1 /mnt/had

然後就可以執行 debugfs:(假設Linux在 /dev/hda5)

#debugfs /dev/hda5

就會出現debugfs提示符debugfs:

使用lsdel命令可以列出很多被刪除的檔案的資訊:

DE>debugfs:lsdel debugfs: 2692 deleted inodes found. Inode Owner Mode Size Blocks Time deleted 164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001 ………………………………………………………… 36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001 196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001 debugfs:DE>

列出的檔案有很多(這裡找到2692個),第一欄位是檔案節點號,第二欄位是檔案所有者, 第三欄位是讀寫許可權,接下來是檔案大小,佔用塊數,刪除時間。

然後就可以根據文 件大小和刪除日期判定那些是我們需要的。比如我們要恢復節點是196829的檔案:

可以先看看檔案資料狀態:

DE>debugfs:stat <196829> Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1 User: 0 Group: 0 Size: 149500 File ACL: 0 Directory ACL: 0 Links: 0 Blockcount: 38 Fragment: Address: 0 Number: 0 Size: 0ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001 atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001 mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001 dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001 BLOCKS: 594810 594811 594814 594815 594816 594817 …………………………………. TOTAL: 38DE>

然後就可以用dump指令恢復檔案:

debugfs:dump <196829> /mnt/hda/01.sav

這樣就把檔案恢復出來了。退出debugfs:

debugfs:quit

另 一種方法是手工編輯inode:

DE>debugfs:mi <196829> Mode [0100644] User ID [0] Group ID [0] Size [149500] Creation time [0x31a9a574] Modification time [0x31a9a574] Access time [0x31a21dd1] Deletion time [0x31a9a574] 0 Link count [0] 1 Block count [38] File flags [0x0] Reserved1 [0] File acl [0] Directory acl [0] Fragment address [0] Fragment number [0] Fragment size [0] Direct Block #0 [594810] ……………………………. Triple Indirect Block [0]DE>

使用mi指令後每次顯示一行資訊以供編輯,其它行可以直接按回車表示確認,把 deletion time改成0(未刪除),Link count改成1。改好後退出debugfs:

debugfs:quit

然 後用fsck檢查/dev/hda5

fsck /dev/hda5

程式會說找到丟失的資料塊,放在lost found裡面。這個目錄裡的檔案就是我們要的東東



平時我們都會用到rm -rf * 但是如果一不小心刪除了某些比較重要檔案,那還是非常惱火的。 最好的辦法還是儘量去避免這樣的操作,看清楚了在刪除。下面我給大家介紹兩種恢復資料的方法,不過也僅僅在ext2上可以恢復,ext3上,目前還麼有比 較有效的方法,這個大家可以來討論一下,有沒有更好的方法在ext3上來恢復檔案

ext2上的檔案恢復方法,最常用的兩種: 如果你的檔案正在使用中的話,可以透過lsof來解決你檔案恢復的問題

測試方法:

1.把系統日誌檔案messages檔案刪除

rm -f /var/log/messages

2.利用lsof來查詢正在使用該檔案的程式號等相關資訊

lsof |grep messages
COMMAND     PID    USER   FD      TYPE             DEVICE       SIZE       NODE NAME
syslogd    2230    root    2w      REG              253,0     209329    5586981 /var/log/messages 

3.確認proc下的檔案是我們要找回的檔案

tailf /proc/2230/fd/2     (/proc/PID/fd/FD)

4.找回檔案

cat /proc/2230/fd/2 >/var/log/messages

5.此檔案就被找回了。

這種方法只能當你刪除的檔案還被系統使用著的時候才能夠這樣恢復,那如果不不幸檔案沒有被使用怎麼辦呢,不要著急,我們可以用系統自帶的工 具debugfs來恢復,用這種方法來恢復,首先你要避免為你所刪除的塊複寫的情況發生,所以如果是非系統風區的,儘量umount掉,或者掛成只讀(方 法下面會介紹),如果是/分割槽的話,那最好是在單使用者模式下去操作,你rm掉一個檔案,其實只是刪除了一個資料的link,真是的資料仍然在塊上,所以 debugfs是從塊的節點位置來恢復的資料的,具體的恢復方式,debugfs是如何工作的,大家可以去網上搜一下,這裡我就不累述了。

測試方法:

1. 有一個ext2的分割槽/dev/sdb3掛載到/USER下面

rm /USER/* -rf

2.我們把該裝置先掛成只讀的

mount -r -n /dev/sdb3 /mnt/tmp

3.使用debugfs找到被刪除的資料

[root@TSM /]# debugfs /dev/sdb3

debugfs 1.39 (29-May-2006) --進入debugfs的互動模式
debugfs: lsdel -- 檢視被刪除的日誌
Inode Owner Mode Size Blocks Time deleted
12 0 100644 4096 4/ 4 Wed May 13 23:34:07 2009
11 0 40700 0 12/ 12 Wed May 13 23:34:26 2009
22 0 100644 32 1/ 1 Wed May 13 23:34:26 2009
23 0 100644 11 1/ 1 Wed May 13 23:34:26 2009
4 deleted inodes found.
#####################################################################
#Inode -- 節點標號
#Owner -- 所屬者
#Mode -- 檔案屬性(即讀、寫等)
#Size -- 檔案大小
#Blocks -- block(一般1block=1K),根據分割槽格式不同而變化
#Time deleted -- 刪除時間
#######################################################################
debugfs: dump <23> /user/1 -- dump出你要的資料,'<>'這裡是你需要恢復資料的節點標號,後面跟的是檔案的路徑
debugfs: quit -- 退出互動模式

好了,現在你去看看/user/1 下面的有沒有把你的資料恢復出來了

以上兩種方法,我已經測試過,都可以行,只是對於ext3來說還沒找到辦法非常遺憾,歡迎大家來討論

####################################################################
現在有個工具可以恢復ext3檔案系統中被rm掉的檔案
檔案下載:


最終測試:全部恢復出來的資料啊,檔案中是空的,呵呵,不知何因,下次再測吧

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-629800/,如需轉載,請註明出處,否則將追究法律責任。

相關文章