恢復EXT3下被刪除的檔案

freebus發表於2020-03-03

下面是這個教程將教你如何在Ext3的檔案系統中恢復被rm掉的檔案。


假設我們有一個檔名叫 ‘test.txt’


 $ls -il test.txt

 15 -rw-rw-r– 2 root root 20 Apr 17 12:08 test.txt

 

注意:: “-il” 選項表示顯示檔案的i-node號(15),如果你不知道Unix/Linux檔案系統的“I結點”的話,你有必要先補充一下相關的知識。簡單說來,i結點就是操作管理檔案的一個標識號。



我們再看一下其內容:


$ cat test.txt

this is test file

好,現在我們開始刪除檔案:.


$rm test.txt

rm: remove write-protected regular file `test.txt’? y

 


使用 Journal 和 Inode 號恢復

注意,如果你刪除檔案後重啟了系統,那麼,相關的檔案 journal 會丟失,我們也就無法恢復檔案了。所以,恢復檔案的前提是,Journal不能丟失,即,系統不能重啟。


因為我們已經知道 test.txt 檔案的 inode 號是 15,所以我們可以使用 debugfs 命令來檢視:


debugfs: logdump -i <15>

FS block 1006 logged at sequence 404351, journal block 7241

(inode block for inode 15):

Inode: 15 Type: regular Mode: 0664 Flags: 0x0 Generation: 0

User: 0 Group: 0 Size: 20

File ACL: 0 Directory ACL: 0

Links: 1 Blockcount: 8

Fragment: Address: 0 Number: 0 Size: 0

ctime: 0x48159f2d — Mon Apr 28 15:25:57 2008

atime: 0x48159f27 — Mon Apr 28 15:25:51 2008

mtime: 0x4806f070 — Thu Apr 17 12:08:40 2008

Blocks: (0+1): 10234

No magic number at block 7247: end of journal.


請注意上面資訊中的這一行:


Blocks: (0+1): 10234

這就是inode 15存放檔案的地址(資料塊)。然後,我們知道了這個地址,我們就可以使用 dd 命令,把這個地址上的資料給取出來。


#dd if=/dev/sda5 of=/tmp/test.txt bs=4096 count=1 skip= 10234

1+0 records in

1+0 records out

if 是輸入的裝置

of 是輸出的裝置.

bs 指定一個block的大小

count 說明有多少個block需要dump

skip 說明從開始的地方跳過 10234 個block,並從取下一個block的資料

下面讓我們看一下被恢復的檔案:


$cat /tmp/test.txt

this is test file


當然,上面的檔案恢復是基於我們知道檔案的inode,可在現實中,我們並不知道這個資訊,如果我們不知道inode,我們還可能恢復嗎?是的,這是可能的,讓我們來看一下如何恢復。


使用 Journal 和 檔名恢復

如果我們不知道檔案的inode我們可能恢復嗎?我可以告訴你,這是不可能的事情。不過我們有辦法知道檔案的inode號。下面讓我們來看看怎麼做到:


$rm mytest.txt

rm: remove write-protected regular file `mytest.txt’? y

注意,我們並不知道其inode號,但我們可以使用 debugfs 命令來檢視(使用其 ls -d 選項)。


debugfs:  ls -d

 2  (12) .    2  (12) ..    11  (20) lost+found    2347777  (20) oss

<2121567> (20) mytest.txt

你看檔名了吧,它的inode號是 <2121567> ,注意,被刪除了的檔案的inode都是用尖括號包起來的。


即然知道了inode號,那麼我們就很容易恢復了(使用 logdump選項):


debugfs:  logdump -i <2121567>

Inode 2121567 is at group 65, block 2129985, offset 3840

Journal starts at block 1, transaction 405642

  FS block 2129985 logged at sequence 405644, journal block 9

    (inode block for inode 2121567):

    Inode: 2121567   Type: bad type        Mode:  0000   Flags: 0x0   Generation: 0

    User:     0   Group:     0   Size: 0

    File ACL: 0    Directory ACL: 0

    Links: 0   Blockcount: 0

    Fragment:  Address: 0    Number: 0    Size: 0

    ctime: 0x00000000 — Thu Jan  1 05:30:00 1970

    atime: 0x00000000 — Thu Jan  1 05:30:00 1970

    mtime: 0x00000000 — Thu Jan  1 05:30:00 1970

    Blocks:

  FS block 2129985 logged at sequence 405648, journal block 64

    (inode block for inode 2121567):

    Inode: 2121567   Type: regular        Mode:  0664   Flags: 0x0   Generation: 913772093

    User:   100   Group:     0   Size: 31

    File ACL: 2130943    Directory ACL: 0

    Links: 1   Blockcount: 16

    Fragment:  Address: 0    Number: 0    Size: 0

    ctime: 0x4821d5d0 — Wed May  7 21:46:16 2008

    atime: 0x4821d8be — Wed May  7 21:58:46 2008

    mtime: 0x4821d5d0 — Wed May  7 21:46:16 2008

    Blocks:  (0+1): 2142216

上面有很多資訊,讓我們仔細地檢視,你可以看到下面一行資訊:


 FS block 2129985 logged at sequence 405644, journal block 9

並且,其型別是:


 Type: bad type

再仔細看一下檔案的時間戳下面的Blocks: 什麼也沒有。那麼,讓我們看一下下一個block:


FS block 2129985 logged at sequence 405648, journal block 64

    (inode block for inode 2121567):

這一條Journal就有block資訊了:


Blocks:  (0+1): 2142216

這就是被刪除檔案的地址,讓我們再次執行恢復命令:


$sudo dd if=/dev/sda5 of=/home/hchen/mytest_recovered.txt bs=4096 skip=2142216 count=1

再讓我們來檢查一下檔案內容:


$ cat mytest_recovered.txt

this is my test file 

小結

好了,下面是我們的一些總結:

1)使用 debugfs: ls -d 找到被刪除檔案的inode號。

2)使用 debugfs:logdump找到檔案的資料塊地址。

3)使用dd 命令把資料取出來存成檔案。


網上有很其它不同的方法來恢復檔案,基本上也是使用debugfs這個命令,有的還使用到了lsdel,其實大同小異,這個教程是我在網上看到的,雖然他說只是針對Ext3檔案系統的,但我總感覺應該可以用於Ext2檔案系統,不過我沒有試過。也許Ext2和Ext3被debugfs輸出的資訊不一樣吧。大家可以去試試。


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

相關文章