恢復誤刪linux -ext3-ext2 檔案系統檔案的操作方法-轉載

wisdomone1發表於2010-01-26

如何恢復linux下刪除的檔案 (下)

現在請將附件中的 createfile.sh 檔案下載到本地,並將其儲存到 /tmp/test 目錄中,這個指令碼可以幫助我們建立一個特殊的檔案,其中每行包含 1KB 字元,最開始的14個字元表示行號。之所以採用這種檔案格式,是為了方便地確認所恢復出來的檔案與原始檔案之間的區別。這個指令碼的用法如下:



                
# ./createfile.sh [size in KB] [filename]

第 1 個參數列示所生成的檔案大小,單位是 KB;第 2 個參數列示所生成檔案的名字。

下面讓我們建立幾個測試檔案:



                
# cd /tmp/test
#./createfile.sh 35 testfile.35K
#./createfile.sh 10240 testfile.10M

# cp testfile.35K testfile.35K.orig
# cp testfile.10M testfile.10M.orig

上面的命令新建立了大小為 35 KB 和 9000KB 的兩個檔案,併為它們各自儲存了一個備份,備份檔案的目的是為了方便使用 diff 之類的工具驗證最終恢復出來的檔案與原始檔案完全一致。

ls 命令的 –i 選項可以檢視有關儲存檔案使用的索引節點的資訊:



                
# ls -li | sort
11 drwx------ 2 root root 16384 Oct 29 20:08 lost+found
12 -rwxr-xr-x 1 root root 1406 Oct 29 20:09 createfile.sh
13 -rw-r--r-- 1 root root 35840 Oct 29 20:09 testfile.35K
14 -rw-r--r-- 1 root root 10485760 Oct 29 20:10 testfile.10M
15 -rw-r--r-- 1 root root 35840 Oct 29 20:10 testfile.35K.orig
16 -rw-r--r-- 1 root root 10485760 Oct 29 20:11 testfile.10M.orig

第一列中的數字就是索引節點號。從上面的輸出結果我們可以看出,索引節點號是按照我們建立檔案的順序 而逐漸自增的,我們剛才建立的 35K 大小的檔案的索引節點號為 13,10M 大小的檔案的索引節點號為 14。debugfs 中提供了很多工具,可以幫助我們瞭解進一步的資訊。現在執行下面的命令:



                
# echo "stat <13>" | debugfs /dev/sdb6
debugfs 1.39 (29-May-2006)
Inode: 13 Type: regular Mode: 0644 Flags: 0x0 Generation: 2957086759
User: 0 Group: 0 Size: 35840
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 72
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x47268467 -- Mon Oct 29 20:09:59 2007
atime: 0x4726849d -- Mon Oct 29 20:10:53 2007
mtime: 0x47268467 -- Mon Oct 29 20:09:59 2007
BLOCKS:
(0-8):4096-4104
TOTAL: 9

輸出結果顯示的就是索引節點 13 的詳細資訊,從中我們可以看到諸如檔案大小(35840=35K)、許可權(0644)等資訊,尤其需要注意的是最後 3 行的資訊,即該檔案被儲存到磁碟上的 4096 到 4104 總共 9 個資料塊中。

下面再看一下索引節點 14 (即 testfile.10M 檔案)的詳細資訊:



                
# echo "stat <14>" | debugfs /dev/sdb6
debugfs 1.39 (29-May-2006)
Inode: 14 Type: regular Mode: 0644 Flags: 0x0 Generation: 2957086760
User: 0 Group: 0 Size: 10485760
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 20512
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x47268485 -- Mon Oct 29 20:10:29 2007
atime: 0x472684a5 -- Mon Oct 29 20:11:01 2007
mtime: 0x47268485 -- Mon Oct 29 20:10:29 2007
BLOCKS:
(0-11):24576-24587, (IND):24588, (12-1035):24589-25612, (DIND):25613, (IND):25614,
(1036-2059):25615-26638, (IND):26639, (2060-2559):26640-27139
TOTAL: 2564

和索引節點 13 相比,二者之間最重要的區別在於 BLOCKS 的資料,testfile.10M 在磁碟上總共佔用了 2564 個資料塊,由於需要採用二級間接定址模式進行訪問,所以使用了4個塊來存放間接定址的資訊,分別是24588、25613、25614和26639,其中 25613塊中存放的是二級間接定址的資訊。



linux ext3檔案被刪除如何恢復

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

2。恢復被誤刪檔案的方法
大多數Linux發行版都提供一個debugfs工具,可以用來對Ext3檔案系統進行編輯操作。不過在使用這個工具之前,還有一些工作要做。
首先以只讀方式重新掛載被誤刪的檔案所在分割槽。使用如下命令:(假設檔案在/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命令可以列出很多被刪除的檔案的資訊:
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:
列出的檔案有很多(這裡找到2692個),第一欄位是檔案節點號,第二欄位是檔案所有者,第三欄位是讀寫許可權,接下來是檔案大小,佔用塊數,刪除時間。然後就可以根據檔案大小和刪除日期判斷那些是我們需要的。比如我們要恢復節點是196829的檔案:
可以先看看檔案資料狀態:
debugfs:stat
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: 0
ctime: 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: 38
然後就可以用dump指令恢復檔案:
debugfs:dump /mnt/hda/01.sav
這樣就把檔案恢復出來了。退出debugfs:
debugfs:quit
另一種方法是手工編輯inode:
debugfs:mi
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]
使用mi指令後每次顯示一行資訊以供編輯,其它行可以直接按回車表示確認,把deletion time改成0(未刪除),Link count改成1。改好後退出debugfs:
debugfs:quit
然後用fsck檢查/dev/hda5
fsck /dev/hda5
程式會說找到丟失的資料塊,放在lost+found裡面。'






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

相關文章