下面是用 dd 和 filefrag 恢复一个在 ext3 上被误删除的文件的过程
[root@mail ~]# cat target
ok
ok2
ok3
用 filefrag 查看其 blocks 的分布情况
[root@mail ~]# filefrag -v target
Checking target
Filesystem type is: ef53
Filesystem cylinder groups is approximately 7440
Blocksize of file target is 4096
File size of target is 11 (1 blocks)
First block: 1901106
Last block: 1901106
target: 1 extent found
删除该文件
[root@mail ~]# rm -f target
[root@mail ~]#
下面开始恢复过程,首先查看文件所在文件系统的的 block size
[root@mail ~]# tune2fs -l /dev/hdb2 |grep -i 'block size'
Block size: 4096
[root@mail ~]#
然后用 dd 直接读取编号为 1901106 的 block (block 编号从 0 开始,所以实际上是第 1901107 块)
[root@mail ~]# dd if=/dev/hdb2 of=recover_file bs=4096 count=1 skip=1901106
1+0 records in
1+0 records out
[root@mail ~]#
最后查看结果
[root@mail ~]# cat recover_file
ok
ok2
ok3
[root@mail ~]#
可以看到文件已经恢复了(可能最终的大小会比原来的大,因为我们一次是读取一个 block )
想直接得出一个文件所占用的每个 block 的编号比较困难。我原来的想法是 :
用 cron 定时找出指定文件所占用的每个 blocks ,并记录到一个指定文件,例如 file.blcoks。然后在出现误删除时从最近一个 file.blocks 中找出该文件所对应的 blocks ,再按顺序一个个 block。读出来,并逐一追加到前一个 block 的后面,最终恢复原来的文件。
在 wikipeida 上看到相关内容,大意如下 :debugfs 的 lsdel 和 undel 只能用于 ext2 ,因为 ext3 的删除机制是直接把 inode 中的 blocks list 删除了,所以造成 ext3 无法反删除。所以我的想法就是每天运行一个脚本 find_blocks ,可以指定某个文件或者某个目录,然后把其下,所有文件的 blocks list 都找出,然后记录到一个文件,然后恢复时就有据可依了。


MPiops 于 2007-09-25 16:49:39发表:
如果删掉文件 A,又 cp 过去一个 B,block 有可能被复用(尤其是做服务器的时候)
这样的话,即使找回来也是错的
所以最好的方法还是修改 rm,实现类似 windows 下回收站的功能,这样最保险,代价就是使用额外空间做进一步审核用。