努力, 努力, 再努力
全部博文(220)
分类: 系统运维
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会通过文件系统的inode信息(根目录的inode一般为2)来获得当前文件系统下所有文件的信息,包括存在的和已经删除的文件,这些信息包括文件名和inode。然后利用inode信息结合日志去查询该inode所在的block位置,包括直接块,间接块等信息。最后利用dd命令将这些信息备份出来,从而恢复数据文件。
[root@vpntest ~]# ls -id /
2 / 这里的2表示根目录的inode=2
[root@vpntest ~]# ls -id /data
2 /data 这里2表示:/data是一个独立分区的根目录
yum install –y e2fsprogs-*
wget
tar jxvf extundelete-0.2.0.tar.bz2
cd extundelete-0.2.0
./configure
make
make install
结论1:被删除文件的独立分区经过格式化后,无法再通过extundelete恢复
结论2: 重新启动系统,挂载被删除文件的独立分区,卸载分区后可通过
extundelete恢复,无影响
结论3: extundelete不能恢复空文件,空目录,包含空文件的目录
对于像python项目里有__init__.py文件,但又无内容的空文件无法恢复,恢 复出来的程序目录可能无法运行
结论4: 被删除文件的独立分区没有卸载,而且touch 文件,即使文件为空,
仍然造成所有数据丢失
结论5: 被删除文件的独立分区没有卸载,执行vim a,即使没有保存,没有写盘,
仍然造成所有数据丢失
结论6: 如果分区已经被划为LVM卷,操作对像应该是逻辑卷,而不是分区块
卷分区:/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
extundelete /dev/mapper/VolGro_data-lv_data --inode 2
注意: 2是/data 独立分区的索引号
实践0: 独立分区格式化后mkfs.ext4 /dev/mapper/VolGro_data-lv_data
由于inode重新创建,造成数据无法恢复
实践1:独立分区(非根分区),卸载分区恢复,成功率99%
这是最正确的操作方法
(0) 删除 /data/html5之下的html5_code和gitroot:
(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_code和gitroot
(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_code和gitroot
(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
丢失了绝大部分文件
(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个字符
[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下作独立分区的文件级恢复,最重要的就是卸载分区再进行恢复。
尽管,不卸载分区也可能正常恢复,甚至全部或绝大部分恢复,但风险很高,很可能对已经删除的文件作二次破坏,导致最终无法恢复。
无论文件恢复的过程容易还是艰难,备份总是应该先行的。