Linux误删数据恢复

引子

指在键上飘,难免会湿手套。当你按下shift+del键后,会不会突然心里凉透,当你执行rm -rf后,会不会马上去搜索哪个国家入境不需要签证。或者你还会遇到如下的情况:

root@4xem7:~# alias
alias cd='rm -rf'
alias d='docker'

数据恢复原理浅析


如图所示,硬盘上数据的存放有一个类似于书本目录的东西存在,就是图中最上面那一排圆形。硬盘格式化后,被分割成了很多个小块,就像蜂巢一样,一个个的小房间,就是上图中间部分的长方块,这个小房间才是真正存放数据的地方,最下面的数字,是房间号,也就是inode号。如果我们要使用文件A,在最上面的目录里面就能很快的知道文件A在1号房间。
什么情况下,被误删的数据能恢复
误删情况发生后,第一重要的事情就是卸载误删数据所在的分区,而不是关机,绝对不能关机,为什么?现在所有的系统优化,其本质就是把硬盘IO转换成内存IO,就是把本该到硬盘里面去读写的内容,提前预载到内存里面去。你若正常关机,redis持久化的数据,可能有好几个G,mysql的InnoDB_Buffer_Pool缓冲池里面的东西(可能有好几十个G),这些东西往硬盘里面一写,你还想恢复数据,等我发明时光机吧。为什么说马上卸载分区,数据就能恢复。看下图,rm -rf删除了A文件。

其实,系统只是删除了目录里面的文件指向,文件A还好好的趟在1号房间里面。所以这种情况,文件是能很轻松的恢复的。
什么情况下,被误删的数据不能恢复
承接上一张图,目录里面显示1号房间是空的,可以重新放数据进去,若此时,硬盘又接收到写入请求(比方说你脑抽,把数据恢复软件安装到了误删数据所在的分区),就会把数据写入1号房间:

此时,你若还想恢复数据,只能等我发明时光机了。

extundelete恢复举例

extundelete可以恢复ext3、ext4文件系统下被误删的文件,看其恢复原理xfs文件系统应该也是可以恢复的。

安装extundelete

在安装extundelete前,需要安装e2fsprogs和e2fsprogs-libs,自行用yum安装就可以。

[root@dish ~]# rpm -qa |grep e2fsprogs
e2fsprogs-libs-1.41.12-22.el6.x86_64
e2fsprogs-1.41.12-22.el6.x86_64

epel源里面有extundelete,直接安装就行。

[root@dish ~]# yum install extundelete -y
[root@dish ~]# rpm -ql extundelete
/usr/bin/extundelete
/usr/share/doc/extundelete-0.2.4
/usr/share/doc/extundelete-0.2.4/LICENSE
/usr/share/doc/extundelete-0.2.4/README

extundelete常用参数解释

Options:

  --superblock           显示超级块信息,默认选项.
                         
  --journal              显示日志信息.
  --after dtime         表示在某段时间之后被删除的文件或目录.
  --before dtime         表示在某段时间之前被删除的文件或目录.
Actions:
  --inode ino            Show info on inode 'ino'.
  --block blk            Show info on block 'blk'.
  --restore-inode ino[,ino,...]
                         恢复指定inode号的文件,恢复出来的文件会放在当前目录下的RECOVERED_FILES文件夹中
  --restore-file 'path'  恢复指定路径的文件
  --restore-files 'path' 恢复在路径中列出的所有文件
 
  --restore-all          尝试恢复所有目录和文件
 

恢复文件

➤测试文件

[root@dish reco]# for i in A B C D;do echo "this is file$i">$i;done
[root@dish reco]# cat A B C D
this is fileA
this is fileB
this is fileC
this is fileD
[root@dish reco]# find ./ -type f |xargs md5sum >./file.md5
[root@dish reco]# cat file.md5 
d41d8cd98f00b204e9800998ecf8427e  ./file.md5
c2f9bc9edb959d08dc838af14c5cd8ff  ./C
afc688bfcd0666302ed55da472ecfbb8  ./B
0a540f40e1e8c3e5ad50571f1621d5b3  ./A
2c3fdd8c8e23a1ba2d0381981f337348  ./D
[root@dish reco]# rm -rf A B C D
[root@dish reco]# ls
file.md5

➤卸载磁盘分区
发现数据误删后,只做一件事,卸载数据所在分区

