-
前言
在Linux上进行操作的时候,如果不小心删除了某些重要的目录或者文件怎么办?linux上又没有回收站(服务器版本),一旦不小心,
不就得删库跑路?保证数据安全最好的方法是做好备份,虽然备份不是万能的,但是没有备份是万万不行的。任何数据恢复工具都有一定局限性,都不能保证完整地恢复出所有数据。数据恢复这方面还是得做好功课的。 -
linux下的数据 恢复工具
在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs,ext3grep,extundelete,testdisk,grep。
在网上看了几篇大佬的博客。前人踩过的坑我们就小心的避开他了。直接上硬菜,这里使用的是 extundelete 进行数据恢复 -
简介extundelete
extundelete是基于Linux的一个数据恢复工具,它通过分析文件系统的日志,解析出所有文件的inode信息,从而可以恢复Linux
下主流的ext3、ext4文件系统下被误删除的文件。而ext3grep仅支持ext3文件系统的恢复。在恢复速度上,extundelete要快很多,因为extundelete的恢复机制是扫描inode和恢复数据同时进行,并且支持单个文件恢复、单个目录恢复、inode恢复、block恢复、完整磁盘恢复等,而ext3grep就略显笨拙了,它需要首先扫描完要恢复数据的所有inode信息,然后才能开始数据恢复,所以在恢复速度上相对较慢,并且在功能上也不支持目录恢复、时间段恢复等。在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根目录的inode一 般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该 inode所在的block位置,包括直接块、间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件 -
安装
首先,我们在虚拟机软件中新建一个Ubuntu16.04 的虚拟机(安全第一)。ubuntu的文件系统是ext4的。
默认新建完成。
sudo apt-get install e2fslibs-dev //依赖包
sudo apt-get install extundelete //安装extundelete
其它Linux系统可以下载extundelete的源包,进行编译安装
extundelete的官方网站是http://extundelete.sourceforge.net/
其目前的稳定版本是extundelete-0.2.4。在安装extundelete之前需要安装e2fsprogs和e2fsprogs-libs两个依赖包
[root@ubuntu app]# tar jxvf extundelete-0.2.4.tar.bz2
[root@ubuntu app]# cd extundelete-0.2.4
[root@ubuntu extundelete-0.2.4]# ./configure
[root@ubuntu extundelete-0.2.4]# make
[root@ubuntu extundelete-0.2.4]# make install
安装完成后可执行 extundelete --help
查看相关命令
- 模拟实战
数据删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区。避免再次写入数据
恢复步骤如下
0.环境模拟
[root@ubunutu ~]# mkdir /data
[root@ubunutu ~]# mkfs.ext4 /dev/sdb
[root@ubunutu ~]# mount /dev/sdb /data
[root@ubunutu ~]# mkdir del_test_files //然后往这个文件放一些测试文件和目录
[root@ubunutu ~]# cp -r del_test_files /data
[root@ubunutu data]# rm -rf /data/*
1.卸载误删文件所在的分区
df -T //查看文件系统类型
df -h //查看分区
umount /dev/sdb // 卸载分区
2.使用extundelete 进行数据恢复
//查询/dev/sdb分区可恢复的数据信息
[root@ubuntu /]# extundelete /dev/sdb --inode 2
......
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11 Deleted
del_test_files 131073 Deleted
可以通过inode号,文件路径恢复数据
extundelete /dev/sdb --restore-inode inode号
extundelete /dev/sdb --restore-file 文件名
extundelete /dev/sdb --restore-file 路径 //这个路径是文件的相对路径。相对路径是相对于原来文件的存储路径而言的,比如,原来文件的存储路径是/data/test.txt,那么在参数 后面直接指定test.txt文件即可,如果原来文件的存储路径是/data/test/test.txt,那么在参数后面通过“test /mytest.txt”指定即可
恢复一个目录及目录下的文件
root@ubuntu:/home/fy# extundelete /dev/sdb --restore-directory /del_test_files
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 64 groups loaded.
Loading journal descriptors ... 99 descriptors loaded.
Searching for recoverable inodes in directory /del_test_files ...
13 recoverable inodes found.
Looking through the directory structure for deleted files ...
2 recoverable inodes still lost.
恢复一个文件
root@ubuntu:/home/fy# extundelete /dev/sdb --restore-file 1.txt
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 64 groups loaded.
Loading journal descriptors ... 99 descriptors loaded.
Successfully restored file 1.txt
恢复所有文件
extundelete /dev/sdb --restore-all--restore-all
执行后会在执行当期目录生成一个RECOVERED_FILES
目录,里面包含已恢复的文件
![IMAGE](quiver-image-url/4A6ECBC74F654C2FBBD26C9733B9F1C7.jpg =397x37)
成功恢复
删库的避免方法 - 自建回收站
alias rm=trash
alias rl='ls ~/.Trash'
alias ur=undelfile
undelfile()
{
mv -i ~/.Trash/$@ ./
}
trash()
{
path=`cd ./ ;pwd -P`
mkdir -p ~/.Trash/$path
mv $@ ~/.Trash/$path
}
cleartrash()
{
read -p "Clear trash?[n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ] && /usr/bin/rm -rf ~/.Trash/*
}