ext3文件系统文本文件的恢复

本文可自由转载,但请遵循“署名-非商业用途-保持一致”的创作共用协议。 永久链接:JoeCen's 小猫窝
-----------------------------

今天误删了一个脚本文件,十分懊恼。自己做过安全培训的导师,居然也犯这些低级错误,实在是不应该。

虽然脚本不是很长,但是也不想重新写一次,于是到处找方法看能不能恢复。

网上是有恢复的方法,不过都是针对ext2的,如果是ext2的话,直接用debugfs的lsdel指令找出删除文件的inode,然后根据其来进行恢复就可以了。

可是,现在还有人用ext2么?ext3和ext2大部分功能都一样,但是删除文件上面却不一样。在“如何恢复 Linux 上删除的文件,第 4 部分”这篇IBM的文章中写到:

在删除文件时,对于 ext2 文件系统来说,操作系统只是简单地修改对应索引节点中的删除时间,并修改索引节点位图和数据块位图中的标志,表明它们已经处于空闲状态,可以被重新使用;而对于 ext3 文件系统来说,还清除了表明数据块存放位置的字段(i_block),并将索引节点中的文件大小信息设置为 0。然而,这点区别对于恢复被删除文件的用途来说却是至关重要的,因为缺少了文件大小和数据块位置的信息,尽管文件数据依然完好地保存在磁盘上,但却没有任何一条清晰的线索能够说明这个文件的数据块被存储到哪些磁盘块中,以及这些数据块的相互顺序如何,文件中间是否存在文件洞等信息,因此要想完整地恢复文件就变得非常困难了。这也正是使用 debugfs 的 dump 命令在 ext3 文件系统中并不能恢复已删除文件的原因。

上面这篇文章里面一共举出了三个方法对ext3的文件进行恢复,但是我觉得比较靠谱的只有第一个。

第一个方法是使用grep或者strings命令,对分区的所有文本内容进行检索,以找回自己误删文件的内容。这个方法是比较可行的,我也实践成功了。不过缺点是只可以恢复文本文件,因为2进制文件是匹配不到的。

第二个方法是提前备份元数据,这个方法我觉得不靠谱,也是和ext3的原则相违背的:本来ext3就是要改为删除文件的时候同时删除i_block,你还自己手工加一个进去。
其实我在搜索其他方法的时候也见过几个这样做的文章,sourceforge上面也有人写了一个这样的工具,好像叫作"giis"。我下载以后,看它的readme,上面第一句就说:

It's a file recovery tool...but you can't recover files deleted before installtion of giis

差点没把我气死。

第三个方法是修改内核,修改ext3的实现,这个方法评价同上。我的服务器用的是debian,有自己的包更新系统,所以不太希望自己对内核进行改动。

介绍完毕,现在开始实作:
那么我就用第一个方法,匹配分区中所有的文本来找回我的脚本内容。

急救措施第一步,当然是先umount掉你的分区,或者将其设置为readonly的,以免误删文件的block被覆盖,那就完蛋了。

mount -o remount,ro /dev/sda9

可以用fueser命令看当前目录有什么进程在用,然后kill掉它。

fuser -v -m /home

这个方法是使用grep或者strings命令对分区进行操作。

使用grep的话,可以用下面的命令:

grep -A 1 -B 1 -a -n "Your script content" /dev/sdb9 > sdb9.testfile

-A 和 -B分别是同时显示匹配行的下一行和上一行的内容,"Your script content"里面包含脚本的一些关键字,最好是同一分区下面其它文本文件没有的关键字啦。

不过,一般的脚本都会有几十行以上,不然直接自己写出来就好了,所以要显示脚本的全部内容的话,"-A 1"和"-B 1"是不够的。我试过,使用"-A 30"和"-B 30",结果是内存很快就用光,不能再分配。

那么还是使用"strings"命令好一点。"strings"命令的方式是将分区中所有文本文件的内容都print到一个文件中,如:

strings /dev/sda9 |gzip -c > /usr/sda9.gz

这样就将/dev/sda9中所有文本内容都print到/usr/sda9.gz中并且压缩了。我进行压缩的原因是sda9是我最大的分区,我怕直接print成一个文件的话,/usr分区会撑爆。如果要直接print成一个文件,那么:

strings /dev/sda9  > /usr/sda9.file

我的/dev/sda9分区总共60G左右,已用空间是8G,strings+gzip的时间是30分钟左右,压缩以后的文件是1.6G。而IBM那篇文章中的例子,扫描 20GB 的分区大概需要13分钟。

然后直接从导出的文件里面找你要的内容就可以了,我的方法是:

gunzip sda9.tgz -c - |grep -A 20 -B 20 -a "Your script content"

Yeah!我找回了自己的脚本,你呢?

多谢dan提供的参考文章。

参考:
如何恢复 Linux 上删除的文件,第 4 部分

随机日志

  • 西安印象
  • 让网页显示html代码的方法
  • 使用Cacti监测系统与网络性能_4
  • laptop升级到karmic (9.10)
  • AWStats搜索关键词中文乱码解决办法
  • Leave a Reply