extundelete工具恢复rm -rf 删除的目录(ext4、ext3)

extundelete工具恢复rm -rf 删除的目录(ext4)


ext3grep工具只能用于恢复ext3文件系统下删除的文件,对于ext4文件系统,可以使用extundelete工具。使用的方法类似ext3grep。 ext3grep 仅对 ext3 文件系统有效, extundelete ext3 ext4 文件系统都有效

icon_rar.gifext3grep-0.10.2.tar.gz

icon_rar.gifextundelete-0.2.4.tar.bz2




# extundelete /dev/sdb1 --inode 2

# extundelete /dev/sdb1 --restore-inode 57146

[root@rhel6lhr extundelete-0.2.4]# df -hT
Filesystem                               Type     Size  Used Avail Use% Mounted on
/dev/sda2                                ext4      48G   16G   31G  34% /
tmpfs                                    tmpfs    2.0G   80K  2.0G   1% /dev/shm
/dev/sda1                                ext4     283M   58M  210M  22% /boot
/dev/mapper/vg_orasoft-lv_orasoft_u01    ext4      49G   36G   11G  78% /u01
/dev/mapper/vg_orasoft-lv_orasoft_u02    ext4     7.3G  4.8G  2.2G  69% /u02
/dev/mapper/vg_orasoft-lv_orasoft_u03    ext4     6.8G  4.2G  2.4G  65% /u03
/dev/mapper/vg_oradata-lv_oradata_u04    ext4      40G   20G   18G  52% /u04
/dev/mapper/vg_oradata-lv_oradata_u05    ext4      40G   25G   14G  65% /u05
/dev/mapper/vg_orasoft-lv_orasoft_mysql  ext4     976M  323M  603M  35% /var/lib/mysql
/dev/mapper/vg_orasoft-lv_orasoft_u06    ext4      11G  5.5G  4.7G  54% /u06
/dev/mapper/vg_orasoft-lv_orasoft_u07    ext4      14G  8.2G  4.8G  64% /u07
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_55 ext4     2.9G  817M  2.0G  30% /usr/local/mysql55
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_56 ext4     2.9G  1.4G  1.4G  50% /usr/local/mysql56
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_57 ext4     4.8G  3.3G  1.3G  72% /usr/local/mysql57
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_80 ext4     5.8G  2.7G  2.9G  49% /usr/local/mysql80
/dev/sr0                                 iso9660  3.6G  3.6G     0 100% /media/lhr/cdrom


软件下载:  http://sourceforge.net/projects/extundelete/


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


https://blog.51cto.com/ixdba/1566856


一、 如何使用“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安装非常简单,这里不做介绍。下面是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的使用非常简单,读者可以通过“extundelete  --help”获得此软件的使用方法。 


五、 extundelete用法详解

extundelete安装完成后,就可以执行数据恢复操作了,本节详细介绍下extundelete每个参数的含义。extundelete用法如下:

extundelete --help

命令格式: 

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恢复数据的过程

在数据被误删除后,第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区,如果是系统根分区的数据遭到误删除,就需要将系统进入单用户,并且将根分区以只读模式挂载。这样做的原因很简单,因为将文件删除后,仅仅是将文件的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             Deletedpasswd                                           49153          Deletedtest                                              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]# lspasswd[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.0Loading 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]# lsRECOVERED_FILES[root@cloud1 mnt]# cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lsganglia-3.4.0

可以看到之前删除的目录ganglia-3.4.0已经成功恢复了,进入这个目录检查发现:所有文件内容和大小都正常。


6.3 通过extundelete恢复所有误删除数据

当需要恢复的数据较多时,一个个地指定文件或目录将是一个非常繁重和耗时的工作,不过,extundelete考虑到了这点,此时可以通过“--restore-all”选项来恢复所有被删除的文件或文件夹。

仍然在上面模拟的误删除数据环境下操作,现在要恢复/data目录下所有数据,操作过程如下:

[root@cloud1 mnt]# extundelete  /dev/sdc1 --restore-allLoading 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]# lsRECOVERED_FILES[root@cloud1 mnt]# cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lsganglia-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 +%s1379150309[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 +%s1379150340[root@cloud1 mnt]# extundelete  --after 1379146740 --restore-all /dev/sdc1Only 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]# lsganglia-3.4.0.tar.gz

