天天看點

使用ext3grep恢複ext3上删除的檔案

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

是的,我知道ext3檔案系統上,一旦檔案被删除(rm -rf ),就幾乎沒有恢複的可能。而且從ext3檔案系統的FAQ中提到的一條也能印證這點:

引用

Q: How can I recover (undelete) deleted files from my ext3 partition?

Actually, you can’t! This is what one of the developers, Andreas Dilger, said about it:

In order to ensure that ext3 can safely resume an unlink after a crash, it actually zeros out the block pointers in the inode, whereas ext2 just marks these blocks as unused in the block bitmaps and marks the inode as “deleted” and leaves the block pointers alone.

Your only hope is to “grep” for parts of your files that have been deleted and hope for the best.

一、原理

Carlo Wood在2008年2月7日不小心使用了rm -rf 删除了/home目錄,損失資料超過3GB,而唯一的備份還是2007年6月份的,他不甘心他的資料就這麼丢失,于是就還是研究ext3檔案系統,牛人就是牛人,他花了3個星期,寫了将近5000行代碼,他恢複了所有的檔案。

ext3grep工具的恢複原理并不是依賴特定檔案格式。以ext3grep為例,他首先通過檔案系統的root

inode(一般為2)來獲得所有目前檔案系統下檔案的資訊,包括存在的和已經删除的,這些資訊當然也包括檔案名和其inode。

然後利用inode到日志來去查詢該inode所在的block位置,包括直接塊,間接塊等資訊。最後利用dd來将這些資訊dump出來,而形成一個檔案。

二、步驟

光說不練是假把式,我們就祭出他的工具–ext3grep。如果你是debian/ubuntu使用者,那你走運了,直接sudo apt-get install ext3grep就可以了。

我們可以一步一步的從檔案系統原理來告訴你如何恢複一個檔案,但是我怕你還沒有看完,就走人了,是以我就先給一個快速示範給大家看看:我們先删除/boot目錄(/dev/sda2分區)下的某一個檔案(如果你不相信他能恢複,請先行備份),然後利用這個工具來恢複這個檔案。

1)備份并删除檔案

root@wgzhao-nb:/boot# cp initrd.img-2.6.28-13-generic  /var/tmp/

root@wgzhao-nb:/boot# mount -o rw,remount /dev/sda2 /boot

root@wgzhao-nb:/boot# rm -rf initrd.img-2.6.28-13-generic

root@wgzhao-nb:/boot# sync

2)如果你為了保險其間,可以立刻将boot分區(/dev/sda2)挂載為隻讀

root@wgzhao-nb:/boot# mount -o remount,ro /dev/sda2 /boot

3)假定你不記得你要恢複的檔案的名字了(大部分情況是不會記得的),我們要列出包含删除檔案目錄下所有包含的檔案,包括被删除的檔案。

root@wgzhao-nb:/boot# ext3grep /dev/sda2 --dump-names

Running ext3grep version 0.10.1

WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.

Number of groups: 13

Minimum / maximum journal block: 527 / 4641

Loading journal descriptors... sorting... done

The oldest inode block that is still in the journal, appears to be from 1246156824 = Sun Jun 28 10:40:24 2009

Number of descriptors in journal: 364; min / max sequence numbers: 310 / 883

Finding all blocks that might be directories.

[...]

System.map-2.6.18-128.1.14.el5

System.map-2.6.18-53.11AXS3

System.map-2.6.28-13-generic

System.map-2.6.28-14-generic

System.map-2.6.30-10-generic

System.map-2.6.30-10-generic.dpkg-new

System.map-2.6.30-10-generic.dpkg-tmp

lost+found

module-info

symvers-2.6.18-128.1.14.el5.gz

symvers-2.6.18-53.11AXS3.gz

vmcoreinfo-2.6.28-13-generic

vmcoreinfo-2.6.28-14-generic

vmcoreinfo-2.6.30-10-generic

vmcoreinfo-2.6.30-10-generic.dpkg-new

vmcoreinfo-2.6.30-10-generic.dpkg-tmp

vmlinuz

vmlinuz-2.6.18-128.1.14.el5

vmlinuz-2.6.18-53.11AXS3

vmlinuz-2.6.28-13-generic

vmlinuz-2.6.28-14-generic

vmlinuz-2.6.30-10-generic

vmlinuz-2.6.30-10-generic.dpkg-tmp

4)看了這個清單你總知道你要恢複的檔案名字了吧,我們這裡是initrd.img-2.6.28-13-generic,如果你還是不記得,唉,好人做到底,給你必殺技,使用下面的指令:

