恢复ext3/ext4磁盘文件系统中被删除的文件

      恢复ext3/ext4被删除的工具有很多种,比较简单易用的工具有extundelete,ext4magic,debugfs等。下面简要介绍extundelete

  的相关内容。ext4magic的方法,参见 http://openfacts2.berlios.de/wikien/index.php/BerliosProject:Ext4magic-Howto

  

1. 注意:

  a)  删除之后,不要再向需要恢复的文件所在的分区上写任何东西,包括不要磁盘恢复工具下载到该分区上。实践证明,删掉的文件,

    它的数据块可能很容易就被覆盖掉。数据能被恢复的前提是文件对应的数据块在删除后没有被重新分配。

  b)  删除之前最好先umount分区(虽然不umount也很可能成功)。如果数据和系统目录放在一个盘里,最好从光盘/U盘/移动硬盘

    等启动再进行操作吧。

  c)  建议尽量去下载最新版的源码自行编译,发行版的源里面可能有版本上的滞后。源码地地址:

    http://sourceforge.net/projects/extundelete/files/extundelete/

  d)  extundelete是基于日志进行恢复的,而日志大小是有限的,所以删除之后得尽快恢复,时间久了可能目前的操作信息就被覆盖掉了。

 

2. 编译:

  a)  解压并进入主目录extundelete-0.2.4/

  b)  执行 ./configure,如果提示有相应的库没安装,从源里面安装相应的库即可(至少需要安装e2fslibs-dev)。如果没有错误,会生成makefile

  c)  执行 make

  d)  执行sudo make install

 

3. 基本使用:

  以下试验中,我的/dev/sdb1分区挂载在/home/myname/disk_test目录下,该分区的根目录下有目录del_test2/,删除del_test2

  目录下的所有文件,剩下一个空目录del_test2/

  a)   恢复一个指定路径的文件

    如果记得被删除文件在文件系统(分区)上的路径:则使用 extundelete --restore-file del_test2/funzip /dev/sdb1

    注意这里的路径是指在文件系统中的路径,和该文件系统被挂载在哪里无关。

  b)   恢复一个指定路径的目录

    extundelete --restore-dir del_test2/  /dev/sdb1

    这里不管del_test2是不是被删除,都可以恢复出该目录及其下面的所有文件,如果数据块仍然没有被重写的话。

  c)  恢复所有被删除的文件

    extundelete --restore-all  /dev/sdb1

    这种方法简单粗暴,但一方面目的性较差,可能恢复出乱七八糟的不需要的文件,浪费时间和空间;另一方面,很多用上面几种方

    法恢复的,用这种方法恢复不出来。

 

------------------------------------------------------------------分割线,对inode不感兴趣可不必往下看--------------------------------------------------------------

 

4. 利用inode

  大多数情况下,使用前面的方法就可以恢复有可能被恢复的文件了。这部分可以处理一些较少遇到的特殊情况,当然也可以作为另外一种

常规恢复手段,毕竟方法不嫌多嘛。

     a)  关于inode

    每个文件(目录是一种特殊的文件)都有一个对应的inode(一个inode可对应多个文件,也就是所谓的硬链接)。inode里面描述了

    文件的元信息,包括基本权限、所有者等,还会包含该文件对应的数据块的位置。inode从1开始编号,一直到某个最大值,这个值在

    创建文件系统的时候就已经确定。一个文件系统,对应磁盘上的一个分区。

 

    ext3/4前面若干个inode是有特殊意义的,如下图

     

    从上图中已经看到,文件系统的根目录对应的inode是2。

 

      b)  inode相对于前面三种方法的优势

    1). 如果一个目录删除之后,它对应的inode被分配给了其他文件,则无论如何都不可能用前面的方法恢复了,就像一颗

        二叉树的某个非叶节点破坏了,那么也就没有办法通过根节点访问该节点的子孙节点了,即使这些子孙节点仍然在存

        在于内存中。用inode访问被删除的文件,相当于直接使用内存地址去访问子节点。那么inode号应该是多少呢?一般

      来说,inode号会被连续分配,所以利用找到和被删除文件差不多时间创建的文件,就有很大可能找到所需要的inode

        了。当然,这中方法的前提是包含该文件的目录的inode已经被重新分配了,否则也不必要这么麻烦。

        这种情况经常出现的一个场景是,某个目录被删除了,之后在同一位置有新建了一个同名的目录,然后操作系统

      似乎会将以前的inode重新分配给这个目录,然后清空它的数据块,由于目录文件的数据块就是它的子文件的inode等

      信息,这样,子文件就没有办法通过之前的目录树恢复了。

    2). 恢复部分文件,如果某个被删除的文件有部分数据块已经被重写了,而另外一部分还是原来的数据。查看inode的信息

      的时候,可以看到它对应的数据块,之后再去查看这些块的数据,就能够恢复一部分数据。这也是之前的操作做不了的。

                (这种方法似乎用extundelete无法实现)

  

  c)  使用inode查看目录结构

    先取得root权限,输入

    extundelete --inode 2 /dev/sdb1

    可以看到根目录下的子文件、对应的inode,以及删除状态:

     

 

    列表中并不区分普通文件和目录文件。通过inode继续访问del_test2文件。输入

    extundelete --inode 1982125 /dev/sdb1

    得到如下列表,同时证明了它是一个目录

     

    可以看到,该目录下的awk和funzip两个文件都有Deleted的标记,表示已经被删除了。

 

 d)  使用inode恢复文件

    如果想通过inode恢复文件,例如上图中的funzip文件,那么输入

    extundelete --restore-inode 1982127 /dev/sdb

 

    如果该文件的对应的数据块没有被重写,那么在当前工作目录的RECOVERED_FILES子目录下会有名为file.1982127的文件。

    测试一下

    cmp RECOVERED_FILES/file.1982127 /usr/bin/funzip

    完全一致(文件系统里面的funzip是从/usr/bin/拷出来的)

 

    如果目录结构已经被破坏,那么找到大概和需要恢复的文件同时期创建的文件的inode,试试周围编号的inode吧。查看未删除

    文件的inode,用 ls -i 即可。

 

5. 一点疑问,希望一起讨论

        如果手抖输入rm –rf *,且删完之后马上意识到了。我想尽快切掉文件系统与内存的联系,需要保存内存中尚未写入的缓存数据到另

    外一个位置,以防止他们刷掉被删除文件的数据块呢。有没有什么办法可以尽快保存而且恢复完文件之后还可以将这些缓存完好地写

    入磁盘?

posted @ 2013-05-08 01:27  鸡__  阅读(784)  评论(0编辑  收藏  举报