LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1743|回复: 2

恢复被rm删除的文件

[复制链接]
发表于 2005-11-4 03:56:04 | 显示全部楼层 |阅读模式
不小心用rm删掉了一些对我很重要的视频文件
记得以前看到过什么介绍,可以通过一定的手法恢复
Google出来几篇文章说的很好
用debugfs和fsgrab来解决,但是的确太繁琐,需要一个一个手动去把每个block段恢复
于是写了一个简单的脚本,用于恢复文件
具体步骤如下:

0, 开始之前有几个注意或者我不解的地方
   0.0, ext2文件系统肯定没有问题,其他文件系统不清楚,如果有人尝试了ext3,
        请告诉我结果,谢谢
   0.1, 在root filesystem上debugfs提示我
        “Bad magic number in super-block while opening filesystem”
        不知道其他系统有没有
   0.2, debugfs在debian中属于e2fsprogs包, fsgrab google 很容易找到,这里用的1.2
   0.3, 最好能保证被删除之后的磁盘上没有写操作发生,虽然rootfs很难做到
        如果非rootfs,可以mount为ro, 以下操作请到其他分区执行。

1, #debugfs /dev/hdaX //请以root身份运行,hdaX是你误删除文件分区设备号
   #echo lsdel|debugfs /dev/hdaX | less //会得到如下的信息

   debugfs:   Inode  Owner  Mode    Size    Blocks   Time deleted
   328953      0 100755 17670023 4320/4320 Thu Oct 13 20:06:16 2005
   147200      0 100644    208    1/   1 Fri Oct 28 01:12:25 2005
   328951   1000 100755 82678799 20207/20207 Thu Nov  3 23:54:13 2005
   328952   1000 100755 30568932 7473/7473 Thu Nov  3 23:54:13 2005
   328954   1000 100755 92395329 22582/22582 Thu Nov  3 23:54:13 2005
   328955   1000  40755      0    1/   1 Thu Nov  3 23:54:13 2005
   328956   1000 100755 4825437 1182/1182 Thu Nov  3 23:54:13 2005
   328957   1000 100755 473124300 115623/115623 Thu Nov  3 23:54:13 2005
   328958   1000 100755 313222639 76547/76547 Thu Nov  3 23:54:14 2005
   328959   1000 100755 32610840 7971/7971 Thu Nov  3 23:54:14 2005
   328960   1000 100755 120325923 29407/29407 Thu Nov  3 23:54:14 2005
   328961   1000 100755 38381468 9382/9382 Thu Nov  3 23:54:14 2005
   328962   1000 100755 102099149 24953/24953 Thu Nov  3 23:54:14 2005
   328964   1000 100755 64430572 15748/15748 Thu Nov  3 23:54:14 2005
   328965   1000 100755 253499392 61952/61952 Thu Nov  3 23:54:14 2005
   328966   1000 100755 160061483 39118/39118 Thu Nov  3 23:54:14 2005
   328967   1000 100755 152298779 37221/37221 Thu Nov  3 23:54:14 2005
   328968   1000 100755 22448132 5488/5488 Thu Nov  3 23:54:15 2005
   328969   1000 100755 34419302 8414/8414 Thu Nov  3 23:54:15 2005
   328970   1000 100755 338909848 82824/82824 Thu Nov  3 23:54:15 2005
   328971   1000 100755 3020713  739/ 739 Thu Nov  3 23:54:15 2005
   328972   1000 100755 261570359 63924/63924 Thu Nov  3 23:54:15 2005
   22 deleted inodes found.


   其中那些删除时间为Nov 3的就是我所关心的,cp下他们的inode号,保存在一个文件中
   比如叫做inodes.txt
           #cat inodes.txt
        328951
        328952
        328954
        328955
        328956
        328957
        328958
        328959
        328960
        328961
        328962
        328964
        328965
        328966
        328967
        328968
        328969
        328970
        328971
        328972
2, 在保证当前目录有足够空间的时候,可以尝试运行一下下面这个脚本
        ./recover_from_rm /dev/hda8 328951 4096 recover.test
        注:328951是上面第一个inode号
            这里的block size似乎和普通的512k字节不同,如果不知道的话
            打开debugfs, stat <328951>, 看这个文件的大小除以最下面的
            Total blocks数目,和512,1024,2048,4096哪个最接近就是哪个
            我这里是4096,最好找个不大不小的文件看

==================================================================================
#Recover 1 file by its inode number.
#!/bin/sh
usage(){
        echo "./recover_from_rm DEV_NAME INODE_NO BLOCK_SIZE OUTPUT_NAME"
        echo "DEV_NAME: device name, for exmaple /dev/hda3;"
        echo "INODE_NO: inode number of file you want to recover;"
        echo "BLOCK_SIZE: depend on your system, ext2 default 4096;"
}
if [ `whoami` != root ] || [ $# -ne 4 ];then
        echo "You must run as root."
        usage;
        exit;
fi
which debugfs
TMP1=$?
which fsgrab
TMP2=$?
if [ $TMP1 != 0 ] || [ $TMP2 != 0 ];then
        echo "Have you installed debugfs and fsgrab?"
        exit
fi
#Start retrive blocks by inode number.
#Get inode info.
debugfs -R "stat <$2>"  $1 > tmp
#List all valid blocks, redirect to tmp.blocks.
cat tmp |grep -A1 BLOCKS | sed -e "/BLOCKS/d" -e "s/\,/\n/g"|grep -v IND|cut -d: -f2 > tmp.blocks
for ranges in $(cat tmp.blocks);do
        R1=$(echo $ranges|cut -d- -f1);
        R2=$(echo $ranges|cut -d- -f2);
        let BLOCKS=($R2-$R1+1);
        #echo $BLOCKS;
        fsgrab -b $3 -c $BLOCKS -s $R1 $1 >> $4
done
==================================================================================
    如果脚本执行顺利,recover.test应该会复原,我这里是视频文件,直接播放就OK了
    如果没有,请检查你的block-size是否正确,脚本很简单,可以根据自己的需求修改。
    接下来可以整体转换了,一句话搞定
    #i=1;for inodes in $(cat inodes.txt);do ./recover_from_rm /dev/hda8 $inodes 4096 recover.$i;((i=i+1));done
发表于 2005-11-4 09:08:38 | 显示全部楼层
晕,昨晚我刚不小心删除了xorg.conf,现在鼠标设置不记得了,动起来好慢
回复 支持 反对

使用道具 举报

发表于 2005-11-4 14:06:38 | 显示全部楼层
ext3应该是不行的,如果在ext3下误用rm的话。。。我现在还没找到解决办法。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表