灾难恢复
有些事情出错了。这就是你所知道的全部。盯着空白或乱码的屏幕,你唯一能想到的就是“我现在该怎么办?” 即使你还没有遇到这种情况,但很可能你将会面对它。 尽管 Linux 功能强大,但对于新手——甚至是有经验的用户来说,仍然很容易犯错并搞砸一些事情。
通过一些提前准备,这种情况不会让你束手无策。 确保你知道如何追踪问题,拥有可引导磁盘,并拥有一组为你特定设置配置的急救盘。
你的第一步是追踪问题。 你是否看到了 `Uncompressing Linux...` 消息? 如果没有,你的问题出在启动盘或 LILO 上。 拥有备用启动盘应该可以让你启动系统,然后你可以重新配置 LILO 或制作新的启动盘。
当 Linux 启动时,你是否通过了分区检查? 如果是,那么你的硬盘驱动器可能对 Linux 来说没问题。 我曾经有一个硬盘驱动器,当 Linux 尝试查找分区时,它会让 Linux 挂起。 该驱动器在我测试的任何其他系统中都无法工作,因此该驱动器坏了。
此外,如果你通过了分区检查,那么内核就不是你的问题。 在分区检查完成后,root 被挂载,然后读取 /etc/inittab。 你可能记得,也可能不记得,/etc/inittab 被 init 程序用来启动登录进程,并开始读取你的 /etc/rc 文件以挂载你的分区,启动你的网络以及其他操作。 一旦读取了 inittab,它就会转到相应的文件以挂载额外的文件系统、启动网络服务和其他启动服务。 如果你看到你的文件系统正在被挂载,这意味着你的一些 rc 文件正在被启动。
一旦读取了 inittab,它就会转到相应的启动文件(“rc 文件”)以挂载额外的文件系统、启动网络服务和其他启动服务。 如果你看到你的文件系统正在被挂载,这意味着你的一些 rc 文件正在被启动。
最后,确保你的网络服务正在启动,如果你希望它们在你的系统上启动。 这是启动序列的最后部分之一。
现在,如果你知道自己有问题,你该怎么办? 在你陷入困境之前,请确保你拥有备份。 如果情况变得太糟,你总是可以重新初始化你的分区并从旧备份中恢复。 还要确保手头有你的 /etc 目录的备份。
一个好主意是获取可通过 FTP 获得的急救盘副本。 这些磁盘将允许你从一对软盘启动 Linux 并访问你的大部分分区。 这样,即使你因为错误的 /etc/inittab 文件而无法启动,你仍然可以启动 Linux 并访问错误的文件,然后修复它。
其中一些急救盘是完全预制好的,因此你可以非常轻松地使用急救盘。 这些集合的缺点是它们可能使用较旧的内核,可能缺少你需要的某些组件(例如 SCSI 支持),并且可能没有你希望在急救盘中看到的那组程序。
还有其他一些急救盘集合,你可以指定要包含哪些程序。 它们还使用你正在使用的当前内核版本。 这些的缺点是你需要知道你在做什么,并且它们比仅仅获取预构建的急救盘需要更多的工作。 两个这样的软件包是 SAR(搜索和救援)和 rescue。 这些软件包都很小,因为它们都使用你系统上已有的程序。
如果你有两个软盘驱动器,你可以浏览急救盘,找出你想要添加的程序,例如你最喜欢的编辑器。 通常,一张磁盘可以包含你在发生灾难时需要的所有程序,但拥有两张装满实用程序的磁盘会更好。 方法如下:
首先,将软盘放入你的第二个驱动器。 我的第二个软盘驱动器是 5.25 英寸高清驱动器,因此我将在我的示例中使用它。
fdformat 程序用于低级格式化软盘。 其语法为:
fdformat <device>
其中 <device> 是你正在使用的驱动器的名称和类型。 例如,我有一个高密度 5.25 英寸驱动器作为驱动器 2,所以我的 <device> 将是 /dev/fd1h1200。 高密度 3.25 英寸驱动器将是 /dev/fd1H1440。
现在你需要在其上放置一个文件系统。 使用与你系统根分区上使用的相同的文件系统。 在我的情况下,那将是第二扩展文件系统 (ext2)。 所以,让我们在我的软盘上放置一个文件系统:
mke2fs -c /dev/fd1h1200
如果你的第二个驱动器是 3.5 英寸高密度驱动器,请将 /dev/hd1h1200 替换为 /dev/fd1H1440。
现在你应该在磁盘上有一个文件系统了。 将其挂载到未使用的目录上。 /mnt 目录通常用于此目的。 如果你的系统上不存在 /mnt,请执行:
mkdir /mnt then do mount -t ext2 /dev/fd1 /mnt
你的磁盘现在将被挂载到 /mnt。 此时,开始复制你想要的任何程序。 确保两件事:
确保急救盘上的共享库与你放在磁盘上的程序兼容。
确保你复制了你需要的所有文件。 有些编辑器有你可能需要的配置文件或帮助文件。
如果你正在使用 SAR 或 rescue 等急救盘,你无需担心库,你可以跳过几个段落。 或者你可以阅读它,更好地了解共享库的工作原理。
共享库背后的想法是将许多常见的 C 函数包含在一个公共位置的文件中。 这节省了大量空间,因为这些常用函数不再需要在每个程序二进制文件中重复。 缺点是它稍微慢一点,因为现在必须加载两个文件而不是一个。 为了在速度和大小之间进行权衡,我宁愿选择大小,尤其是在空间非常有限的软盘上。
共享库的另一个小问题是,如果唯一可用的库是旧版本,则为使用新库编译的程序将无法工作。 例如,如果唯一可用的库集是 4.3 版本,则为使用 4.4 版本库编译的程序将无法工作。 你最终会收到有关库不兼容的错误消息。 如果发生这种情况,请获取新版本的库或重新编译程序以使用旧版本的库。
[编者注:这并非完全正确。 使用现代库,用户将收到消息,但如果所有必要的符号都存在,程序仍将尝试运行。 例如,我正在运行一些在 libc 4.5.8 下编译的二进制文件,它们在我的 libc 4.4.4 下运行良好,除了给出错误消息。 我不知道你是否想处理这个问题; 可能不想。]
要检查程序正在查找的库版本,请使用 ldd 命令:
ldd <program>
这将返回程序编译时使用的库版本。 ldd /bin/write 对我来说返回:
libc.so.4 (DLL Jump 4.4pl1)
如果 /lib 目录中的文件是 libc.so.4.4.1 或更高版本,则将 `write` 命令放在你的磁盘上是可以的。 如果所需的库比急救盘上的库更新,那么你需要找到旧版本的程序并将其放在软盘上。 例如,如果急救盘上的库是 libc.so.4.3.1,我需要找到旧版本的 write 放在磁盘上,或者将 libc.so.4.4.1 放在磁盘上。
你不必只将可执行文件放在此磁盘上。 gzip 的副本和一堆 HOWTO 文件也非常有用。 以下是建议的文件列表,所有文件都可以通过 FTP 或许多 BBS 获得。 其中一些文件可能在你的急救盘上。 请确认。
选择以下任何编辑器。 我发现 ed 很小巧紧凑,但在进行大量编辑或处理大型文件时不太好用。 对你来说,joe 可能值得它占用的额外 98k 空间。 如果你不熟悉 joe 或 ed,你可以使用 vi,它是几乎所有 UNIX 系统上的标准程序:joe 编辑器 133kvi 编辑器 101ked 编辑器 35k
常用实用程序:diff 61k(查找大文件中的更改)grep 61kgzip 46klilo 40kMAKEDEV 9kmknod 3k
备份实用程序:这将因你的备份方式而异。 你可能需要 tar、afio 和 ftape 的副本。 获取一些用于你运行的文件系统的实用程序:e2fsck 35kmke2fs 20k
获取一些 HOWTO 文件(用 gzip 压缩以真正节省空间!):Installation-HOWTO 48kSCSI-HOWTO 41kFtape-HOWTO 18k
你还需要准备一份清单,列出你机器中的所有卡、它们使用的 IRQ 以及它们是否被 Linux 使用。 有时问题可能是内核或卡配置不正确。
如果你将这些磁盘放在一边并经常更新,你将为可能发生的任何事情做好准备。
本月提示:当你点击退格键时,你是否看到 /'s 后跟你刚刚退格的字符? 你也很讨厌它,不是吗? 它让我想起了阅读 The Unix Programming Environment。 获取 agetty 的新副本,这应该可以解决问题。 某些 Slackware 发行版附带的副本存在此问题。