extundelete恢复文件

简介:

一、首先我们先来了解下文件删除原理:

    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 (root@everestbuilder.linux-ren.org)

(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进行还原时也会自动生成扫描分区文件。

本文转自silence博客51CTO博客,原文链接http://blog.51cto.com/silencezone/1723194如需转载请自行联系原作者

a120518129
相关文章
|
4月前
|
供应链 Shell Linux
通过extundelete使用shell实现CentOS6 ext4文件系统误删除文件的恢复
通过extundelete使用shell实现CentOS6 ext4文件系统误删除文件的恢复
45 0
|
关系型数据库 MySQL 数据库