|
不小心用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 |
|