root@wgzhao-nb:/boot# ext3grep /dev/sda2 --ls --inode $(ls -id  /boot |awk '{print $1}')

Loading group metadata... done

Inode is Allocated

D: block containing directory start, d: block containing more directory entries.

Each plus represents a directory start that references the same inode as a directory start that we found previously.

Writing analysis so far to 'sda2.ext3grep.stage2'. Delete that file if you want to do this stage again.

The first block of the directory is 513.

Inode 2 is directory "".

Directory block 513:

.-- File type in dir_entry (r=regular file, d=directory, l=symlink)

|          .-- D: Deleted ; R: Reallocated

Indx Next |  Inode   | Deletion time                        Mode        File name

==========+==========+----------------data-from-inode------+-----------+=========

0    1 d       2                                         drwxr-xr-x  .

1  end d       2                                         drwxr-xr-x  ..

6    7 r      14  D 1248245870 Wed Jul 22 14:57:50 2009  rrw-r--r--  symvers-2.6.18-53.11AXS3.gz

15   16 r    6058  D 1248086531 Mon Jul 20 18:42:11 2009  rrw-r--r--  vmlinuz-2.6.28-13-generic

16   17 r    6063  D 1248086910 Mon Jul 20 18:48:30 2009  rrw-r--r--  System.map-2.6.28-13-generic

17   18 r    6054  D 1248086910 Mon Jul 20 18:48:30 2009  rrw-r--r--  initrd.img-2.6.28-13-generic

18   19 r    6059  D 1248086557 Mon Jul 20 18:42:37 2009  rrw-r--r--  config-2.6.28-13-generic

19   20 r    6064  D 1248086910 Mon Jul 20 18:48:30 2009  rrw-r--r--  vmcoreinfo-2.6.28-13-generic

22   23 r    6057  D 1248086910 Mon Jul 20 18:48:30 2009  rrw-r--r--  abi-2.6.28-13-generic.dpkg-tmp

24   26 r    6056  D 1248086910 Mon Jul 20 18:48:30 2009  rrw-r--r--  config-2.6.28-13-generic.dpkg-tmp

以上你看到的D标志的,就是被删除的檔案,這你總知道了吧,還是不知道,那就再往後看,最後有一個必必殺計。

5)接着我們恢複檔案,這是關鍵:

root@wgzhao-nb:~# cd /tmp

root@wgzhao-nb:/tmp# ext3grep $IMAGE --restore-file initrd.img-2.6.28-13-generic

Restoring initrd.img-2.6.28-13-generic

root@wgzhao-nb:/tmp# md5sum RESTORED_FILES/initrd.img-2.6.28-13-generic

22092b1719a7601674fc59ff4a534dc9  RESTORED_FILES/initrd.img-2.6.28-13-generic

root@wgzhao-nb:/tmp# md5sum /var/tmp/initrd.img-2.6.28-13-generic

22092b1719a7601674fc59ff4a534dc9  /var/tmp/initrd.img-2.6.28-13-generic

由此我們知道恢複出來的檔案是完整的。這裡要注意的是–restore-file 的檔案參數,檔案參數應該包括檔案相對路徑,相對路徑指的是相對你指定的裝置,比如/dev/sda2就是/boot的根目錄,而initrd.img-2.6.28-13-generic在/boot目錄下,是以這裡直接給出檔案名就好了,如果是需要恢複/boot/grub/grub.conf檔案的話,那麼指定的參數就應該像下面這樣:

root@wgzhao-nb:#ext3grep /dev/sda2 –restore-file grub/grub.conf

細心的你,你可能知道了,他指定檔案的方式就和grub一樣,比如(hd0,1)/grub/grub.conf這樣。

,那裡給出了一個非常詳細的步驟,使得你對ext3檔案系統一定有更深入的了解。

如果你有N個檔案需要恢複(N>100),那麼用上面的方法看就比較惱火了,是以作者給ext3grep增加了一個–restore-all的參數。它能把指定裝置的所有看你能恢複的檔案都恢複出來,寫入一個RESTORED_FILES目錄裡。作者建議使用–restore-all的參數時,同時指定–after參數,表示指定恢複什麼時間之後被删除的檔案,這是為了防止用恢複過多的舊檔案,算是一種過濾方式。參數為時間戳格式,比如:

ext3grep –restore-all –after 1245676061

表示恢複自2009-06-22 21:07以後删除的檔案。

吧。

三、在紅旗上使用

紅旗 Linux上也可以使用該工具,具體的使用方法,請參考:

<a href="http://blog.chinaunix.net/u2/85323/showart_2002696.html">http://blog.chinaunix.net/u2/85323/showart_2002696.html</a>

繼續閱讀