参考http://ixdba.blog.51cto.com/2895551/1566856/
为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候改如何快速、有效地恢复数据呢? 本文我们就来介绍一下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恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,
包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。
最后利用dd命令将这些信息备份出来,从而恢复数据文件。
安装extundelete
官网http://extundelete.sourceforge.net/ [root@node85 rpm]# yum install e2fsprogs e2fsprogs-devel e2fsprogs-libs -y 安装依赖包 [root@node85 tools]# tar jxvf extundelete-0.2.4.tar.bz2 [root@node85 tools]# cd extundelete-0.2.4 [root@node85 extundelete-0.2.4]# ./configure [root@node85 extundelete-0.2.4]# make [root@node85 extundelete-0.2.4]# make install [root@node85 extundelete-0.2.4]# extundelete --help Usage: extundelete [options] [--] device-file Options: --version, -[vV] 显示版本号 --help, 显示软件帮助信息 --superblock 显示超级快信息--journal 显示日志信息 --after dtime 时间参数,表示在某段时间之后被删的文件或目录。 --before dtime 时间参数,表示在某段时间之前被删的文件或目录。 Actions: --inode ino 显示节点 'ino'的信息--block blk 显示节点 'blk'的信息--restore-inode ino[,ino,...] 恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。 --restore-file 'path' 恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。 --restore-files 'path' 恢复命令参数,表示将恢复在路径中已列出的所有文件。Each filename should be in the same format as an option to --restore-file, and there should be one per line.--restore-directory 'path' Will restore directory 'path'. 'path' is relative to the root directory of the file system. The restored directory is created in the output directory as 'path'. --restore-all 恢复命令参数,表示将尝试恢复所有目录和文件。 -j journal 表示从已经命名的文件中读取扩展日志。 -b blocknumber 表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。-B blocksize 表示使用数据块大小来打开文件系统,一般用于查看已经知道大小的文件。 --log 0 Make the program silent. --log filename Logs all messages to filename. --log D1=0,D2=filename Custom control of log messages with comma-separated Examples below: list of options. Dn must be one of info, warn, or --log info,error error. Omission of the '=name' results in messages --log warn=0 with the specified level to be logged to the console. --log error=filename If the parameter is '=0', logging for the specified level will be turned off. If the parameter is '=filename', messages with that level will be written to filename. -o directory Save the recovered files to the named directory. The restored files are created in a directory named 'RECOVERED_FILES/' by default.
实践使用extundlete恢复数据
在数据被误删除后 第一时间要做的是卸载被删除数据所在的磁盘或磁盘分区,如果是系统根分区的数据遭到误删除,就需要将系统进入单用户,并且将根分区以只读模式挂载。mount -o remoun,ro /
这样做的原因很简单,因为将文件删除后,仅仅是将文件的inode结点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,
在这些数据块被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回力无天。所以,以只读模式挂载磁盘可以尽量降低数据块中数据被覆盖的风险,以提高恢复数据成功的比率。
1、创建模拟数据
[root@node85 data]# tree
.
|-- imagick-2.3.0.tgz
|-- inotify-tools-3.13.tar.gz
|-- ipython-1.2.1.tar.gz
|-- lost+found
`-- rpm
|-- httpd-2.2.23.tar.gz
|-- httpd-2.2.31.tar.gz
|-- ImageMagick-6.7.9-9.tar.xz
|-- ImageMagick-6.9.6-2.tar.gz
`-- passwd
[root@node85 data]# rm -rf /data/*
2.卸载磁盘分区
在将数据误删除后,立刻需要做的就是卸载这块磁盘分区:
[root@node85 /]# umount /data
3.查询可恢复的数据信息
[root@node85 /]# extundelete /dev/sda5 --inode 2 #显示/dev/sda4分区的文件信息(2为根分区inode值)
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 39 groups loaded.
Group: 0
Contents of inode 2:
0000 | ed 41 00 00 00 04 00 00 27 3e fb 58 cd 3d fb 58 | .A......'>.X.=.X
0010 | cd 3d fb 58 00 00 00 00 00 00 02 00 02 00 00 00 | .=.X............
0020 | 00 00 00 00 00 00 00 00 01 02 00 00 00 00 00 00 | ................
0030 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0040 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0050 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0060 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
0070 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
Inode is Allocated
File mode: 16877
Low 16 bits of Owner Uid: 0
Size in bytes: 1024
Access time: 1492860455
Creation time: 1492860365
Modification time: 1492860365
Deletion Time: 0
Low 16 bits of Group Id: 0
Links count: 2
Blocks count: 2
File flags: 0
File version (for NFS): 0
File ACL: 0
Directory ACL: 0
Fragment address: 0
Direct blocks: 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Indirect block: 0
Double indirect block: 0
Triple indirect block: 0
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11 Deleted
httpd-2.2.23.tar.gz 12 Deleted
httpd-2.2.31.tar.gz 13 Deleted
ImageMagick-6.7.9-9.tar.xz 6025 Deleted
ImageMagick-6.9.6-2.tar.gz 10041 Deleted
imagick-2.3.0.tgz 18073 Deleted
inotify-tools-3.13.tar.gz 18074 Deleted
ipython-1.2.1.tar.gz 18075 Deleted
rpm 60241 Deleted
根据上面的输出,标记为Deleted状态的是已经删除的文件或目录。同时还可以看到每个已删除文件的inode值,接下来就可以恢复文件了。
恢复方法:
方法一:通过inode号进行恢复 [root@node85 /]# extundelete /dev/sda5 --restore-inode inode号
方法二:通过文件名进行恢复 [root@node85 /]# extundelete /dev/sda5 --restore-file 文件名
方法三:通过目录进行恢复 [root@node85 /]# extundelete /dev/sda5 --restore-directory 目录
方法四:恢复所有文件 [root@node85 /]# extundelete /dev/sda5 --restore-all 恢复所有
方法五:加时间参数 --after dtime --before dtime
参数后面跟的时间是个总秒数。起算时间为“1970-01-01 00:00:00 UTC”,通过“date +%s”命令即可将当前时间转换为总秒数,
如果恢复的是一个小时之内的数据,在“date +%s”上减去3600
[root@node85 home]# extundelete /dev/sda5 --restore-inode 12
[root@node85 home]# ls -l RECOVERED_FILES/file.12
-rw-r--r-- 1 root root 7374712 Apr 22 19:46 RECOVERED_FILES/file.12
[root@node85 home]# extundelete /dev/sda5 --restore-file httpd-2.2.31.tar.gz
[root@node85 home]# ls RECOVERED_FILES/
file.12 httpd-2.2.31.tar.gz
[root@node85 home]# extundelete /dev/sda5 --restore-directory rpm
[root@node85 home]# ls RECOVERED_FILES/
file.12 httpd-2.2.31.tar.gz rpm
[root@node85 home]# rm -rf RECOVERED_FILES/
[root@node85 home]# extundelete /dev/sda5 --restore-all
[root@node85 home]# ls RECOVERED_FILES/
httpd-2.2.23.tar.gz ImageMagick-6.7.9-9.tar.xz imagick-2.3.0.tgz ipython-1.2.1.tar.gz
httpd-2.2.31.tar.gz ImageMagick-6.9.6-2.tar.gz inotify-tools-3.13.tar.gz rpm