在ext3文件系统怎样恢复删除的文件(译1)

作者:Carlo Wood

时间:20084

作者网站:http://code.google.com/p/ext3grep/

翻译者:www_xylove(网络ID

时间:2013127

说明:翻译这个软件的功能主要是想证明一下自己的英文水平,顺便推广一下Carlo Wood写的这个ext3grep工具,当然,这个工具很可能很多人都已经知道了,因为毕竟是作者2008年写的,但是还可能有些读者不知道这个工具,所以,顺便推广一下罢了,其实这个工具实在是太重要了,在这个工具之前,rm -rf 删除了文件,是不可能恢复的,这个连ext3文件系统的开发者Andreas Diger都承认,但Carlo Wood不这么认为,作者认为rm文件后是可以恢复的,所以就有了ext3grep这个工具。自己翻译下来,自己的英文水平着实还有待有提高,该篇译文算是自己的练兵这作罢了.由于自己的翻译水平连自己都不屑一顾了,至于发在博客的原因,想比是自己喜欢写博客而已,没有任何原因了.强烈建议读者朋友还是读原作,请看上面的链接.

[@more@]

介绍

每个人早晚都会发生的事情:你意识到你犯了错误的之后,很快的几秒,但是已经晚了.你正好删除了一个没有备份的,很有价值的文件或的目录.也许你有备份,但是它是几个月之前的并且你已经意识到过去的备份已经过期了,你不得不很痛苦的重新做…..

幸运的是,你记得文件从来没有被真正删除过,最多被新的内容所覆盖.因此,你可以remount磁盘到只读状态,现在吗?

如果你在goolge搜索 "undelete ext3",每次得到的结果很可能是:no,也就是说那个时候没有这方面的资源,现在不同了.

大多是频繁的引用来自ext3 FAQ本身:

Q:我怎样才能恢复在ext3文件系统分区删除的文件?

事实上,你不能!开发ext3文件系统的Andreas Dilger说:

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不那么认为,这不一定是事实.所有的信息很可能还在磁盘上,包括块的指针.它很可能最少仍然在这个上面(比起ext2.因此它们必须从日志中进行恢复.另外,元数据和真正的数据关联较少,因此,heuristic algorithms(探试算法)能找到过去的数据.每一次一个文件被访问的时候,它的访问时间将被改变.并且,它的inode编号将被写入磁盘.连同31个其他的inode编号保留在相同的块里面.当这个发生的时候,块的拷贝将被写入日志文件里.因此,如果你的分没有太多的日志,而且,你最近访问了你想要恢复的文件,那么你很可能能从日志里恢复块的指针.

200827日,我偶然的删除了我整这home目录.使用rm –rf 删除了超过3G的数据.这个备份的数据仅有20076月的.不能够恢复数据是不能接受的.我忽略了每个人试图告诉我不可能恢复数据,开始学习ext3文件系统的的结构,当文件被删除之后发生什么

三周之后,写了近5000行代码,我恢复了我的所有的数据.

你开始之前你应该知道什么

我写的这个工具是假设你最近删除了文件.它不能处理损坏的文件,仅意外的删除了文件的恢复.而且,这个文件也是在一个测试阶段:开发这个工具就像一个黑客,单独地只是恢复我自己的数据.我恢复了我的数据之后,我继续开发了好几个月修正软件的bug.很可能这个程序不是很强健.因此,它很可能对你来说不能很好的工作.我自己作为这个程序的维护者,对你来说很可能不能完美的恢复你的文件,你必须自己修改这程序,完成这个程序.可以这么说.

这个程序仅仅需要读取被删除的文件,它不能尝试恢复这个文件.替代的,它允许你拷贝这个被删除的文件,并写入到创建的当前目录下.(和需要恢复的文件系统不是同一个文件系统),所有的路径相对于分区的root路径.因此,你有分区 /dev/md5 挂载在/home目录下面.并且,/home并不是恢复路径的一部分.替代地,路径的例子类似于"carlo/c++/foo.cc". carlo前面不需要斜杠(slash).

取名为ext3grep的原因是,我计划写一个高度智能的,能够搜索类似于从备份中来的扩展块来重建文件的程序.名称中包含grep,是预先引用ext3开发者的事实:

我准备需要和一些块的集合进行工作,可能有些关联的搜索模式,让操作者尽量减少对块的搜索,然后按顺序出来.然后,结果是并不是我想要的.虽然如此,我保留ext3grep这个名词,因为以后很可能需要在程序中增加grep的功能.

Ext3如何存储文件?

块尺寸

文件的内容存在在连续大小为4096 byte 块里(实际大小依赖于命令mke2fs,当文件系统创建的时候,并且有1024,2048,4096 byte.一个硬盘就是一个“块设备”

意味着每次I/O完成,就是这些块.每次读写这些块的整数.但是这并不意味着相同大小的碎片文件也是最小是连续的.如果碎片大小与数据块的大小不一致的话,程序将不会工作.

使用ext3grep,带上选项superblock,能够在超级块里查看碎片大小与数据块的大小.

$ ext3grep $IMAGE --superblock | grep 'size:'

Block size: 4096

Fragment size: 4096

这个$IMAGE很可能是作者电脑的linux的环境名,我这里没有,我使用下面的的语句

[root@dbhouse ext3grep-0.10.2]# ext3grep /dev/mapper/VolGroup01-LogVol00 --superblock | grep 'size:'

Block size: 4096

Fragment size: 4096

(果然,下面作者对这个IMAGE做出了解释)

这个IMAGE是这个容纳文件系统的设备名称的环境变量(或者使用dd命令进行拷贝),举例:/dev/sdd2(使用命令df 将显示所有的设备名称),正常情况下,这样root能读取设备,但是,你能够(临时)读取它们,当然,使用dd产生一个image.举例说明,/dev/sdd is not一个分区(注意缺失数字),并且,还不能够使用.这整个分区将被分割成个块的整数.0开始.因此,如果你要做块数量N的拷贝,那么,就执行:

$ dd if=$IMAGE bs=4096 count=1 skip=$N of=block.$N

0开始的到N的数据块将保留在超级块里.

下面的指令查询任何数据块.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28227905/viewspace-1060169/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28227905/viewspace-1060169/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值