周五下午7点接到电话并没有什么希奇;当一个人在家中工作时,别人总是可以找到他的。不寻常的电话另外一端说话的语调;其严重程度是绝对不会弄错的。电话的另一端,我的一个同事正向我解释一个脚本中的错误空格是如何把我们开发用的计算机上的整个home目录树都删除的。
在我向他解释Linux自己并没有一个真正恢复的工具之后,我们就开始从备份磁带上恢复文件了。到星期一早晨为止,大部分内容已经恢复原样了。
在事情发生的那一刻,我忘记了一点事情。在Linux系统中,恢复删除的文件是可能的,但是这需要在文件被删除之后就尽快进行。和Windows中的情况类似,如果你等的时间太长了,那么这些文件的内容可能就已经被覆盖了。
在1998年我使用Midnight Commander文件管理器工作时我就已经知道这种特性了。delete键会删除鼠标所在的文件,也可能会把已经选中的文件全部删除。我希望删除鼠标所在的文件爱你,但是却忘记了自己文档目录下所有的文件都已经选中了——你可以猜想会发生什么事情。当然,这不是文件管理器的错;在想到自己已经选定了多个文件这一事实之前,我就对删除请求进行了确认。
后来当然我又想起来了!*笑*
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的开发者、狂热的追求者和倡导者。