务必记住,Linux 在文件恢复方面与 MS-DOS 不同。对于 MS-DOS(及其私生子 Windows 95),通常可以相当直接地恢复已删除的文件 - “操作系统”(我在这里用这个术语不太严谨)甚至带有一个实用程序,可以自动完成大部分过程。对于 Linux,情况并非如此。
所以。第一条规则(如果你愿意,可以称之为首要指令)是
保留备份
无论如何。想想你的所有数据。也许,像我一样,你在电脑上保存了多年的电子邮件、联系人、程序、论文。想象一下,如果你的磁盘发生灾难性故障,或者 - 天哪!- 恶意破解者擦除了你的磁盘,你的生活将会天翻地覆。这并非不可能;我曾与许多处于这种情况的人通信。我劝告所有头脑清醒的 Linux 用户去购买一个有用的备份设备,制定一个合理的备份计划,并坚持执行。我自己,我使用第二台机器上的备用硬盘,并定期通过以太网将我的主目录镜像到它上面。有关规划备份计划的更多信息,请阅读 Frisch (1995)(参见 参考书目和致谢 部分)。
在没有备份的情况下,该怎么办?(或者即使有备份:对于重要数据来说,双重保险也不是坏策略。)
尝试将重要文件的权限设置为 440(或更低):拒绝自己对它们的写入权限意味着 rm
在删除之前需要显式确认。(但是,我发现如果我使用 rm -r
递归删除目录,我会在第一次或第二次确认请求时中断程序,并重新发出命令 rm -rf
。)
对于选定的文件,一个好的技巧是在隐藏目录中为它们创建一个硬链接。我曾经听过一个关于系统管理员的故事,他反复意外删除了 /etc/passwd
(从而半破坏了系统)。对此的修复方法之一是执行类似以下的操作(以 root 身份)
# mkdir /.backup
# ln /etc/passwd /.backup
完全删除文件内容需要相当大的努力:如果你说
# rm /etc/passwd
然后
# ln /.backup/passwd /etc
将会检索它。当然,这无助于你覆盖文件的情况,所以无论如何都要保留备份。
在 ext2 文件系统上,可以使用 ext2 属性来保护文件。这些属性通过 chattr
命令进行操作。有一个 “append-only”(只追加)属性:具有此属性的文件可以追加内容,但不能删除,并且文件的现有内容不能被覆盖。如果目录具有此属性,则其中的任何文件或目录都可以像往常一样修改,但不能删除任何文件。“append-only” 属性使用以下命令设置
$ chattr +a FILE...
还有一个 “immutable”(不可变)属性,只能由 root 用户设置或清除。具有此属性的文件或目录不能被修改、删除、重命名或(硬)链接。它可以按如下方式设置
# chattr +i FILE...
ext2fs 还提供了 “undeletable”(不可删除)属性(chattr
中的 +u
)。其目的是,如果删除了具有该属性的文件,它不会被实际重用,而只是被移动到 “安全位置” 以供稍后删除。不幸的是,此功能尚未在主流内核中实现;尽管过去曾有人对实现它感兴趣,但据我所知,它在任何当前的内核中都不可用。
有些人提倡将 rm
设置为 shell 别名或函数,使其等同于 rm -i
(每次删除文件时都会请求确认)。实际上,Red Hat 发行版 默认对所有用户(包括 root 用户)都这样做。就我个人而言,我无法忍受无法无人值守运行的软件,所以我不会这样做。还有一个问题是,迟早你会以单用户模式运行,或者使用不同的 shell,甚至不同的机器,在这些情况下你的 rm
函数不存在。如果你期望被要求确认,很容易忘记你身在何处,并指定要删除的过多文件。同样,各种替换 rm
的脚本和程序,恕我直言,非常危险。
稍微好一点的解决方案是开始使用一个包,该包通过提供一个不名为 rm
的命令来处理 “可回收” 删除。有关这些的详细信息,请参阅 Peek 等人 (1993)(参见 参考书目和致谢 部分)。然而,这些仍然存在一个问题,即它们倾向于鼓励用户对删除采取漫不经心的态度,而不是 Unix 系统上通常需要的谨慎方法。