• Linux下高效数据恢复软件extundelete应用实战


    推荐:10年技术力作:《高性能Linuxserver构建实战Ⅱ》全网发行,附试读章节和全书实例源代码下载!


    作为一名运维人员。保证数据的安全是根本职责。所以在维护系统的时候,要慎之又慎。可是有时难免会出现数据被误删除的情况,在这个时候改怎样高速、有效地恢复数据呢?本文我们就来介绍一下Linux系统下经常使用的几个数据恢复工具。



    一、怎样使用“rm -rf”命令


    在Linux系统下,通过命令“rm -rf”能够将不论什么数据直接从硬盘删除。而且没有不论什么提示。同一时候Linux下也没有与Windows下回收站类似的功能,也就意味着,数据在删除后通过常规的手段是无法恢复的。因此使用这个命令要很谨慎。在使用rm命令的时候。比較稳妥的方法是把命令參数放到后面,这样有一个提醒的作用。事实上另一个方法,那就是将要删除的东西通过mv命令移动到系统下的/tmp文件夹下,然后写个脚本定期运行清除操作,这样做能够在一定程度上减少误删除数据的危急性。


    事实上保证数据安全最好的方法是做好备份,尽管备份不是万能的,可是没有备份是万万不行的。不论什么数据恢复工具都有一定局限性,都不能保证完整地恢复出全部数据。因此,把备份作为核心,把数据恢复工具作为辅助是运维人员必须坚持的一个准则。




    二、extundelete与ext3grep的异同
    在Linux下,基于开源的数据恢复工具有非常多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比較经常使用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,仅仅是extundelete功能更加强大,本文重点介绍extundelete的使用。


    三、extundelete的恢复原理
    在介绍使用extundelete进行恢复数据之前,简介下关于inode的知识。在Linux下能够通过“ls –id”命令来查看某个文件或者文件夹的inode值,比如查看根文件夹的inode值。能够输入:


    [root@cloud1 ~]# ls -id  / 
    2 /
    由此可知。根文件夹的inode值为2。


    在利用extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根文件夹的inode一般为2)来获得当前文件系统下全部文件的信息。包含存在的和已经删除的文件,这些信息包含文件名称和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包含直接块。间接块等信息。

    最后利用dd命令将这些信息备份出来,从而恢复数据文件。


    四、 安装extundelete
    extundelete的官方站点是http://extundelete.sourceforge.net/ 。其眼下的稳定版本号是extundelete-0.2.4。,在安装extundelete之前须要安装e2fsprogs和e2fsprogs-libs两个依赖包。


    e2fsprogs和e2fsprogs-libs安装很easy,这里不做介绍。以下是extundelete的编译安装过程:


    [root@cloud1 app]#tar jxvf  extundelete-0.2.4.tar.bz2
    [root@cloud1 app]#cd extundelete-0.2.4
    [root@cloud1 extundelete-0.2.4]#./configure
    [root@cloud1 extundelete-0.2.4]#make
    [root@cloud1 extundelete-0.2.4]#make install
    安装成功extundelete后,会在系统中生成一个extundelete可运行文件。extundelete的使用很easy。读者能够通过“extundelete  --help”获得此软件的用法。 


    五、extundelete使用方法具体解释
    extundelete安装完毕后,就能够运行数据恢复操作了。本节具体介绍下extundelete每一个參数的含义。

    extundelete使用方法例如以下:
    extundelete --help
    命令格式: 
    1
    extundelete [options] [action] device-file
    当中參数(options)有:
    --version, -[vV],显示软件版本。
    --help,显示软件帮助信息。
    --superblock。显示超级块信息。


    --journal,显示日志信息。


    --after dtime。时间參数,表示在某段时间之后被删的文件或文件夹。
    --before dtime,时间參数。表示在某段时间之前被删的文件或文件夹。


    动作(action)有:
    --inode ino。显示节点“ino”的信息。


    --block blk,显示数据块“blk”的信息。
    --restore-inode ino[,ino,...]。恢复命令參数。表示恢复节点“ino”的文件,恢复的文件会自己主动放在当前文件夹下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。
    --restore-file 'path'。恢复命令參数,表示将恢复指定路径的文件,并把恢复的文件放在当前文件夹下的RECOVERED_FILES文件夹中。
    --restore-files 'path',恢复命令參数,表示将恢复在路径中已列出的全部文件。
    --restore-all,恢复命令參数。表示将尝试恢复全部文件夹和文件。
    -j journal,表示从已经命名的文件里读取扩展日志。
    -b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。
    -B blocksize,表示使用数据块大小来打开文件系统。一般用于查看已经知道大小的文件。


    六、实战:extundelete恢复数据的过程
    在数据被误删除后。第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区,假设是系统根分区的数据遭到误删除,就须要将系统进入单用户。而且将根分区以仅仅读模式挂载。

    这样做的原因非常easy,由于将文件删除后,仅仅是将文件的inode结点中的扇区指针清零,实际文件还存储在磁盘上,假设磁盘以读写模式挂载。这些已删除的文件的数据块就可能被操作系统又一次分配出去,在这些数据块被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回力无天。所以,以仅仅读模式挂载磁盘能够尽量减少数据块中数据被覆盖的风险,以提高恢复数据成功的比率。


    6.1通过extundelete恢复单个文件
    1.模拟数据误删除环境
    在演示通过extundelete恢复数据之前,我们首先要模拟一个数据误删除环境,这里我们以ext3文件系统为例,在ext4文件系统下的恢复方式与此全然一样。简单的模拟操作步骤例如以下:


    [root@cloud1 ~]#mkdir /data
    [root@cloud1 ~]#mkfs.ext3 /dev/sdc1
    [root@cloud1 ~]#mount /dev/sdc1  /data
    [root@cloud1 ~]# cp /etc/passwd  /data
    [root@cloud1 ~]# cp -r /app/ganglia-3.4.0  /data
    [root@cloud1 ~]# mkdir /data/test
    [root@cloud1 ~]# echo "extundelete test" > /data/test/mytest.txt
    [root@cloud1 ~]#cd /data
    [root@cloud1 data]# md5sum  passwd 
    0715baf8f17a6c51be63b1c5c0fbe8c5  passwd
    [root@cloud1 data]# md5sum  test/mytest.txt 
    eb42e4b3f953ce00e78e11bf50652a80  test/mytest.txt
    [root@cloud1 data]# rm -rf /data/*
    2.卸载磁盘分区
    在将数据误删除后,立马须要做的就是卸载这块磁盘分区:


    [root@cloud1 data]#cd /mnt
    [root@cloud1 mnt]# umount /data
    3.查询可恢复的数据信息
    通过extundelete命令能够查询/dev/sdc1分区可恢复的数据信息:


    [root@cloud1 /]# extundelete  /dev/sdc1  --inode 2
    ......
    File name                                       | Inode number | Deleted status
    .                                                2
    ..                                                2
    lost+found                                        11             Deleted
    passwd                                           49153          Deleted
    test                                              425985         Deleted
    ganglia-3.4.0                                       245761         Deleted
    依据上面的输出。标记为Deleted状态的是已经删除的文件或文件夹。

    同一时候还能够看到每一个已删除文件的inode值。接下来就能够恢复文件了。


    4.恢复单个文件
    运行例如以下命令開始恢复文件:


    [root@cloud1 /]# extundelete  /dev/sdc1  --restore-file passwd 
    Loading filesystem metadata ... 40 groups loaded.
    Loading journal descriptors ... 54 descriptors loaded.
    Successfully restored file passwd
    [root@cloud1 /]# cd RECOVERED_FILES/
    [root@cloud1 RECOVERED_FILES]# ls
    passwd
    [root@cloud1 RECOVERED_FILES]# md5sum  passwd 
    0715baf8f17a6c51be63b1c5c0fbe8c5  passwd
    extundelete恢复单个文件的參数是“--restore-file”,这里须要注意的是,“--restore-file”后面指定的是恢复文件路径,这个路径是文件的相对路径。相对路径是相对于原来文件的存储路径而言的,比方,原来文件的存储路径是/data/passwd,那么在參数后面直接指定passwd文件就可以。假设原来文件的存储路径是/data/test/mytest.txt,那么在參数后面通过“test/mytest.txt”指定就可以。


    在文件恢复成功后,extundelete命令默认会在运行命令的当前文件夹下创建一个RECOVERED_FILES文件夹,此文件夹用于存放恢复出来的文件,所以运行extundelete命令的当前文件夹必须是可写的。
    依据上面的输出。通过md5sum命令校验。校验码与之前的全然一致。表明文件恢复成功。


    6.2通过extundelete恢复单个文件夹
    extundelete除了支持恢复单个文件。也支持恢复单个文件夹,在须要恢复文件夹时。通过 “--restore-directory”选项就可以恢复指定文件夹的全部数据。


    继续在上面模拟的误删除数据环境下操作,如今要恢复/data文件夹下的ganglia-3.4.0文件夹。操作例如以下:


    [root@cloud1 mnt]# extundelete  /dev/sdc1  --restore-directory /ganglia-3.4.0
    Loading filesystem metadata ... 40 groups loaded.
    Loading journal descriptors ... 247 descriptors loaded.
    Searching for recoverable inodes in directory /ganglia-3.4.0 ... 
    781 recoverable inodes found.
    Looking through the directory structure for deleted files ... 
    4 recoverable inodes still lost.
    [root@cloud1 mnt]# ls
    RECOVERED_FILES
    [root@cloud1 mnt]# cd RECOVERED_FILES/
    [root@cloud1 RECOVERED_FILES]# ls
    ganglia-3.4.0
    能够看到之前删除的文件夹ganglia-3.4.0已经成功恢复了,进入这个文件夹检查发现:全部文件内容和大小都正常。


    6.3 通过extundelete恢复全部误删除数据
    当须要恢复的数据较多时。一个个地指定文件或文件夹将是一个很繁重和耗时的工作,只是。extundelete考虑到了这点,此时能够通过“--restore-all”选项来恢复全部被删除的文件或文件夹。
    仍然在上面模拟的误删除数据环境下操作。如今要恢复/data文件夹下全部数据,操作步骤例如以下:


    [root@cloud1 mnt]# extundelete  /dev/sdc1 --restore-all
    Loading filesystem metadata ... 40 groups loaded.
    Loading journal descriptors ... 247 descriptors loaded.
    Searching for recoverable inodes in directory / ... 
    781 recoverable inodes found.
    Looking through the directory structure for deleted files ... 
    0 recoverable inodes still lost.
    [root@cloud1 mnt]# ls
    RECOVERED_FILES
    [root@cloud1 mnt]# cd RECOVERED_FILES/
    [root@cloud1 RECOVERED_FILES]# ls
    ganglia-3.4.0  passwd  test
    [root@cloud1 RECOVERED_FILES]# du -sh  /mnt/RECOVERED_FILES/*
    15M     /mnt/RECOVERED_FILES/ganglia-3.4.0
    4.0K    /mnt/RECOVERED_FILES/passwd
    8.0K    /mnt/RECOVERED_FILES/test
    能够看到所有数据所有完整地恢复了。


    6.4通过extundelete恢复某个时间段的数据
    有时候删除了大量的数据量,当中非常多数据都是无用的,我们仅须要恢复当中的一部分数据。此时,假设採用恢复所有数据的办法。不但耗时,并且浪费资源,在这样的情况下。就须要採用另外的一种恢复机制有选择地恢复,extundelete提供了“—after”“和”--before“參数,能够通过指定某个时间段。进而仅仅恢复这个时间段内的数据。
    以下通过一个简单演示样例。描写叙述下怎样恢复某个时间段内的数据。


    我们首先假定在/data文件夹下有个刚刚创建的压缩文件ganglia-3.4.0.tar.gz。然后删除此文件。接着卸载/data分区。開始恢复一小时内的文件,操作例如以下:


    [root@cloud1 ~]#cd /data/
    [root@cloud1 data]# cp /app/ganglia-3.4.0.tar.gz  /data
    [root@cloud1 data]# date +%s
    1379150309
    [root@cloud1 data]# rm -rf ganglia-3.4.0.tar.gz
    [root@cloud1 data]# cd /mnt
    [root@cloud1 mnt]# umount /data
    [root@cloud1 mnt]# date +%s
    1379150340
    [root@cloud1 mnt]# extundelete  --after 1379146740 --restore-all /dev/sdc1
    Only show and process deleted entries if they are deleted on or after 1379146740 and before 9223372036854775807.
    Loading filesystem metadata ... 40 groups loaded.
    Loading journal descriptors ... 247 descriptors loaded.
    Searching for recoverable inodes in directory / ... 
    779 recoverable inodes found.
    [root@cloud1 mnt]#  cd RECOVERED_FILES/
    [root@cloud1 RECOVERED_FILES]# ls
    ganglia-3.4.0.tar.gz
    能够看到。刚才删除的文件,已经成功恢复。而在/data文件夹下还有非常多被删除的文件却没有恢复,这就是”--after“參数控制的结果。由于/data文件夹下其它文件都是在一天之前删除的。而我们恢复的是一个小时之内被删除的文件,这就是没有恢复其它被删除文件的原因。
    在这个操作过程中,须要注意是“--after”參数后面跟的时间是个总秒数。起算时间为“1970-01-01 00:00:00 UTC”。通过“date +%s”命令就可以将当前时间转换为总秒数,由于恢复的是一个小时之内的数据,所以“1379146740”这个值就是通过“1379150340”减去“60*60=3600”获得的。

  • 相关阅读:
    row_number() over(partition by的用法
    java基础之--动态代理
    Java中主要有一下三种类加载器;
    HBase基本shell命令
    IntelliJ IDE 基础经验备案 四-查找快捷键
    Docker:5 扩展学习之安装mysql并且将数据挂载到本地磁盘
    Docker:4 扩展学习之修改docker容器配置
    nginx安装部署《简单版》
    Redis基础学习: 与外部交互的数据类型
    Redis基础学习: 内部数据结构
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7059177.html
Copyright © 2020-2023  润新知