日期:2014-05-16  浏览次数:20736 次

使用 Linux 文件恢复工具

Linux 系统管理员守则中有这么一条:“慎用 rm -rf 命令,除非你知道此命令所带来的后果“,不过 Linux 下删除文件并不是真实的删除磁盘分区中的文件,而是将文件的 inode 节点中的扇区指针清除,同时释放这些数据对应的数据块,当释放的数据块被系统重新分配时,那些被删除的数据就会被覆盖,所以误删除数据后,应马上卸载文件所在的分区。然后使用相关工具进行恢复。本文以 Ubuntu 12.04 平台为例介介绍四个(foremost、extundelete、testdisk 和 phtorec)常用的 Linux 删除文件恢复工具的使用方法。

?

Linux 文件恢复的原理

inode 和 block

首 先简单介绍一下 Linux 文件系统的最基本单元:inode。inode 译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是 inode,另一部份是 block,block 是用来存储数据用的。而 inode 呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode 为每个文件进行信息索引,所以就有了 inode 的数值。linux 操作系统下可以使用 ls –id 命令来查看文件或者目录的 inode 值,一般”root”目录的 inode 值为 2,一个分区挂载到一个目录下时,这个”root”目录的 inode 值为 2

mount /dev/sdb2 /tmp
ls -id /tmp
2 /tmp

?

文件恢复的原理

本文要介绍的命令是通过文件系统的 inode 值(一般是 2 )来获取文件系统信息。在 ext3 和 ext4 文件系统中,每个文件都是通过 inode 来描述其数据存放的具体位置,当文件被删除以后,inode 的数据指针部分被清零,文件目录区没有太多变化。文件的读写都是通过 inode 来实现,当 inode 数据指针被清零以后,即便文件内容还在,也没有办法把文件内容组合出来。当 ext3 和 ext4 文件系统中的元数据 metadata 发生变化时,相应的元数据 metadata 在日志文件会有一份拷贝。比如一个文件被删除了,它的 inode 信息会在日志文件中先保存一份,然后把要删除文件 inode 相关信息清零。这个日志文件是循环使用的,当操作过多时,删除的文件的 inode 日志记录会被新的数据替换,这就彻底丧失了根据 inode 找回数据的机会了。如果是大量文件的删除,这个日志文件会被反复循环利用多次,只留给最后删除的那些文件的恢复机会。

?

使用命令行工具恢复文件

foremost 和 extundelete 简介

formost 是一个基于文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。这个过程通常叫做数据挖掘(data carvubg)。formost 可以分析由 dd、Safeback、Encase 等生成的镜像文件,也可以直接分析驱动器。文件头和尾可以通过配置文件设置,也可以通过命令行开关使用 formost 内建的文件类型。formost 最初是由美国空军特别调查室(Air Force Office of Special Investigations)和信息系统安全研究中心(The Center for Information Systems Security Studies and Research)开发的,现在使用 GPL 许可。Foremost 支持恢复如下格式:avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip。

?

针对 Linux 下的 ext 文件系统来说,常用的 Linux 文件删除恢复工具有 debugfs、ext3grep、extundelete 等。extundelete 是一个开源的数据恢复工具,支持 ext3、ext4 文件系统,其官方站点位于http://extundelete.sourceforce.net/,目前最新稳定版本为 0.2.0。

?

上 面介绍的两种命令行工具 foremost 和 extundelete 二者相比,foremost 支持的文件系统比较多(包括 ext2、 ext3 、vfat、NTFS、ufs、jfs 等)和 extundelete 支持的文件系统较少(ext3、ext4)文件系统。不过 foremost 只能支持恢复特定格式的文件。

?

使用 foremost

首先安装软件包

apt-get install foremost

?

其它 Linux 发行版用户可以在 http://foremost.sourceforge.net/ 下载源代码编译安装。下面看看使用方法。

?

恢复单个类型文件

笔者删除一个 USB(/dev/sdba1)存储器中一个 png 文件然后使用 formost 恢复。

rm -f /dev/sdb1/photo1.png
foremost -t png -i /dev/sdb1

?

恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立 png 子目录下会包括所有可以恢复的 png 格式的文件。

?

需要说明的是 png 子目录下会包括的 png 格式的文件名称已经改变,另外 output 目录下的 audit.txt 文件是恢复文件列表。

?

恢复多个类型文件

foremost -v -T -t doc,pdf,jpg,gif -i /dev/sda6 -o /media/disk/Recover

?

恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立四个子目录(/doc,/pdf,/jpg,/gif),分别包括四种类型文件。另外 output 目录下的 audit.txt 文件是恢复文件列表。

?

使用 extundelete

首先安装软件包

apt-get install extundelete

?

其它 Linux 发行版用户可以在http://extundelete.sourceforce.net/下载源代码编译安装。下载安装 extundelete 之前要安装两个软件包 e2fsprogs 和 e2fslibs。下面看看使用方法

?

模拟数据误删除环境

这里我们使用一个分区/dev/sdd1 挂在在/backupdate 上,建立一个测试目录/delete 并建立一文件:del1.txt 。

# mkdir –p /backupdate/deldate
# mkfs.ext4 /dev/sdd1
# mount /dev/sdd1 /backupdate
#cd /backupdate/deldate
# touch del1.txt
# echo " test 1" > del1.txt
获取文件校验码
# md5sum del1.txt                           
 66fb6627dbaa37721048e4549db3224d  del1.txt

删除文件
# rm -fr /backupdate/*   

卸载文件系统或者挂载为只读
# umount /backupdate
查询恢复数据信息,注意这里的--inode 2 这里会扫描分区 :
# extundelete /dev/sdd1 --inode 2
.....
File name                                       | Inode number | Deleted status
Directory block 8657:
.