做为一个Linux运维管理员,平时经常会用到rm 命令,但是这个命令带上参数-rf,你就应该慎用,除非你知道自己在做什么,但是万一操作失误了,导致误删了,又该如何恢复呢,其实还是有办法的。借助于一款开源软件ext3grep.
先说一下原理性的东西。
1、linux删除文件的原理:
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了。
以上引文来自于“http://blog.sina.com.cn/s/blog_4b3c1f950102uz74.html”
2、下面来说一说ext3grep这个工具,在这个工具出现以前,恢复ext3文件系统中被删除的数据是不可能的。因为ext3文件系统不同于ext2文件系统,它在删除一个文件后,会把文件inode结点中扇区指针清为0,而这让文件恢复看起来不太可能。不过,正如ext3grep工具作者所说的,因为ext3是一个日志型的文件系统,通过分析日志信息,有很大的可能重新解析出块指针,从而恢复出目录和文件。
本工具的实验环境:
[root@bogon ]# uname -r
2.6.18-164.el5
[root@bogon ]# cat /etc/redhat-release
CentOS release 5.4 (Final)
使用恢复之前应注意:
1、查看有没有e2fsprogs及e2fsprogs-devel开发包
2、rm -rf 文件的分区不要写其他的文件。
3、为了省事先安装两个包组"Development Libraries" "Development Tools"。
验证e2fsprogs及其devel包。
[root@bogon ~]# rpm -qa | grep e2fsprogs
e2fsprogs-devel-1.39-37.el5
e2fsprogs-libs-1.39-37.el5
e2fsprogs-1.39-37.el5
下载ext3grep包,
http://down.51cto.com/data/709491
一、先安装包组
#yum grouplist
#yum groupinstall "Development Libraries" "Development Tools"
2、解压ext3grep,编译安装
#tar -zxvf ext3grep-0.10.1.tar.gz
#cd ext3grep-0.10.1
没有报错信息就开始编译及安装
安装完成后,查看一下是否安装成功。
二、准备测试用的数据
本实验用的是lvm分区格式,随便创建了一个测试分区test1
创建一个测试的文件夹xcy,并复制两个文件到此目录下,当然你自己随便写两个文件也可以,然后重命名一下,便于区分,并删除这两个最新的文件,卸载分区test1,保证别人不会往test1目录下写文件。
查看是否已经卸载test1。
#df -lh
三、开始恢复删除的数据
实例:ext3grep /dev/mapper/VGOC01-LogVol03 --ls --inode 2
格式:ext3grep 删除文件的分区 --ls --innode inode号
为什么最后我们要写2 因为我不知道我的删除的文件的inode号多少, 所有我写的是最大的inode / 的inode号 可以用: ls -id / 查看
执行下去以后就会看到 他在帮你找删除的文件。。
可以看出,xcy目录的inode是14337,然后根据14337再查找此目录下的文件,如下:
分别14338和14339
然后利用命令
#ext3grep /dev/mapper/VGOC01-LogVol03 --restore-inode 14338
#ext3grep /dev/mapper/VGOC01-LogVol03 --restore-inode 14339
分别开始恢复passwd.xcy和group.xcy
恢复完成后,重新挂载/test1
进入xcy目录查看,发现并没有误删除的文件,因为恢复的文件放在
/root/RESTORED_FILES
目录下
至于对应关系,可以查看# ext3grep /dev/mapper/VGOC01-LogVol03 --ls --inode 14337的执行结果。
然后 将这两个文件移动到/test1/xcy/目录下即可。
至此,误删的文件恢复成功,引文中说可以恢复Mysql误删文件,没有实验过,此处不作评论。