Linux 数据恢复

  1. 前言
    在Linux上进行操作的时候,如果不小心删除了某些重要的目录或者文件怎么办?linux上又没有回收站(服务器版本),一旦不小心,
    不就得删库跑路?保证数据安全最好的方法是做好备份,虽然备份不是万能的,但是没有备份是万万不行的。任何数据恢复工具都有一定局限性,都不能保证完整地恢复出所有数据。数据恢复这方面还是得做好功课的。

  2. linux下的数据 恢复工具
    在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs,ext3grep,extundelete,testdisk,grep。
    在网上看了几篇大佬的博客。前人踩过的坑我们就小心的避开他了。直接上硬菜,这里使用的是 extundelete 进行数据恢复

  3. 简介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命令将这些信息备份出来,从而恢复数据文件

  4. 安装
    首先,我们在虚拟机软件中新建一个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 查看相关命令

  1. 模拟实战
    数据删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区。避免再次写入数据
    恢复步骤如下

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
成功恢复

删库的避免方法 - 自建回收站

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/*
}
posted @ 2021-09-24 16:00  黑曼巴后仰  阅读(807)  评论(0编辑  收藏  举报