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节点中的扇区指针清零,实际文件还储存在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也无力回天。所以!以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数据成功的比例。

  • 相关阅读:
    HTTP 错误 403.14
    HTTP 错误 404.3
    HTTP 500
    [转]ESCAPE()、ENCODEURI()、ENCODEURICOMPONENT()区别详解
    此计算机当前已将连接限制
    一个由表结构生成表的存储过程
    微信小程序页面跳转传参
    前端性能优化术语
    get请求和post请求的区别
    从输入url到页面呈现的过程
  • 原文地址:https://www.cnblogs.com/testway/p/6830392.html
Copyright © 2011-2022 走看看