在构建启动盘时,最初几次尝试通常无法启动。构建根磁盘的一般方法是从现有系统中组装组件,并尝试使基于软盘的系统达到在控制台上显示消息的程度。一旦它开始与你对话,战斗就成功了一半,因为你可以看到它抱怨什么,并且你可以修复个别问题,直到系统平稳运行。如果系统只是挂起且没有解释,那么找到原因可能很困难。调查系统无法与你对话的问题的推荐步骤如下
你可能会看到类似这样的消息
Kernel panic: VFS: Unable to mount root fs on XX:YY |
如果你看到很多类似这样的错误
end_request: I/O error, dev 01:00 (ramdisk), sector NNN |
Ramdisk driver initialized : 16 ramdisks of 4096K size |
检查根磁盘是否实际包含你认为它包含的目录。很容易在错误的级别复制,最终得到类似这样的东西/rootdisk/bin而不是/bin在你的根软盘上。
检查是否存在/lib/libc.so,其链接与你的/lib目录中硬盘上的链接相同。
检查你的现有系统中的/dev目录中的任何符号链接是否也存在于你的根软盘文件系统上,其中这些链接指向你已包含在根软盘中的设备。特别是,/dev/console链接在许多情况下是必不可少的。
检查你是否已包含/dev/tty1, /dev/null, /dev/zero, /dev/mem, /dev/ram和/dev/kmem文件。
检查你的内核配置——必须内置对登录点之前所有所需资源的支持,而不是模块。因此,必须内置内存盘和 ext2 支持。
检查你的内核根设备和内存盘设置是否正确。
一旦涵盖了这些一般方面,以下是一些更具体的文件要检查
确保包含 init 作为/sbin/init或/bin/init。确保它是可执行的。
运行 ldd init 以检查 init 的库。通常这只是libc.so,但无论如何都要检查。确保你包含了必要的库和加载器。
确保你拥有适用于你的库的正确加载器——ld.so用于 a.out 或ld-linux.so用于 ELF。
检查/etc/inittab在你的启动盘文件系统上,查找对 getty(或某些类似 getty 的程序,例如 agetty、mgetty 或 getty_ps)的调用。对照你的硬盘inittab仔细检查这些。查看你使用的程序的手册页,以确保这些有意义。inittab可能是最棘手的部分,因为它的语法和内容取决于所使用的 init 程序和系统的性质。解决它的唯一方法是阅读 init 和inittab的手册页,并弄清楚你的现有系统在启动时到底在做什么。检查以确保/etc/inittab有一个系统初始化条目。这应该包含一个命令来执行系统初始化脚本,该脚本必须存在。
与 init 一样,在你的 getty 上运行 ldd 以查看它需要什么,并确保必要的库文件和加载器已包含在你的根文件系统中。
确保你已包含一个 shell 程序(例如,bash 或 ash),该程序能够运行你的所有 rc 脚本。
如果你的救援磁盘上有/etc/ld.so.cache文件,请重新制作它。
如果 init 启动,但你收到类似这样的消息
Id xxx respawning too fast: disabled for 5 minutes |
如果你获得登录提示,并且你输入了有效的登录名,但系统立即提示你输入另一个登录名,则问题可能出在 PAM 或 NSS 上。请参阅第 4.4 节。问题也可能是你使用了影子密码,但没有复制/etc/shadow到你的启动盘。
如果你尝试运行某些可执行文件,例如 df,它在你的救援磁盘上,但你得到类似这样的消息df: not found,请检查两件事:(1)确保包含二进制文件的目录在你的 PATH 中,并且(2)确保你拥有程序需要的库(和加载器)。