[root@dish reco]# cd
[root@dish ~]# umount /dev/vdb1

➤查询可恢复的数据
首先查看数据所在目录reco的inode号

[root@dish ~]# extundelete /dev/vdb1 --inode 2 |grep reco
reco                                              131073

reco目录的inode号131073

[root@dish ~]# extundelete /dev/vdb1 --inode 131073 |tail
Triple indirect block: 0

File name                                       | Inode number | Deleted status
.                                                 131073
..                                                2
A                                                 131074         Deleted
B                                                 131075         Deleted
C                                                 131076         Deleted
D                                                 131077         Deleted
file.md5                                          131078

如上所示,标记为Deleted状态的就是误删的文件,同时还能看到对应文件的inode值,有了这些,我们就可以恢复文件了。

[root@dish ~]# extundelete /dev/vdb1 --restore-file reco/C
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 2858 descriptors loaded.
Successfully restored file reco/C
[root@dish ~]# extundelete /dev/vdb1 --restore-file reco/D
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 2858 descriptors loaded.
Successfully restored file reco/D

--restore-file 后面的reco/C是个相对路径,其原本的路径是/bak/reco/C,而bak目录挂载的就是/dev/vdb1。文件恢复成功后,会在你执行恢复命令的当前目录生成一个RECOVERED_FILES目录,恢复出来的文件就在里面。

[root@dish ~]# cd RECOVERED_FILES/reco/
[root@dish reco]# md5sum -c file.md5 
./C: OK
./B: OK
./A: OK
./D: OK

恢复出来的文件经过MD5校验全通过。恢复成功。

恢复目录

[root@dish reco]# mkdir mulu
[root@dish reco]# cd !$
cd mulu
[root@dish mulu]# touch {01..09}
[root@dish mulu]# ls
01  02  03  04  05  06  07  08  09 
[root@dish mulu]# cd ..
[root@dish reco]# rm -rf mulu
[root@dish reco]# cd
[root@dish ~]# r umount
umount /dev/vdb1
[root@dish ~]# extundelete /dev/vdb1 --restore-directory /reco/mulu
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 160 groups loaded.
Loading journal descriptors ... 2857 descriptors loaded.
Searching for recoverable inodes in directory /reco/mulu ... 
10 recoverable inodes found.
Looking through the directory structure for deleted files ... 
2 recoverable inodes still lost.
[root@dish reco]# ls mulu/
01  02  03  04  05  06  07  08

目录被成功恢复,注意,目录里面的空文件是无法恢复的,09就是一个空文件。

恢复所有文件

需要恢复的文件数量过多的时候,可以用这个选项。

[root@dish tmp]# extundelete /dev/vdb1 --restore-all

恢复某个时间点之后删除的文件

这个应该是用的最多的场景了,比方说需要恢复一个小时内被删除的文件。

extundelete --after `echo $(date +%s)-3600 |bc` --restore-all /dev/vdb1

一个小时3600秒,根据自己需求修改上面的减数。

原创文章,转载请注明: 转载自笛声

本文链接地址: Linux误删数据恢复

5 条评论

  • 姜辰 2017年7月8日 回复

    sudu rm- rf/ 这个~另外今天也第一次知道原来还是可以恢复~那如果一个脚本是rm -rf / ,然后关机,估计是彻底无解了吧?

    • dige 2017年7月8日 回复 作者

      不能恢复的前提是内存中有大量数据会在正常关机的时候写入硬盘,若内存中没啥数据会写入硬盘,也是可以恢复的,顺着你的思路讲,若你rm -rf /,可能会把关机命令删掉。。。数据恢复被神话了,2011年的时候,一好友靠EasyRecovery软件,花了半小时,把别人的数据恢复出来,然后假装加班加点了两天两夜,然后收了8000块。

      • 姜辰 2017年7月8日 回复

        额,这个也是666了

  • john 2017年7月9日 回复

    ctrl+z好像在linux里没有。这个功能比较爽。

  • 笛声 2017年10月15日 回复

    试过7DataRecoverySuite
    DiskGenius企业版
    EasyRecovery Professional
    FinalData企业版
    都没恢复出来的数据竟然被R-STUDIO恢复了...原本我已不抱希望了,没想到啊没想到还是给恢复出来了,正确率98% 基本上可以说是完全恢复无论是图片还是视频还是压缩包

发表评论

电子邮件地址不会被公开。 必填项已用*标注