做为一个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

恢复rm误删的文件_第1张图片

没有报错信息就开始编译及安装

恢复rm误删的文件_第2张图片

安装完成后,查看一下是否安装成功。

wKioL1bw80Cw-_4dAAAiqNJicnk445.png

二、准备测试用的数据

本实验用的是lvm分区格式,随便创建了一个测试分区test1

恢复rm误删的文件_第3张图片

创建一个测试的文件夹xcy,并复制两个文件到此目录下,当然你自己随便写两个文件也可以,然后重命名一下,便于区分,并删除这两个最新的文件,卸载分区test1,保证别人不会往test1目录下写文件。

恢复rm误删的文件_第4张图片

查看是否已经卸载test1。

#df -lh

三、开始恢复删除的数据

实例:ext3grep /dev/mapper/VGOC01-LogVol03 --ls --inode 2

格式:ext3grep 删除文件的分区 --ls --innode inode号

为什么最后我们要写2 因为我不知道我的删除的文件的inode号多少, 所有我写的是最大的inode / 的inode号 可以用: ls -id / 查看

执行下去以后就会看到 他在帮你找删除的文件。。

恢复rm误删的文件_第5张图片


恢复rm误删的文件_第6张图片

可以看出,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

恢复rm误删的文件_第7张图片

恢复完成后,重新挂载/test1

进入xcy目录查看,发现并没有误删除的文件,因为恢复的文件放在

/root/RESTORED_FILES

目录下

恢复rm误删的文件_第8张图片

至于对应关系,可以查看# ext3grep /dev/mapper/VGOC01-LogVol03 --ls --inode 14337的执行结果。

然后 将这两个文件移动到/test1/xcy/目录下即可。

wKiom1bw983hL7kIAAASIA4LVng463.png

至此,误删的文件恢复成功,引文中说可以恢复Mysql误删文件,没有实验过,此处不作评论。


引文地址 http://blog.itpub.net/29479238/viewspace-1163084/