ext3文件系统文本文件的恢复
本文可自由转载,但请遵循“署名-非商业用途-保持一致”的创作共用协议。 永久链接:JoeCen's 小猫窝-----------------------------
今天误删了一个脚本文件,十分懊恼。自己做过安全培训的导师,居然也犯这些低级错误,实在是不应该。
虽然脚本不是很长,但是也不想重新写一次,于是到处找方法看能不能恢复。
网上是有恢复的方法,不过都是针对ext2的,如果是ext2的话,直接用debugfs的lsdel指令找出删除文件的inode,然后根据其来进行恢复就可以了。
可是,现在还有人用ext2么?ext3和ext2大部分功能都一样,但是删除文件上面却不一样。在“如何恢复 Linux 上删除的文件,第 4 部分”这篇IBM的文章中写到:
上面这篇文章里面一共举出了三个方法对ext3的文件进行恢复,但是我觉得比较靠谱的只有第一个。
第一个方法是使用grep或者strings命令,对分区的所有文本内容进行检索,以找回自己误删文件的内容。这个方法是比较可行的,我也实践成功了。不过缺点是只可以恢复文本文件,因为2进制文件是匹配不到的。
第二个方法是提前备份元数据,这个方法我觉得不靠谱,也是和ext3的原则相违背的:本来ext3就是要改为删除文件的时候同时删除i_block,你还自己手工加一个进去。
其实我在搜索其他方法的时候也见过几个这样做的文章,sourceforge上面也有人写了一个这样的工具,好像叫作"giis"。我下载以后,看它的readme,上面第一句就说:
差点没把我气死。
第三个方法是修改内核,修改ext3的实现,这个方法评价同上。我的服务器用的是debian,有自己的包更新系统,所以不太希望自己对内核进行改动。
介绍完毕,现在开始实作:
那么我就用第一个方法,匹配分区中所有的文本来找回我的脚本内容。
急救措施第一步,当然是先umount掉你的分区,或者将其设置为readonly的,以免误删文件的block被覆盖,那就完蛋了。
可以用fueser命令看当前目录有什么进程在用,然后kill掉它。
这个方法是使用grep或者strings命令对分区进行操作。
使用grep的话,可以用下面的命令:
-A 和 -B分别是同时显示匹配行的下一行和上一行的内容,"Your script content"里面包含脚本的一些关键字,最好是同一分区下面其它文本文件没有的关键字啦。
不过,一般的脚本都会有几十行以上,不然直接自己写出来就好了,所以要显示脚本的全部内容的话,"-A 1"和"-B 1"是不够的。我试过,使用"-A 30"和"-B 30",结果是内存很快就用光,不能再分配。
那么还是使用"strings"命令好一点。"strings"命令的方式是将分区中所有文本文件的内容都print到一个文件中,如:
这样就将/dev/sda9中所有文本内容都print到/usr/sda9.gz中并且压缩了。我进行压缩的原因是sda9是我最大的分区,我怕直接print成一个文件的话,/usr分区会撑爆。如果要直接print成一个文件,那么:
我的/dev/sda9分区总共60G左右,已用空间是8G,strings+gzip的时间是30分钟左右,压缩以后的文件是1.6G。而IBM那篇文章中的例子,扫描 20GB 的分区大概需要13分钟。
然后直接从导出的文件里面找你要的内容就可以了,我的方法是:
Yeah!我找回了自己的脚本,你呢?
多谢dan提供的参考文章。