[分享] 关于 ext3 下如何恢复误删除文件的实验(v1)

原贴:http://linux.chinaunix.net/bbs/thread-908195-1-1.html

 


[分享] 关于 ext3 下如何恢复误删除文件的实验(v1)
首页 » CU论坛 » Linux » 汇总贴列表 » 系统问题 »
  •  
  •  
    <script type="text/javascript"> function fastreply(subject) { if($('postform')) { $('postform').subject.value = subject; $('postform').message.focus(); } } </script>
    [打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    1楼 发表于 2007-9-5 00:14 

    **************************************************************************************
    注 :该文章参考了如下内容 :

    A)filefrag 命令的 manual 、dd 命令的 manual

    B)wikipedia : http://en.wikipedia.org/wiki/Ext3

    作者 :ailms <ailms{@}qq{dot}com>

    版本 :v1

    完成时间  :2007/09/04 23:34

    **************************************************************************************


    原贴请至 http://linux.chinaunix.net/bbs/thread-908164-1-1.html

    关键字 :ext3 blocks-list 恢复

    一、背景

    前几天看到有朋友问如何恢复在 ext3 文件系统中误删除的文件,有一位朋友(sorry ,名字忘记了)提到了 debugfs 。
       
    所以今天花了点时间测试了一下,发现 debugfs 的 undel 和 lsdel 根本无法用于 ext3 文件系统。至于原因嘛,在上面提到
       
    的那篇 wiki 中已经有提到,就在 'Undeletino' section 。大意就是 :debugfs 的 lsdel 和 undel 只能用于 ext2 ,因为 ext3 的删

    除机制是直接把 inode 中的 blocks list 删除了,所以造成 ext3 无法反删除。


    二、思路

    既然无法做到事后恢复,是否可以做到尽量预防,或者能够在发生误删除事件时如何抢救尽可能多的数据呢?
       
    所以想到了之前学过的 filefrag 命令,本来该命令是用于显示文件的碎片情况的,但它提供了 -v 参数,可以很方便的知道
       
    一个文件在磁盘系统上是如何分布的。如果我们平时在日常工作中维护一个重要文件的 blocks 列表,一旦某个文件被删除,

    可以通过其 blocks list 重新把它们“拼凑”起来,虽然不一定保证百分百可以用,但应该是可以挽救一部分数据的,幸运的话可以做到 100%

    就象下面的两个例子

       下面就让我们先从一个简单的例子开始
       
       下面是用 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 )

    [ 本帖最后由 ailms 于 2007-9-5 00:30 编辑 ]



    2007-9-5 00:25
      下载次数: 41
    fileblocks.rar (1.54 KB)
     


    您对本贴的看法:鲜花[2] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    2楼 发表于 2007-9-5 00:16 
    =====================================================================================

    下面我们再看一个较为复杂的例子

    这是一个用到多个 block 的文件,不像上面只用到1个 block 而已。

    [root@mail tmp]# filefrag -v xinetd.conf-manual
    Checking xinetd.conf-manual
    Filesystem type is: ef53
    Filesystem cylinder groups is approximately 7440
    Blocksize of file xinetd.conf-manual is 4096
    File size of xinetd.conf-manual is 36736 (9 blocks)
    First block: 2769171
    Last block: 2769199
    Discontinuity: Block 1 is at 2769184 (was 2769171)
    Discontinuity: Block 5 is at 2769189 (was 2769187)
    Discontinuity: Block 7 is at 2769198 (was 2769190)
    xinetd.conf-manual: 4 extents found, perfection would be 1 extent
    [root@mail tmp]#

    可以看到它其实可以分成四组 block group

    2769171 ~ 2769171 (1 block)

    2769184 ~ 2769187  ( 4 blocks)

    2769189 ~ 2769190   (2 blocks )

    2769198 ~ 2769199    (2 blocks )

    合计 : 1 + 4 + 2 + 2 = 9 blocks ,刚好等于上面 filefrag 的输出


    有一点要特别注意的,block 的编号是从 #0 开始,而不是从 1# 开始

    下面我们就分四次分部分恢复

    第一部分

    root@mail tmp]# dd if=/dev/hdb2 of=part1 bs=4096 count=1 skip=2769171
    1+0 records in
    1+0 records out

    第二部分

    [root@mail tmp]# dd if=/dev/hdb2 of=part2 bs=4096 count=4 bs=4096 skip=2769184
    4+0 records in
    4+0 records out
    [root@mail tmp]#      

    第三部分

    [root@mail tmp]# dd if=/dev/hdb2 of=part3 bs=4096 count=2 skip=2769189
    2+0 records in
    2+0 records out

    第4部分

    [root@mail tmp]# dd if=/dev/hdb2 of=par4 bs=4096 count=2 skip=2769198
    2+0 records in
    2+0 records out
    [root@mail tmp]#

    最后把它们合并在一起

    [root@mail tmp]# cat part1 part2 part3 par4 > recover
    [root@mail tmp]#

    当前需要比较一下是否有差异了

    [root@mail tmp]# diff recover xinetd.conf-manual
    922d921
    <
    / No newline at end of file
    [root@mail tmp]#   

    为什么会出现上面的东西呢?看下面的图就知道了

    这是原文件的结尾部分

    Click here to open new window
                            CTRL+Mouse wheel to zoom in/out

    这是合并后的 recover 文件的结尾部分

    Click here to open new window
                            CTRL+Mouse wheel to zoom in/out

    看到那些 '^@' 字符了吗?这是 NULL 字符。

    用 vi 打开把最后的 '^@' 行删除,再报存退出

    [root@mail tmp]# diff recover xinetd.conf-manual
    [root@mail tmp]#

    hoho,现在两个文件一致了,说明恢复工作成功了 !!

    =====================================================================================

    [ 本帖最后由 ailms 于 2007-9-5 00:23 编辑 ]



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    3楼 发表于 2007-9-5 00:20 
    细心的朋友可能会问,这些 block list 信息是通过 filefrag 得到的,如果文件被删除了,还怎么用 filefrag 看呢?

    这就引出下面的脚本 :fileblocks.sh

    1、该脚本的目的是从用户接受一个参数(-f 或者 -d),如果是目录(-d)则查找其下的所有普通文件(包括二进制)。

                  不含目录文件、设备文件、 socket 文件,因为 filefrag 无法对这些文件进行操作,而且它们可以通过 mkdir 或者 mkfifo、
                 
                          mknod 命令创建,不需要备份。
                         
    2、对每个文件用 filefrag -v 操作,得出其 blocks list       

    3、把每个文件的名称、inode 值、以及 blocks-list 写入 /root/files.blocks 文件

    [ 本帖最后由 ailms 于 2007-9-5 00:23 编辑 ]



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    4楼 发表于 2007-9-5 00:23 
    下面是一些截图

    语法



    -f 参数



    -d 参数

    Click here to open new window
                            CTRL+Mouse wheel to zoom in/out



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ssmarine   帅哥
    精灵王



    UID:355993
    注册:2005-12-28
    最后登录: 2007-09-06
    帖子: 256
    精华:0

    可用积分:207
    信誉积分: 100
    专家积分: 0 (本版)

    来自:东方
    状态: ...离线...

    [资料] [站内短信] [Blog]


    5楼 发表于 2007-9-5 09:11 
    还没来得及看,先顶~~



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________

    老兵永远不会死,他们只是渐渐消逝.

    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    版主 platinum (何时才能飞)
    版主-法王
    大脚大脚快快好!快~快~好!



    UID:26424
    注册:2002-11-2
    最后登录: 2007-09-06
    帖子: 18494
    精华: 22

    可用积分:3633
    信誉积分: 105
    专家积分: 50 (本版)

    状态:...保密...

    [资料] [站内短信] [Blog]


    6楼 发表于 2007-9-5 09:33 
    有没有可能一个文件分成多个 block 存放,分很多部分,但每个部分都有类似“填不满”的情况(不足 4096)
    这样的话,如果链接多个 part,中间有杂乱数据干扰怎么办?
    还有,文本文件还好办,若是二进制文件或其他非明文的文件怎么办?



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________

    当我们在为生活而疲惫奔波的时候
    生活却渐渐离我们远去
    find our way, find our style
    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    寂寞烈火   帅哥
    法王



    UID:187152
    注册:2004-10-1
    最后登录: 2007-09-06
    帖子: 19127
    精华: 5

    可用积分:6999
    信誉积分: 100
    专家积分: 10 (本版)

    来自:北京海淀
    状态: ...离线...

    [资料] [站内短信] [Blog]


    7楼 发表于 2007-9-5 10:42 
    据说mc也有undel的功能, 没用过



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________

              ~/____//..//      //..//____/~
                 { ___(pq)     (pq)____}
                RedHat Gnu/Linux 9
    GNU{Bash2.05 Grep2.5.1 Sed4.05 Awk3.1.1}

    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    8楼 发表于 2007-9-5 10:58 
    多谢楼上各位朋友 ^_^

    QUOTE:
    有没有可能一个文件分成多个 block 存放,分很多部分,但每个部分都有类似“填不满”的情况(不足 4096)
    这样的话,如果链接多个 part,中间有杂乱数据干扰怎么办?
    还有,文本文件还好办,若是二进制文件或其他非明文的文件怎么办?

    这些问题都有考虑过,不过这些超过了我的知识范围,所以目前做不到



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    9楼 发表于 2007-9-5 10:59 
    多谢烈火兄,我再 google 一下



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    ailms
    大天使



    UID:54105
    注册:2003-4-28
    最后登录: 2007-09-06
    帖子: 2189
    精华: 9

    可用积分:1623
    信誉积分: 105
    专家积分: 2 (本版)

    状态: ...离线...

    [资料] [站内短信] [Blog]


    10楼 发表于 2007-9-5 11:04 
    TO 烈火兄 :

    刚刚 google 了一下,发现 mc 反删除也只能用于 ext2

    而且v2.0 之前的 kernel 的话只能恢复前面的 12KB

    http://www.linuxpk.com/118.html

    而且实际上也是用的 debugfs 的 lsdel 和 dump 命令

    [ 本帖最后由 ailms 于 2007-9-5 11:07 编辑 ]



    您对本贴的看法:鲜花[0] 臭蛋[0]

    __________________________________


    嵌入式Linux人才出国就业年薪高达30万 | 送Linux集群,十一长假精通Linux技术! | 免费下载IBM社区版软件,体验高效开发
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值