linux 误删除文件了怎么恢复?

要想恢复误删除的文件,必须清晰数据在磁盘上究竟是怎么存储的,及怎么定位并恢复数据。本文从数据恢复的角度,着重介绍了 ext2 文件系统中使用的一些基本概念和重要数据结构,并通过几个实例介绍了怎么手工恢复已删除的文件。最后针对 ext2 现有实现存在的大文件无法正常恢复的问题,通过修改内核中的实现,给出了一种解决方案。
对于非常多 Linux 的用户来说,可能有一个问题一直都非常头疼:对于那些不小心删除的数据来说,怎样才能恢复出来呢?大家知道,在 视窗系统 系统上,回收站中保存了最近使用资源管理器时删除的文件。即便是对于那些在命令行中删除的文件来说,也有非常多工具(例如recover4all,FinalData Recovery)能把这些已删除的文件恢复出来。在Linux 实际上,为了方便用户的使用,目前 Linux 上流行的桌面管理工具(例如gnome和KDE)中都已集成回收站的功能。其基本思想是在桌面管理工具中捕捉对文件的删除操作,将要删除的文件移动到用户根目录下的 .Trash 目录中,但却并不真正删除该文件。当然,像在 视窗系统 上相同,如果用户在删除文件的同时,按下了 Shift 键并确认删除该文件,那么这个文件就不会被移动到 .Trash 目录中,也就无从恢复了。此时,习惯了使用 视窗系统 上各种恢复工具的人就会顿足捶胸,抱怨 Linux 上工具的缺乏了。不过请稍等一下,难道按照这种方式删除的文件就真的无从恢复了么?或换一个角度来看,使用 rm 命令删除的文件是否更有办法能够恢复出来呢?
在开始真正进行实践之前,让我们首先来了解一下在 Linux 系统中,文件是怎么进行存储和定位的,这对于理解怎么恢复文件来说非常重要。我们知道,数据最终以数据块的形式保存在磁盘上,而操作系统是通过文件系统来管理这些数据的。ext2/ext3 是 Linux 上应用最为广泛的文件系统,本文将以 ext2 文件系统为例展开介绍。
我们知道,在操作系统中,文件系统是采用一种层次化的形式表示的,通常能表示成一棵倒置的树。所有的文件和子目录都是通过查找其父目录项来定位的,目录项中通过匹配文件名能找到对应的索引节点号(inode),通过查找索引节点表(inode table)就能找到文件在磁盘上的位置,整个过程如图1所示。
图 1. 文件数据定位过程

从图2中能看到,对于 ext2 文件系统来说,磁盘被划分成一个个大小相同的数据块,每个块的大小能是1024、2048 或 4096 个字节。其中,第一个块称为引导块,一般保留做引导扇区使用,因此 ext2 文件系统一般都是从第二个块开始的。剩余的块被划分为一个个的块组,ext2 文件系统会试图尽量将相同文件的数据块都保存在同一个块组中,并且尽量确保文件在磁盘上的连续性,从而提高文件读写时的性能。
至于一个分区中到底有多少个块组,这取决于两个因素:

    分区中的块组数=分区大小/(块大小*8)
    这是由于在每个块组中使用了一个数据块位图来标识数据块是否空闲,因此每个块组中最多能有(块大小*8)个块;该值除上分区大小就是分区中总的块组数。
    每个块组都包含以下内容:
  • 终极块。存放文件系统终极块的一个拷贝。
  • 组描述符。该块组的组描述符。
  • 数据块位图。标识相应的数据块是否空闲。
  • 索引节点位图。标识相应的索引节点是否空闲。
  • 索引节点表。存放所有索引节点的数据。

    • 对于 i_block 的前 12 个元素(i_block[0]到i_block[11])来说,其中存放的就是实际的数据块号,即对应于文件的 0 到 11 块。这种方式称为直接寻址。
    • 对于第13个元素(i_block[12])来说,其中存放的是另外一个数据块的逻辑块号;这个块中并不存放真正的数据,而是存放真正保存数据的数据块的块号。即 i_block[12] 指向一个二级数组,其每个元素都是对应数据块的逻辑块号。由于每个块号需要使用 4 个字节表示,因此这种寻址方式能访问的对应文件的块号范围为 12 到 (块大小/4)+11。这种寻址方式称为间接寻址。
    • 对于第14个元素(i_block[13])来说,其中存放也是另外一个数据块的逻辑块号。和间接寻址方式不同的是,i_block[13] 所指向的是个数据块的逻辑块号的二级数组,而这个二级数组的每个元素又都指向一个三级数组,三级数组的每个元素都是对应数据块的逻辑块号。这种寻址方式称为二次间接寻址,对应文件块号的寻址范围为 (块大小/4)+12 到
    • 对于第15个元素(i_block[14])来说,则利用了三级间接索引,其第四级数组中存放的才是逻辑块号对应的文件块号,其寻址范围从 (块大小/4)2+(块大小/4)+12 到 (块大小/4)3+ (块大小/4)2+(块大小/4)+11。
    • 中,我们虽然输入要创建的分区大小为 20GB,但实际上,真正分配的空间并不是严格的20GB,而是只有大约 20*109 个字节,准确地说,应该是 (4885760 * 4096) / (24) = 18.64GB。这是由于不同程式的计数单位的不同造成的,在使用存储设备时经常遇见这种问题。因此,这个分区被划分成 150 个块组,前 149 个数据块读出,就能将整个文件完整地恢复出来。不过在磁盘空间有限的情况下,这种假设并不成立,如果系统中磁盘碎片较多,或同一个块组中已没有足够大的空间来保存整个文件,那么文件势必会被保存到一些不连续的数据块中,此时上面的方法就无法正常工作了。
      反之,如果在删除文件的时候能够将间接寻址使用的索引数据块中的信息保存下来,那么不管文件在磁盘上是否连续,就都能将文件完整地恢复出来了,不过这样就需要修改 ext2 文件系统的实现了。在 ext2 的实现中,和之有关的有两个函数:ext2_free_data 和 ext2_free_branches(都在 fs/ext2/inode.c 中)。2.6

我要回帖

更多关于 linux误删文件目录怎么恢复 的文章

 

随机推荐