zoukankan      html  css  js  c++  java
  • linux extundelete 删除文件恢复

    • extundelete是基于Linux的一个数据恢复工具,它通过分析文件系统的日志,解析出所有文件的inode信息,从而可以恢复Linux下主流的ext3,ext4文件系统下被误删除的文件。
    • [问题案例]最近看到群里提到如何恢复LINUX下ext4误删的文件,之前听说过ext3分区恢复工具ext3grep,但是恢复ext4一直没有概念,而且目前线上的系统分区格式都是ext4,SO网上找到了一款叫extundelete的文件恢复工具,该工具最给力的一点就是支持ext3/ext4双格式分区恢复,对我们运维攻城狮算是一款神器级别的软件,这里整理了如下文档,供大家参考。
    • 在安装extundelete之前需要安装e2fsprogs,e2fsprogs-libs,e2fsprogs-devel。

      这里用:yum install e2fsprogs e2fsprogs-libs e2fsprogs-devel 来完成安装。

      注意事项

      • 恢复文件的时候一定要卸载磁盘分区
    • 虚拟机:        vmware workstation 9.0.2

      操作系统:      CentOS6.3 x64

      extundelete:   extundelete-0.2.4

      一.试验环境

      1.首先关闭SELINUX

      # setenforce 0

      # vi /etc/sysconfig/selinux

      ---------------

      SELINUX=disabled

      ---------------

      2.在虚拟机上创建一个2G的磁盘

      3.进入系统,创建一个2G的主分区

      # fdisk /dev/sdb

      ---------------------

      n+p+1+回车+回车+w

      ---------------------

      4.使分区无需重启就能生效

      # partx -a /dev/sdb

      5.格式化为ext4分区并挂载

      # mkfs.ext4 /dev/sdb1

      # mkdir /data

      # mount /dev/sdb1 /data

      注: 在实际线上恢复过程中,切勿将extundelete安装到你误删的文件所在硬盘,这样会有一定几率将需要恢复的数据彻底覆盖。

      建议加装一块硬盘将extundelete安装到此硬盘,再做以下操作。

      二.extundelete安装

      1.安装依赖包

      # yum install e2fsprogs* -y

      2.下载并安装extundelete

      # wget http://nchc.dl.sourceforge.NET/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

      # tar -jxvf extundelete-0.2.4.tar.bz2

      # cd extundelete-0.2.4

      # ./configure --prefix=/usr/local/extundelete

      # make && make install

      3.验证是否安装成功

      # cd /usr/local/extundelete/bin

      # ./extundelete -v

      ---------------------

      extundelete version 0.2.4

      libext2fs version 1.41.12

      Processor is little endian.

      ---------------------

      4.设置环境变量

      # echo "PATH=/usr/local/extundelete/bin:$PATH" >> /etc/profile

      # echo "export PATH" >> /etc/profile

      # source /etc/profile

      5.上传一些图片,安装包等文件到/data目录

      # cd /data

      # yum install lrzsz -y

      # rz

      -------------

      本地文件.....

      -------------

      # ls

      ------------------

      lost+found  MySQL-5.6.10.tar.gz  nginx.conf  pic.jpg

      ------------------

      6.全部删除

      # rm -rf *

      7.查看被删除文件

      1).查看前需卸载该磁盘分区

      # cd ~

      # umount /dev/sdb1

      2).查看文件

      注:一般一个分区挂载到一个目录下时,这个”根”目录的inode值为2

      我们为了查看根目录所有文件,所以查看分区inode为2的这个部分

      # extundelete /dev/sdb1 --inode 2

      --------------------------------

      .....

      File name                                       | Inode number | Deleted status

      .                                                 2

      ..                                                2

      lost+found                                        11             Deleted

      mysql-5.6.10.tar.gz                               12             Deleted

      nginx.conf                                        13             Deleted

      pic.jpg                                           14             Deleted

      --------------------------------

      注:标记为”Deleted”的文件则是被删除的文件

      8.恢复指定的文件

      注: 默认被删文件会恢复到当前目录下的RECOVERED_FILES目录中去

      # extundelete --restore-file pic.jpg /dev/sdb1  

      # cd RECOVERED_FILES/

      # ll

      ----------------

      -rw-r--r-- 1 root root 52592 8月  13 07:18 pic.jpg

      ----------------

      9.完全恢复设备上文件

      # extundelete --restore-all /dev/sdb1

      # ll

      -----------------------------------

      总用量 34464

      -rw-r--r-- 1 root root 35174149 8月  13 07:24 mysql-5.6.10.tar.gz

      -rw-r--r-- 1 root root     4551 8月  13 07:24 nginx.conf

      -rw-r--r-- 1 root root    52592 8月  13 07:18 pic.jpg

      -rw-r--r-- 1 root root    52592 8月  13 07:24 pic.jpg.v1

      -----------------------------------

      注:这里完全恢复并不会把之前恢复的pic.jpg文件覆盖掉,而是重命名为pic.jpg.v1

      10.恢复指定的时间点后被删文件

      1).指定一个时间点

      # date -d "Sep 4 03:09:13 2013" +%s

      ------------------

      1378235353

      ------------------

      2).恢复这个时间点后的文件

      # extundelete --restore-all --after “1378235353” /dev/sdb1

      --------------------

      ..........

      --------------------

      注:如果要恢之前的就用before参数。extundelete命令与after结合使用,在进行恢复时非常有用,可以过滤掉那太旧的文件,减小恢复压力。

      11.检验是否恢复成功

      # md5sum RECOVERED_FILES/mysql-5.6.10.tar.gz

      ------------------------------------

      9dcee911fb4bc7e977a6b63f4d3ffa63  RECOVERED_FILES/mysql-5.6.10.tar.gz

      ------------------------------------

      上传刚才误删的mysql安装包

      # rz

      ...

      # md5sum mysql-5.6.10.tar.gz

      ---------------------------------

      9dcee911fb4bc7e977a6b63f4d3ffa63  mysql-5.6.10.tar.gz

      ---------------------------------

      MD5值相同,恢复成功。。。

      -----------大功告成-------------

      extundelete反删除总结

      一、介绍extundelete

               1.extundelete的文件恢复工具,该工具最给力的一点就是支持ext3/ext4双格式分区恢复。

               2. 在实际线上恢复过程中,切勿将extundelete安装到你误删的文件所在硬盘,这样会有一定几率将需要恢复的数据彻底覆盖。

               3. extundelete还是有很大的不完整性,基于整个磁盘的恢复功能较为强大,基于目录和文件的恢复还不够强大。

               4. extundelete执行完毕后在当前目录生产一个RECOVERED_FILES目录,里面即是恢复出来的文件,还包括文件夹。

               5.任何的文件恢复工具,在使用前,均要将要恢复的分区卸载或挂载为只读,防止数据被覆盖使用。

                         umount /dev/partition 

                         mount -o remount,ro /dev/partition

               6.保持良好的习惯,绝对比恢复数据要更简单。

      二、安装

               0.yum install e2fsprogs* e2fslibs* -y

               1.wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2

               2.tar -axf extundelete-0.2.4.tar.bz2 -C /usr/local/src

               3.cd /usr/local/src/extundelete-0.2.4

               4../configure --prefix=/usr/local/extundelete

               5.make

         6.make install

               7.ln -s /usr/local/extundelete/bin/* /usr/local/bin/

      三、使用及命令

          1. umount或者read only 分区

                         umount /dev/partition 

                         mount -o remount,ro /dev/partition

          2.切换到存储恢复文件的目录

                         cd $dir

              

          3.命令

      Usage: extundelete [options] [--] device-file

      Options:

        --superblock           打印指定分区的超级块信息。如不加任何的参数,

      此选项是默认的.     

      extundelete --superblock /dev/sda3 <---> extundelete /dev/sda1

                             

        --journal              显示块的日志信息,同--superblock。

      extundelete --journal /dev/sda1

        --after dtime          只恢复指定时间【dtime】(时间戳)之后,被删除的数据

      假如删除的时间大概是2011-7-26 14:30

      date -d "Jul 26 14:30" +%s

      得出秒数 1234567890

      恢复此时间后删除的所有文件

      extundelete /dev/sdb1 --after 1234567890 --restore-all

        --before dtime         只恢复指定时间【dtime】(时间戳)之前,被删除的数据

      Actions:

        --inode ino                显示某分区inode为x的信息,一般是查看该分区下所有的文件.

      extundelete --inode 2 /dev/sda1

        --block blk              显示某分区block为x的信息.

        --restore-inode ino[,ino,...] 恢复一个或多个指定inode号的文件,该恢复的文件,

      保存在当前目录下的RECOVERED_FILES里,文件名为【file.$inode】

      extundelete /dev/sda1 --restore-inode 13,14

        --restore-file 'filename'        恢复指定的文件(被删除的),文件位于当前目录下

      的RECOVERED_FILES/$filename,文件名还是原来的              

      extundelete /dev/sda1 --restore-file initramfs-2.6.32-358.el6.x86_64.img

        --restore-files 'read_filename'  恢复指定的文件(真实存在的)中的内容,

      文件位于当前目录下的RECOVERED_FILES/$filename,文件名还是原来的

                                                              vi test_restore.txt(结尾不可有多余的空格)

                                                                       System.map-2.6.32-358.el6.x86_64

                                                                       config-2.6.32-358.el6.x86_64

                                                                       symvers-2.6.32-358.el6.x86_64.gz

                                                                       vmlinuz-2.6.32-358.el6.x86_64

                                                                       initramfs-2.6.32-358.el6.x86_64.img

               extundelete /dev/sda1  --restore-files test_restore.txt

        --restore-directory 'dir-name'      恢复指定的目录,文件位于当前目录下的

      RECOVERED_FILES/$dir-name,文件名还是原来的

                                                                        extundelete /dev/sda1  --restore-files grub

        --restore-all                          恢复某分区里所有被删除的数据,文件名还是原来的

                                                                       extundelete /dev/sda1   --restore-all

         4.例

          ①--superblock

            ②--journal

            ③--after dtime

      假如删除的时间大概是2011-7-26 14:30

      date -d "Jul 26 14:30" +%s

      得出秒数 1234567890

      恢复此时间后删除的所有文件

      /usr/local/bin/extundelete /dev/sdb1 --after 1234567890 --restore-all

          ④--before dtime

            ⑤--inode

            ⑥--restore-inode ino[,ino,...]

            ⑦--restore-file 'filename'

          ⑧--restore-files 'read_filename'

            ⑨--restore-directory 'dir-name'

            ⑩--restore-all

      恢复单个目录:

      extundelete  /dev/sdb1 --restore-directory  /MongoDB

      恢复所有误删文件:

      extundelete  /dev/sdb1 --restore-all

      extundelete还可以实现恢复某个时间段的数据。可以通过“--after”和“--before”参数实现!

      【原理】extundelete恢复数据的过程:

      在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原因很简单,因为将文件删除后,仅仅是将文件的inode节点中的扇区指针清零,实际文件还储存在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也无力回天。所以!以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数据成功的比例。

  • 相关阅读:
    查看端口有没有被占用
    微信公众号2()
    How to insert a segment of noise to music file
    puppet practice
    Docker Commands
    LempelZiv algorithm realization
    The algorithm of entropy realization
    Java network programmingguessing game
    Deploy Openstack with RDO and Change VNC console to Spice
    puppet overview
  • 原文地址:https://www.cnblogs.com/testway/p/6830392.html
Copyright © 2011-2022 走看看