红联Linux门户
Linux帮助

Linux技能:关于ext3反删除的一点想法

发布时间:2007-09-25 16:47:45来源:红联作者:MPiops
  下面是用 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 都找出,然后记录到一个文件,然后恢复时就有据可依了。
文章评论

共有 1 条评论

  1. MPiops 于 2007-09-25 16:49:39发表:

    如果删掉文件 A,又 cp 过去一个 B,block 有可能被复用(尤其是做服务器的时候)

    这样的话,即使找回来也是错的

    所以最好的方法还是修改 rm,实现类似 windows 下回收站的功能,这样最保险,代价就是使用额外空间做进一步审核用。