一、简介
在使用Linux系统时,有时候会不小心误删除数据,由于Linux系统也没有与Windows系统下回收站类似的功能,一般会认为该文件将无法找回。
本文主要以CentOS7操作系统为例,介绍如何使用开源工具Extundelete快速恢复被误删除掉的数据。
二、原理
在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大。
Extundelete是基于linux的开源数据恢复软件,能够利用inode信息结合日志去查询该inode所在的block位置,以次来查找和恢复所需的数据,该工具最给力的一点就是支持ext3/ext4双格式分区恢复,基于整个磁盘的恢复功能较为强大。
在数据被误删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区。
因为将文件删除后,仅仅是将文件的inode结点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据块被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回力无天。所以,以只读模式挂载磁盘可以尽量降低数据块中数据被覆盖的风险,以提高恢复数据成功的几率。
在实际线上恢复过程中,切勿将extundelete安装到您误删的文件所在硬盘,这样会有一定几率将需要恢复的数据彻底覆盖,切记操作前做好快照备份。
三、使用方法**
本文以阿里云服务为例进行演示。关于阿里云服务器及磁盘的购买请参阅阿里云文档。
3.1 需要安装的依赖软件
1 | yum -y install bzip2 e2fsprogs-devel e2fsprogs gcc-c++ make |
extundelete需要libext2fs版本1.39或更高版本来运行,但是对于ext4支持,请确保您有e2fsprogs版本1.41或更新版本(可以通过运行命令“dumpe2fs”并记录其输出的版本)。
3.2 部署extundelete工具
1 | wget http://zy-res.oss-cn-hangzhou.aliyuncs.com/server/extundelete-0.2.4.tar.bz2 |
默认文件安装在usr/local/bin
3.3 使用extundelete,模拟数据误删除然后恢复的过程
为了模拟整个过程,小编在阿里云上新买一块磁盘,格式化,挂载,然后删除文件,并且恢复,详情如下:
3.3.1 购买磁盘,格式化
在阿里云服务器所在区域购买磁盘,并挂载到相关服务器上。
- 查看服务上挂载的磁盘
1 | [root@ecs-prod-wiki extundelete-0.2.4]# fdisk -l |
- 格式化成ext4格式
1 | [root@ecs-prod-wiki extundelete-0.2.4]# mkfs.ext4 /dev/vdb |
3.3.2 挂载新分区
1 | [root@ecs-prod-wiki extundelete-0.2.4]# mkdir /testDeleteFile |
3.3.3 创建文件
1 | [root@ecs-prod-wiki testDeleteFile]# touch helloWorld.txt |
3.3.4 记录文件的md5值
1 | [root@ecs-prod-wiki testDeleteFile]# md5sum helloWorld.txt |
3.3.5 删除文件
1 | [root@ecs-prod-wiki testDeleteFile]# rm helloWorld.txt -f |
3.3.6 离开磁盘
1 | [root@ecs-prod-wiki testDeleteFile]# cd |
3.3.6 卸载磁盘
- 结束使用某分区的进程树,保证磁盘没进程使用
1 | [root@ecs-prod-wiki ~]# fuser -k /testDeleteFile/ |
- 卸载磁盘
1 | [root@ecs-prod-wiki ~]# umount /dev/vdb |
任何的文件恢复工具,在使用前,均要将要恢复的分区卸载或挂载为只读,防止数据被覆盖使用
3.3.7 使用Extundelete工具恢复文件
- 查找删除的文件
1 | [root@ecs-prod-wiki ~]# extundelete --inode 2 /dev/vdb |
为查找某i节点中的内容,使用2则说明为整个分区搜索,如果需要进入目录搜索,只须要指定目录I节点即可。这是可以看到删除的文件名和inode
- 恢复文件
1 | [root@ecs-prod-wiki ~]# /usr/local/bin/extundelete --restore-inode 12 /dev/vdb |
此时会在执行命令的同级目录下出现RECOVERED_FILES目录,查看是否恢复。
1 | [root@ecs-prod-wiki ~]# ll RECOVERED_FILES/ |
- 通过md5值查看文件是否一样
1 | [root@ecs-prod-wiki ~]# md5sum RECOVERED_FILES/file.1 |
–restore-inode 12 # –restore-inode 按指定的I节点恢复
–extundelete –restore-all # –restore-all 全部恢复