使用mc恢复被删除文件
Steven Hirsch,一个Linux的良师益友,他是如此的友善,给我解释了如何使用(一个特定编译的版本)Midnight Commander来恢复文件。具有讽刺意义的是,这个曾经以Linux里所能见到的疯狂的速度删除文件的工具居然是我恢复文件的最佳希望。在我真诚地希望你不会看到成百上千的必须文件高速消失时,我希望你已经准备好了黎明的到来。你可能希望作为root用户执行;我们会加载并卸载分区,并使用这些原始的磁盘分区进行工作。就象下面的例子一样,如果你要卸载诸如/home之类的分区,这可能尤其必要。
在你的系统上取得Midnight Commander的一份拷贝
虽然它不是唯一具有恢复删除文件能力的程序,但是它是我最熟悉的恢复删除文件的工具。现在,缺省情况下MC已经包含了恢复删除文件的代码。如果你的发行版本中没有MC,就从http://www.gnome.org/mc/获取一份拷贝并在系统中安装上。
进行恢复的最好时机是在你删除文件之后——你希望要把恢复的文件尽可能少变动地恢复到文件系统中。
建立一个测试文件并将这个文件删除
你应该在需要的时候可以加载并卸载的分区上执行这些操作——不要在你的web server的主分区上执行这些操作。
选取一个非root的分区(使用mount命令来查看已经加载的分区)。对于本例来说,让我们假定/dev/sdd1是加载在/home上的。这样创建一个测试文件:
echo "Just a test file" >/home/testfile
rm -f /home/testfile
如果你是在root分区(或者更糟糕的情况,你只有一个分区)上创建的这个文件,那么你就要在下个月我介绍如何在root分区上安全操作时再来看一下了。
卸载删除文件的分区
在本例中,这可以通过执行下面的命令来实现:
umount /dev/sdd1
不要试图在一个已经加载的分区上恢复文件——这样你可能会破坏磁盘。
启动Midnight Command并选择要恢复的文件
mc
在mc中,输入:
cd undel:/dev/sdd1
你只能在mc中使用这个命令,其它地方都不行。在mc中使用“cd”命令和在命令提示符中的效果相同;该命令会改变目录。这个特定语法的命令指示mc显示该分区上所有删除的可以恢复的文件,而不是显示目录中的文件。
耐心等待一会,mc正在整个ext2文件系统上查找删除的inode(i节点)(一个inode中包含了一个文件的_contents_,但是没有文件名)。大约一分钟左右,你就会在这个窗口中看到一个显示有一些名字类似“23434632:2”的文件列表。这些项的日期和时间是对应的inode被删除的日期和时间。我发现最有用的是对这个窗口根据时间进行排序:
, r, s, m,
或者
, l, s, m,
你也可以使用 “查看”特性来观察inode的内容。在你认为删除文件的时间靠近窗口中列出的时间的文件上面按下<ins>键。这样就把这些文件立即标记成已恢复的。
恢复文件
在其它窗口(使用键在mc中切换窗口)中,在/tmp下建立一个空目录,例如/tmp/deletedfiles。
mkdir /tmp/deletedfiles
现在切换回unel窗口并按下键把这些文件拷贝到实际的文件系统中。如果你已经处理完了,就可以按下键离开mc——见屏幕底部的说明。
现在是重新加载/home分区的最好时机,使用下面的命令:
mount /home
现在,你可能希望逐个查看一下这些文件,并确定实际的名字应该是什么。既然这些文件都在/tmp/deletedfiles目录中,你可以把它们和其它文件一样处理,例如:
cd /tmp/deletedfiles
mv 23434632:2 /home/testfile
如果你多次删除了一个文件,那么你就会得到一个文件的多个拷贝;你需要确定哪个文件是你希望保留的。
就是这样,你已经从Linux分区中恢复出文件来了。
对于这种处理方法有几点需要注意。首先,这种特殊的恢复技巧只能在ext2分区上工作。其次,如果文件是在运行2.0.x版本的内核的系统上删除的,那么恢复过程只能最大可以恢复文件的前面12288字节。这是删除过程中的一个bug,它没有把文件作为一个整体保留到文件删除为止。可能在比我使用的更新的2.0.x版本的内核中已经修正了这个问题,但是我知道在2.2.x版本的内核中这个问题已经修正了。
这种特性的荣誉应该归功于Ted T’so和其它ext2文件系统的作者,也应该归功于Miguel de Icaza和其它的MC的作者。
十分感谢Bob DeRosa,感谢他允许我再次在LinuxMonth中发表文章。
William 是Vermont, USA的一个Open-Source的开发者、狂热的追求者和倡导者。