Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1161428
  • 博文数量: 220
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1769
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-13 16:19
个人简介

努力, 努力, 再努力

文章分类

全部博文(220)

文章存档

2018年(8)

2017年(46)

2016年(75)

2015年(92)

我的朋友

分类: 系统运维

2016-10-11 16:15:17


参考文章:

. 环境说明

         1. 系统版本:2.6.32-431.el6.x86_64

       2. 软件版本:extundelete-0.2.4.tar.bz2

 

. 文档说明:

       Linux环境不像windows有回收站,删除了还可以找回。在linux环境下rm –rf 文件,目录或者* , 一旦删除,难以恢复,必须使用专用的文件恢复软件—extundelete.

       本文仅讨论非根分区的文件被误删除后,如何恢复。

       对于/ 分区,情况比较复杂,在此先不讨论

. 软件原理—extundelete

      1. 原理:

首先extundelete会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。

2. 查看根目录的inode

[root@vpntest ~]#  ls -id /

2 /                                            这里的2表示根目录的inode=2

 

[root@vpntest ~]#  ls -id /data

2 /data                                     这里2表示:/data是一个独立分区的根目录

. 软件下载及安装

      1. 安装依赖包

              yum install –y e2fsprogs-*

      2. 软件下载:

                wget

      3. 软件安装

         tar jxvf extundelete-0.2.0.tar.bz2

         cd extundelete-0.2.0

         ./configure

         make

         make install

. 操作实践

0. 重点实践结论

         结论1:被删除文件的独立分区经过格式化后,无法再通过extundelete恢复

         结论2:  重新启动系统,挂载被删除文件的独立分区,卸载分区后可通过

extundelete恢复,无影响

         结论3 extundelete不能恢复空文件,空目录,包含空文件的目录

对于像python项目里有__init__.py文件,但又无内容的空文件无法恢复,恢                   复出来的程序目录可能无法运行

         结论4 被删除文件的独立分区没有卸载,而且touch 文件,即使文件为空,

仍然造成所有数据丢失

         结论5 被删除文件的独立分区没有卸载,执行vim a,即使没有保存,没有写盘,

仍然造成所有数据丢失

         结论6:  如果分区已经被划为LVM,操作对像应该是逻辑卷,而不是分区块

 

      1. 演示环境描述:

          卷分区:/dev/mapper/VolGro_data-lv_data  对应的挂载目录:/data

          删除测试的目录结构:

                  /data--->html5----> html5_code 包括若干目录和全部非空文件

                        |---------> gitroot 这是flask项目,包括__init__.py 空文件

 

         恢复文件的命令:extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5

         注意:html5位于独立分区/data之下,可以写成绝对路径/html5

                    也可写成相对路径 html5

                  如果仅恢复html5_code子目录,相对路径可写成  

         extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5/html5_code

2. 查看已经删除文件和目录

         extundelete /dev/mapper/VolGro_data-lv_data --inode 2

         注意: 2/data 独立分区的索引号

3. 恢复目录(恢复操作实践)

       实践0 独立分区格式化后mkfs.ext4 /dev/mapper/VolGro_data-lv_data

由于inode重新创建,造成数据无法恢复

 

       实践1:独立分区(非根分区),卸载分区恢复,成功率99%

                      这是最正确的操作方法

 

              (0) 删除 /data/html5之下的html5_codegitroot

              (1) cd ~        #跳到家目录,避免在/data目录里执行卸载分区

(2) 执行 umount /data  卸载分区

(3) 执行恢复目录命令:

extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5

              (4) 在当前目录里会出现恢复目录:RECOVERED_FILES

      

              恢复结果:用tree 计数

删除前数据数量:373 directories, 3672 files

恢复后数据数量: 371 directories, 3638 files

(空文件,空目录不被恢复)

 

       实践2:独立分区(非根分区),删除文件目录,系统重启, 卸载分区后恢复

                      实践2 想说明:对于独立分区的文件恢复,系统重启是不影响恢

                                                 复过程和效果的。但避免意外,还是不要重启

 

              (0) 删除 /data/html5之下的html5_codegitroot

              (1) reboot 重启系统

              (2) cd ~        #跳到家目录,避免在/data目录里执行卸载分区

(3) 执行 umount /data  卸载分区

(4) 执行恢复目录命令:

extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5

              (5) 在当前目录里会出现恢复目录:RECOVERED_FILES

      

              恢复结果:

删除前数据数量:373 directories, 3672 files

恢复后数据数量: 371 directories, 3638 files

(空文件,空目录不被恢复)

 

实践3独立分区(非根分区),挂载分区恢复,不重启系统恢复

                     实践3想说明:

理论上只要不往独立分区上写数据,就不会破坏分区

                            上的数据,应该可以全部恢复,但实际上风险还是有的,而且风

                            险不可控,所以,应尽可能卸载分区,再进行文件恢复

 

