一、首先我们先来了解下文件删除原理:
1)
linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count和i_nlink。
2)当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
3) 当你发现你误删除了文件后,要做的第一件事是马上卸载被误删除文件所在的分区,或者以只读的方式来挂载该分区。原因大家都很清楚,文件被删除后,文件中的数据还存在磁盘上,除非存放这些数据的数据块又被操作系统分配出去了。我们这一步就是尽量降低数据块中数据被覆盖的风险,以提高恢复数据成功的比率。
二、了解完后,实战演练
方案1)现在我向大家介绍使用extundelete恢复文件(适合rhel6.X系统的ext4)
#上传extundelete-0.2.4.tar.bz2包传到/usr/local/src下
#tar -jxvf extundelete-0.2.4.tar.bz2
# cd extundelete-0.2.4
#./configure (这步出现错误,请看下文)
#mount /dev/cdrom /mnt
#rpm -ivh /mnt/Packages/e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
(必须安装否则,前面./configure报错)
#./configure (成功)
make && make install
软件安装完毕,下面我们来恢复文件吧
1)我先创建一个恢复目录
mkdir recover
cd recover
extundelete /dev/sda4 --inode 2 (看到你所删除的文件)
#extundelete /dev/sda4 -restore-inode 15 (按对应的节点来恢复文件)
#extundelete /dev/sda4 -restore-file a.txt (按对应文件名来恢复文件)
#extundelete /dev/sda4 -restore-dirctory etc (按对应的目录,这里我以etc目录)
##extundelete /dev/sda4 -restore-all (全部恢复)
方案2)使用lsof自带一个的神秘功能
原理:大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中
假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法
如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
从
上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为
2。同时还可以看到/var/log
/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2
(fd下的每个以数字命名的文件表示
进程对应的文件描述符)中查看相应的信息,如下:
# head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug
4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8
([email protected])
(gcc version 4.2.0) #1 SMP Wed Jul
18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel:
BIOS-provided
physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820:
0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86
kernel: BIOS-e820:
000000000009f000 - 00000000000a0000 (reserved) Aug 4
13:50:15 holmes86 kernel:
BIOS-e820: 0000000000100000 - 000000001f7d3800
(usable) Aug 4 13:50:15 holmes86 kernel:
BIOS-e820: 000000001f7d3800 -
0000000020000000 (reserved) Aug 4 13:50:15 holmes86
kernel: BIOS-e820:
00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15
holmes86
kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述
符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
方案3)使用ext3grep恢复文件(适合rhel5.X系统的ext3)
#上传ext3grep-0.10.1.tar.gz包传到/usr/local/src下
#tar -jxvf ext3grep-0.10.1.tar.gz
# cd ext3grep-0.10.1
#./configure (成功)
make && make install
软件安装完毕,下面我们来恢复文件吧
1)我先创建一个恢复目录
mkdir recover
cd recover
ext3grep /dev/your-device --restore-filepath/to/your/file/filename
需要注意的是,上面的文件路径,是在该分区上文件路径。假设我们要恢复/dev/sda3分区上文件,这个分区原来的安装点是/home,现在想恢复文件/home/easwy/vi/tips.xml,那么输入的命令应该是:
ext3grep /dev/sda3--restore-file easwy/vi/tips.xml
所有恢复的文件都会放在当前目下在RESTORED_FILES目录下,大小也一样,这里RESTORED_FILES目录是执行ext3grep的当前目录下
如果你忘记了文件名,或者你误删除的是一个目录而你无法记全该目录中的文件,你可以先用下面的命令查询一下文件名:
ext3grep /dev/sda3 --dump-names | tee filename.txt
上面的命令把ext3grep命令的输出记录到文件filename.txt中,你可以慢慢查看,或者使用grep命令过滤出你需要的信息。
当你知道了目录/文件的信息后,就可以用上面说的命令进行恢复了。
复所有文件和目录,但是目录的话,如果删除时间较长,不一定能完全恢复,压缩文件一般都能恢复
ext3grep /termite/cc-disk --restore-all
ext3grep /dev/sda3 --ls --inode 2 创建扫描分区文件:sda5.ext3grep.stage1和sda5.ext3grep.stage2
如果想要重新生成可以删除这个两个文件,再次执行这条命令。另外当第一次执行ext3grep /dev/sda3 --restore-file test/a.txt进行还原时也会自动生成扫描分区文件。