可以看到,刚才删除的文件,已经成功恢复,而在/data目录下还有很多被删除的文件却没有恢复,这就是”--after“参数控制的结果,因为/data目录下其他文件都是在一天之前删除的,而我们恢复的是一个小时之内被删除的文件,这就是没有恢复其他被删除文件的原因。

在这个操作过程中,需要注意是“--after”参数后面跟的时间是个总秒数。起算时间为“1970-01-01 00:00:00 UTC”,通过“date +%s”命令即可将当前时间转换为总秒数,因为恢复的是一个小时之内的数据,所以“1379146740”这个值就是通过“1379150340”减去“60*60=3600”获得的。




1.在安装extundelete包./configure时遇到configure: error: C++ compiler cannot create executables问题

[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: in `/root/Desktop/extundelete-0.2.4':
configure: error: C++ compiler cannot create executables
See `config.log' for more details

经过查找知道需要安装gcc-c++包
安装gcc-c++
[root@localhost Packages]# rpm -ivh gcc-c++-4.4.7-3.el6.i686.rpm 
warning: gcc-c++-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
error: Failed dependencies:
libstdc++-devel = 4.4.7-3.el6 is needed by gcc-c++-4.4.7-3.el6.i686
有依赖关系先装 libstdc++-devel-4.4.7-3.el6.i686.rpm
[root@localhost Packages]# rpm -ivh libstdc++-devel-4.4.7-3.el6.i686.rpm
warning: libstdc++-devel-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:libstdc++-devel        ########################################### [100%]
再安装 gcc-c++-4.4.7-3.el6.i686.rpm 
[root@localhost Packages]# rpm -ivh gcc-c++-4.4.7-3.el6.i686.rpm 
warning: gcc-c++-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:gcc-c++                ########################################### [100%]
[root@localhost Packages]# rpm -qa | grep gcc-c++
gcc-c++-4.4.7-3.el6.i686

2.重新./configure显示
[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library

经过查找知道缺少 e2fsprogs-devel,下面开始安装

[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-14.el6.i686.rpm 
warning: e2fsprogs-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
error: Failed dependencies:
libcom_err-devel  = 1.41.12-14.el6 is needed by e2fsprogs-devel-1.41.12-14.el6.i686
pkgconfig(com_err) is needed by e2fsprogs-devel-1.41.12-14.el6.i686

有依赖的包,所以先安装依赖包

[root@localhost Packages]# ll | grep libcom_err-devel
-r--r--r--  49 root root    31984 12月 19 2012 libcom_err-devel-1.41.12-14.el6.i686.rpm

[root@localhost Packages]# rpm -ivh libcom_err-devel-1.41.12-14.el6.i686.rpm 
warning: libcom_err-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:libcom_err-devel       ########################################### [100%]
解决了依赖关系,在安装 e2fsprogs-devel
[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-14.el6.i686.rpm 
warning: e2fsprogs-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:e2fsprogs-devel        ########################################### [100%]

3。再./configure出现,表示成功了;

[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
Writing generated files to disk

4.进行make & make install
[root@localhost extundelete-0.2.4]# make
make -s all-recursive
Making all in src
extundelete.cc:571: 警告:未使用的参数‘flags’

[root@localhost extundelete-0.2.4]# make install
Making install in src
  /usr/bin/install -c extundelete '/usr/local/bin'



https://www.cnblogs.com/patf/p/3368765.html


首先。Linux下很多人都喜欢用rm -rf去删除目录。但是rm --help提示这是一个非常危险的命令、谨慎用之。

这里公司一台服务器。同事在操作的过程中误删掉一个目录。而且是非常重要的。

尝试恢复cat /etc/redhat-release 查看为rhel4版本。很老了这就有一个问题出现yum无法用。

先用一个ext3grep 工具恢复。但是该工具--help 提示没有针对目录恢复的参数 只有一个all 我尝试用时间戳恢复当时时间段的数据效果不理想、

而且跟要命的是当我查看分区的时候df -aT发现这个删除的目录进入奇迹般的划分在了与/一个分区。0 0这意味着我挂载为只读分区时要杀掉一

切与/根分区有关的进程;所有反复思索后决定一个好的办法:

USB移动硬盘安装一个便携Linux系统,并在其上面安装extundelete工具因为这个工具需要几个包的支持。而rhel4的系统现在yum已经无法使用

安装支持包都很困难。索性放弃。

关于USB移动硬盘系统。与我们用的stat 硬盘安装系统一样。可以用光盘镜像安装选择USB设备为安装设备。或者用虚拟机安装都可以。这里我就

不多说推荐虚拟机 Virtual Box和 VMware(优点是你有镜像但无法刻盘)。

好了进入centOS6.4后

下载extundelete:wget http://pkgs.fedoraproject.org/repo/pkgs/extundelete/extundelete-0.2.4.tar.bz2/77e626ad31433680c0a222069295d2ca/extundelete-0.2.4.tar.bz2

 

1 [root@vbok src]# wget http://pkgs.fedoraproject.org/repo/pkgs/extundelete/extundelete-0.2.4.tar.bz2/77e626ad31433680c0a222069295d2ca/extundelete-0.2.4.tar.bz2
1 [root@vbok src]# tar jxvf extundelete-0.2.4.tar.bz2

直接./configure make make install 但我运行./configure时报错:

1 [root@vbok src]# cd extundelete-0.2.42 [root@vbok extundelete-0.2.4]# ./configure 
3 Configuring extundelete 0.2.44 configure: error: Can't find ext2fs library

提示 ext2fs library 少几个包的支持

1 [root@vbok extundelete-0.2.4]# yum -y install ext2fs

OK 在运行make三部曲

[root@vbok extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4Writing generated files to disk

当然如果你make完后就可以使用这个工具的

1 [root@vbok extundelete-0.2.4]# make2 make -s all-recursive3 Making all in src4 extundelete.cc:571: 警告:未使用的参数‘flags’

直接在~/src/extundelete --help

[root@vbok extundelete-0.2.4]# src/extundelete --help

或者在运行 make install 这时会安装到/usr/local/bin/extundelete 下

我还是推荐make完就成了。因为假如你要恢复的目录正好是/usr 那你就还需要在./configure下加参数。浪费时间效果一样

OK来演示下恢复吧

 1 [root@vbok /]# df -h 2 文件系统              容量  已用  可用 已用%% 挂载点 3 /dev/mapper/vg_vbok-gen 4                        25G  541M   23G   3% / 5 tmpfs                 943M  232K  943M   1% /dev/shm 6 /dev/sdb1             485M   36M  424M   8% /boot 7 /dev/mapper/vg_vbok-home 8                        20G  172M   19G   1% /home 9 /dev/mapper/vg_vbok-opt10                        11G  156M  9.9G   2% /opt11 /dev/mapper/vg_vbok-usr12                        39G  3.2G   34G   9% /usr13 /dev/sdb3              51G   16K   51G   1% /vfat

我在/opt下创建了个目录 “1“ 下面有多个子目录和文件。然后我将其删除。

(看看现在的时间)并回到extundelete 安装目录下将opt目录挂载为只读为了保护数据防止重写。

 1 root@vbok /]# cd opt/ 2 [root@vbok opt]# ls 3 1  lost+found  rh 4 [root@vbok opt]# date 5 2013年 10月 14日 星期一 16:44:55 CST 6 [root@vbok opt]# rm -rf 1 7 [root@vbok opt]# ls 8 lost+found  rh 9 [root@vbok opt]# cd /usr/local/src/extundelete-0.2.410 [root@vbok extundelete-0.2.4]# mount -o remount,ro /dev/mapper/vg_vbok-opt

这里说下我要用到的参数 src/extundelete --help

1 --restore-directory 'path'2                          Will restore directory 'path'. 'path' is relative to the3 --restore-all          Attempts to restore everything.4  --after dtime          Only process entries deleted on or after 'dtime'.5   --before dtime         Only process entries deleted before 'dtime'.

第一个是 恢复目录 path为路径后面跟要恢复那个目录的路径

第二个是 恢复所有

第三个是 恢复dtime这个时间戳以后删除的文件 

第四个是恢复这个时间戳以前删除的文件  (这里说下,卡时间恢复是非常好用的参数。你可以指定恢复那个时间到那个时间之间的数据)

基本这几个选项就够恢复了,当然还有--restore-files 参数来恢复单个文件。

OK开始

我上面在删除的时间date了下系统时间所以我就来生成下 删除前和删除后的时间戳用来定位我要恢复的目录,然后利用工具恢复删除的目录

[root@vbok extundelete-0.2.4]# date -d "2013-10-14 16:43" +%s1381740180[root@vbok extundelete-0.2.4]# date -d "2013-10-14 16:58" +%s  
1381741080[root@vbok extundelete-0.2.4]# src/extundelete /dev/mapper/vg_vbok-opt --after /1381740180 --before 1381741080 --restore-directory 1

OK恢复完成,这里要注意的是在用恢复目录选项的时候,后面接的目录是以opt后的目录。也就是说 /dev/mapper/vg-vbox-opt 已经代表了/opt这个目录我们只需要接着写 opt后面的目录 例如要恢复/opt/1/2/3 这个目录 我们后面的路径为 1/2/3 就可以恢复3这个目录了 当然有时间戳指定时间段后就可以用--restore-all恢复这个时间段删除的所有数据了。OK

 1 NOTICE: Extended attributes are not restored. 2 Loading filesystem metadata ... 86 groups loaded. 3 Loading journal descriptors ... 91 descriptors loaded. 4 Searching for recoverable inodes in directory 1 ... 
 5 9 recoverable inodes found. 6 Looking through the directory structure for deleted files ... 
 7 1 recoverable inodes still lost. 8 [root@vbok extundelete-0.2.4]# cd RECOVERED_FILES/ 9 [root@vbok RECOVERED_FILES]# LS10 -bash: LS: command not found11 [root@vbok RECOVERED_FILES]# ls12 113 [root@vbok RECOVERED_FILES]# cd 114 [root@vbok 1]# ls15 11  2216 [root@vbok 1]# cd 11/17 [root@vbok 11]# ls18 2  a19 [root@vbok 11]# cd ../22/c 
20 -bash: cd: ../22/c: 不是目录21 [root@vbok 11]# cd ../22/c

数据 完好无损。

在讲/opt这个分区挂载回读写的,不会的可以reboot重启下也可以

 

一、 将磁盘分区挂载为只读

这一步很重要,并且 在误删除文件后应尽快将磁盘挂载为只读。越早进行,恢复的成功机率就越大。

 

1.  查看被删除文件位于哪个分区

[root @localhost   ~] #  mount
/dev /mapper /VolGroup -lv_root on  / type ext4(rw)
/dev /mapper /VolGroup -lv_home on  /home type ext4(rw)

2.  尝试将对应目录重新挂载为只读

[root @localhost   ~] #    mount -r -n -o remount /home
mount :  /home is busy

 

3.  如果显示 xxx is busy

[root @localhost   ~ ] fuser -v -m /data

找出相关进程,kill.

 

4.  成功将目录挂载为只读

[root @localhost   ~ ]  #   mount -r -n -o remount /home

此时在/home目录 touch 文件时,会报错:

[root @localhost   ~ ]  touch txt
touch : cannot touch  `txt’ : Read -only file system

 

二、 使用数据恢复工具 extundelete

之前尝试了debugfs + dd,未果。

后来安装 extundelete-0.2.4 ,:

1.  下载

(1) 因为sourceforge被墙,服务器上直接wget不成功,所以只能在本地翻 墙下载,链接如下:

       http://superb-dca2.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 

(2) 把下载的文件放到服务器

      启动本地的nginx,然后在服务器上wget(当然通过其它方法也可以,只要能传到服务器):

wget http ://本机IP /extundelete -0. 2. 4.tar.bz2  

(3) 解压

tar jxf extundelete  -  0 .  2 .  4 .tar.bz2

 

2.  编译

(1) configure

[root @localhost  extundelete -0. 2. 4] ./configure

configure时报错,看了下config.log,确定是本机没编译环境 。

yum -y install gcc+ gcc-c++

等待,有一点慢。

安装完成后,再次config,依然报错

Configuring extundelete  0. 2. 4
configure : error : Can’t find ext2fs library

这是因为extundelete依赖e2fsprogs。

安装e2fsprogs后再次configure,成功。

[root @localhost  extundelete -0. 2. 4] yum install e2fsprogs-devel
[root @localhost  extundelete -0. 2. 4] # ./configure
Configuring extundelete  0. 2. 4
Writing generated files to disk

 

(2) make & make install

[root @localhost  extundelete -0. 2. 4] #make & make install

 如果没有异常信息,基本说明安装成功.

 

(3) 可以到src目录验证下.

[root @localhost  extundelete -0. 2. 4] # cd src
[root @localhost  src] ./extundelete
No action specified; implying  --superblock.
. /extundelete : Missing device name.
Usage : . /extundelete [options] [ --] device -file
.............

 

[root @localhost  src]#  ./extundelete -v

extundelete version 0.2.4

libext2fs version 1.41.12

Processor is little endian.

如上信息,证明安装成功。

下面才真正开始数据恢复。

 

三、 挂载新硬盘

(如果原服务器磁盘空间够大,可以跳过这一步。)

因为被误删的数据很大(约200G),原服务器所在的物理机上也没有磁盘空间了。因些需要到远程挂载另一台服务器B上的磁盘,B是xen虚出的机器,空间也不够,但所在的物理机上还有磁盘空间,这时需要从宿主机上分空间给B。

1  在xen上挂载一块磁盘给B

因为是图形操作,就不再细说。只需分配足够大的空间就可以了,我当时选的是300G。

2  登录服务器B, 准备挂载新磁盘。

(1) 查看新磁盘是否已挂载

[nmen @dev  -ubuntu -server]  ls  /dev /sd *
/dev /sda   /dev /sda1   /dev /sda2   /dev /sda5   /dev /sda6   /dev /sda7   /dev /sda8   /dev/sdb

/dev/sdb确实已挂载。

此时新盘是未分区,也未格式化,因此需要先进行这两件事。

 

(2)  分区

下图是hdb的硬盘,sdb的盘也一样的操作。


(本图来自: http://www.shyw.net/bbs/yxt443333-1-1.html)

 

(3)  格式化

[nmen @dev  -ubuntu -server] :~sudo mkfs -t ext3 /dev/sdb1
mke2fs  1. 41. 11 ( 14-Mar -2010)
Filesystem label =
OS type : Linux
Block size =4096 (log =2)
Fragment size =4096 (log =2)
Stride =0 blocks, Stripe width =0 blocks
22937600 inodes,  91749215 blocks
4587460 blocks ( 5.00 %) reserved  for the super user
First data block =0
Maximum filesystem blocks =4294967296
2800 block groups
32768 blocks per group,  32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks :
     327689830416384022937629491281920088473616056322654208,
     409600079626241123942420480000238878727166361678675968
 
Writing inode tables :  done                           
Creating journal ( 32768 blocks) :  done
Writing superblocks  and filesystem accounting information :  done
 
This filesystem will be automatically checked every  33 mounts  or
180 days, whichever comes first.  Use tune2fs  -or  -i to override.

显示以上信息说明已成功格式化。

 

(4)  设置卷标

sudo  e2label  /dev /sdb1  /restore

 

(5)  挂载

[nmen @dev  -ubuntu -server] :~$ mkdir  /restore
[nmen @dev   - ubuntu  - server]  :  ~ $  mount  -vl  -t ext3  /dev /sdb1  /restore

至此服务器B上挂载新硬盘结束,现在有足够空间来做存放要恢复的数据了。

 

四、通过NFS远程挂载

通过网络, 将远程主机B共享的文件系统,挂载到需要做数据恢复的机器A。

1. 服务器B上安装NFS

(1) 安装

B是ubuntu系统,默认没安装nfs.

#  sudo apt-get install nfs-kernel-server

 

(2) 配置

修改/etc/exports , 添加如下语句。


# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/restore *(rw,sync,no_root_squash,no_subtree_check)

其中 :

   /restore                                                                  -- 需要与客户机共享的目录;

     *                                                                            -- 表示任何主机均可访问本目录,也可指定IP;

   (w,sync,no_root_squash,no_subtree_check)      -- 配置客户机的权限;

因为是临时使用,并且是服务器位于内网,所以设置相对随意。

 

(3) 使配置生效

#  exportfs –rv

#  /etc/init.d/nfs-kernel-server restart

 

(4) 验证是否配置成功

显示NFS服务器输出目录列表:

nmen @dev  -ubuntu -server :  showmount -e
Export list  for chinahrd -ubuntu -dev :
/restore  *

 

(5) 防火墙

因为时间紧急,并且是内网,所以临时关闭了B上的防火墙:

sudo  ufw  disable

可通过以下命令启用防火墙:

sudo ufw enable

2.  服务器A上挂载远程目录

将/restore目录从服务器 B 挂载到 /mnt 上。

mount  -t nfs [B的IP] :/restore   /mnt

命令详解如下:

# mount -t nfs [-o mount-options] server:/directory /mount-point
 
-o mount -options
     指定可以用来挂载 NFS 文件系统的挂载选项。
server :/directory
     指定包含共享资源的服务器主机名,以及要挂载的文件或目录的路径。
/mount -point
     指定要挂载文件系统的目录。

 

五、数据恢复

1.   得到删除的大概时间

这一步不是必须,但这个有助于更快的回复想要的数据。

date  -"Fri Apr 15:40:00 2014"  +%s
1397202000

1397202000这个时间值,我们后期会用到。

2.  查看被删除文件

# extundelete /dev/sdb1 --inode 2

File name                                       | Inode number | Deleted status

.                                                 9

..                                                11

lost+found                                        24             Deleted

data                                              82             Deleted

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

状态为deleted的是被删除的文件。

3.  数据恢复

进入刚mount的远程目录/restore;

指定--after "1397202000", 表示恢复这个时间点之后的文件;

文件默认会被恢复到当前目录下的RECOVERED_FILES目录中。

cd  /restore
[root @localhost  restore]#[extundelete的安装路径] ./extundelete --restore-all --after  "1397202000" /dev /mapper /VolGroup -lv_home

Only show and process deleted entries if they are deleted on or after 1397202000 and before 9223372036854775807.

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 6924 groups loaded.

Loading journal descriptors ... 27149 descriptors loaded.

Searching for recoverable inodes in directory / ...

696 recoverable inodes found.

Looking through the directory structure for deleted files ...

Unable to restore inode 27394319 (VMware/9.50_ps/9.55locate.vmx.lck): Space has been reallocated.

Unable to restore inode 27402241 (VMware/9.35win7/9.35win7.vmx.lck): Space has been reallocated.

Unable to restore inode 27396032 (VMware/9.35win7/9.35win7-Snapshot1.vmsn): No undeleted copies found in the journal.

Unable to restore inode 27394051 (VMware/9.36win2008/9.36win2008R2.vmx.lck/E00633.lck): Space has been reallocated.

Unable to restore inode 27394603 (lost+found/E09292.lck): Space has been reallocated.

8 recoverable inodes still lost.

 

一般来说,要等很久。。。

cd restore /RECOVERED_FILES$
ls
110_open_dns   111_open_dns_node1   112_DNS_node2   116_svn

删除的文件回来了,至此松一口气。

六、收尾工作

(1) 重新挂载A上的磁盘为可读写:

[root @localhost  src] # mount -o remount, rw /home/

卸载服务器B上的目录。

 

(2) 开启B的防火墙。

sudo ufw enable

 

(3) 在A上对rm命令启用别名,防止沉默式删除。

vi  /etc /bashrc

source /etc/bashrc

 

# do not delete / or prompt if deleting more than 3 files at a time #
alias  rm = 'rm -I --preserve-root'  
 
# confirmation #
alias  mv = 'mv -i'
alias  cp = 'cp -i' alias ln = 'ln -i'  
 
# Parenting changing perms on / #
alias chown = 'chown --preserve-root'
alias chmod = 'chmod --preserve-root'
alias chgrp = 'chgrp --preserve-root'

(4) 在B上使用Rsync,定期备份A上数据。

参考: http://abloz.com/2013/09/12/linux-rm-rf-file-recovery-record.html






About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2019-08-01 06:00 ~ 2019-08-31 24:00 在西安完成

● 最新修改时间:2019-08-01 06:00 ~ 2019-08-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店: https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班: http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页: https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2655565/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26736162/viewspace-2655565/

你可能感兴趣的:(extundelete工具恢复rm -rf 删除的目录(ext4、ext3))