执行命令extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5

会出现如下警告提示:

NOTICE: Extended attributes are not restored.

WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set.

The partition should be unmounted to undelete any files without further data loss.

If the partition is not currently mounted, this message indicates

it was improperly unmounted, and you should run fsck before continuing.

If you decide to continue, extundelete may overwrite some of the deleted

files and make recovering those files impossible.  You should unmount the

file system and check it with fsck before using extundelete.

Would you like to continue? (y/n)

大致意思:恢复数据之前,要卸载分区,如果已经卸载分区仍然出现上述提示,应该使用fsck命令检查分区,再恢复数据。否则如果你直接使用extundelete恢复,可能造成部分数据无法恢复。

 

              (0) 删除 /data/html5之下的html5_codegitroot

              (1) cd ~        #跳到家目录,避免/data分区目录处于打开状态

(2) 执行恢复目录命令:

extundelete /dev/mapper/VolGro_data-lv_data --restore-directory html5

              (3) 在当前目录里会出现恢复目录:RECOVERED_FILES

             

              恢复结果:丢失文件一个

              删除前数据数量:373 directories, 3672 files

                     恢复后数据数量:371 directories, 3637 files

                    

 

       实践4: 独立分区(非根分区),挂载状态, 另一终端登录并打开/data的情况

                     fuser验证:

                     [root@vpntest ~]# fuser -muv /data

                     用户     进程号 权限   命令

                     /data:               root       3051 ..c.. (root)bash

      

                     实践4说明:这种情况有终端登录并进入到/data 的情况,也不会

                                   造成文件无法恢复

                    

                     恢复结果:

              删除前数据数量:373 directories, 3672 files

       恢复后数据数量:371 directories, 3637 files

                     371 directories, 3558 files

 

 

         实践5: 独立分区(非根分区),挂载状态, /data分区下执行

                     vim打开文件但没有保存的情况下恢复数据

                         

                          实践5 说明:

vim 新文件,处于打开状态,并未保存数据到/data, 理论上应该不会破坏分区数据,但实际上这个操作的后果是灾难性的,分区上部分所有误删除数据都无法恢复了。

 

恢复命令的输出(部分)

2338 recoverable inodes found.

Looking through the directory structure for deleted files ...

2051 recoverable inodes still lost.

 

                            恢复结果:

                     删除前数据数量:373 directories, 3672 files

              恢复后数据数量:41 directories, 245 files

 

 

        

       实践6: 独立分区(非根分区),挂载状态, /data分区下执行

                     vim打开文件写入100个字符并保存的情况下恢复数据

                    

             

              恢复结果:

              删除前数据数量:373 directories, 3672 files

                     卸载/data恢复的数据: 371 directories, 3542 files

                     恢复后数据数量:36 directories, 219 files

                          丢失了绝大部分文件

4. 恢复单个文件

       (1) [root@vpntest data]# rm -f test11

       (2) [root@vpntest data]# cd; umount /data  退到家目录,卸载分区

       (3) 查看被删除的文件:

              extundelete /dev/mapper/VolGro_data-lv_data --inode 2

File name                                 | Inode number | Deleted status

.                                           2

..                                           2

lost+found                                   11

html5                                       262145

.test11.swp                                  12             Deleted

test11                                       13             Deleted

 

       (4)恢复文件:

       [root@vpntest undel7]# extundelete /dev/mapper/VolGro_data-lv_data --restore-file test11

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 120 groups loaded.

Loading journal descriptors ... 1354 descriptors loaded.

Successfully restored file test11

 

 (5) 查看文件

       [root@vpntest RECOVERED_FILES]# cat test11

alsd;jf;lajsldfjaljsdlfjalsdjflajsdlfjasldjflajsdlfjalsdlakasdlfjalsjdflajsldfjlasdkfasdfalsdjfklak

       [root@vpntest RECOVERED_FILES]# cat test11 |wc -c

100  还是原来的100个字符

 

5. 恢复所有已经删除的文件

[root@vpntest undel8]# extundelete /dev/mapper/VolGro_data-lv_data --restore-all

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 120 groups loaded.

Loading journal descriptors ... 1354 descriptors loaded.

Searching for recoverable inodes in directory / ...

2400 recoverable inodes found.

Looking through the directory structure for deleted files ...

2144 recoverable inodes still lost.

 

恢复结果:

         恢复结果中有大量的file.索引号,约2000

         还有一些正常的目录html5, test11

 

. 总结:

       linux下作独立分区的文件级恢复,最重要的就是卸载分区再进行恢复。

       尽管,不卸载分区也可能正常恢复,甚至全部或绝大部分恢复,但风险很高,很可能对已经删除的文件作二次破坏,导致最终无法恢复。

       无论文件恢复的过程容易还是艰难,备份总是应该先行的。

阅读(2155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~