8.6. 如果出现问题怎么办

在定制一个内核时,可能会出现五种问题。它们是:

config失败:

如果 config(8) 在给出您的内核描述时失败, 则可能在某些地方引入了一处小的错误。 幸运的是, config(8) 会显示出它遇到问题的行号, 这样您就能够迅速地定位错误。 例如, 如果您看到:

config: line 17: syntax error

可以通过与 GENERIC 或其他参考资料对比, 来确定这里的关键词是否拼写正确。

make失败:

如果 make 命令失败, 它通常表示内核描述中发生了 config(8) 无法找出的的错误。 同样地, 仔细检查您的配置, 如果仍然不能解决问题, 发一封邮件到 FreeBSD 一般问题邮件列表 并附上您的内核配置, 则问题应该很快就能解决。

安装新内核失败:

如果内核编译得很顺利, 但安装失败 (即 make installmake installkernel 命令失败), 第一件事是检查您的系统是否是以 1 或更高的安全级运行的 (参见 init(8))。 内核安装过程将尝试去掉原有内核的 immutable (不可改) 标志, 并在新的内核上设置它。 由于安全级 1 或更高的安全级会阻止修改系统中任何文件的这个标志, 因此安装内核需要 0 或者更低的安全级。

不过这只对 FreeBSD 4.X 以及更早的版本有效。 FreeBSD 5.X 以及之后的版本并不会给内核设置不可改标志, 因此安装失败可能说明发生了更深层次的问题。

内核无法启动:

如果您的内核无法启动, 或不识别您的设备, 千万别慌! 非常幸运的是, FreeBSD 有一个很好的机制帮助您从不兼容的内核恢复。 在 FreeBSD 启动加载器那里简单地选择一下要启动的内核就可以了。 当系统在引导菜单的 10 秒倒计时时进入它。 按下除了 Enter 之外的任意键, unload 然后输入 boot /boot/kernel.old/kernel, 或者其他任何一个可以正确引导的内核即可。 当重新配置内核时, 保持一个已经证明能够正常启动的内核永远是一个好习惯。

当使用好的内核启动之后您可以检查配置文件并重新尝试编译它。 比较有用的资源是 /var/log/messages 文件, 它会记录每次成功启动所产生的所有内核消息。 此外, dmesg(8) 命令也会显示这次启动时产生的内核消息。

Note: 如果在编译内核时遇到麻烦, 请务必保留一个 GENERIC 或已知可用的其他内核, 并命名为别的名字以免在下次启动时被覆盖。 不要依赖 kernel.old 因为在安装新内核时, kernel.old 会被上次安装的那个可能不正常的内核覆盖掉。 另外, 尽快把可用的内核挪到 /boot/kernel 否则类似 ps(1) 这样的命令可能无法正常工作。 为了完成这一点, 需要修改目录的名字:

# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel

对于 FreeBSD 5.X 之前的版本, 正确的 “解除” make 所实施的保护的命令 (为了把另一个内核永久性地挪回来) 是:

# chflags noschg /kernel

如果您发现您不能这样做,您的系统的安全级别可能大于0了。在/etc/rc.conf里面编辑 kern_securelevel并把它设置为-1然后重启。 当您很满意这个内核的时候,您可以再把设置改回去。

另外,如果您要“锁住”内核或其他文件,以致它不能被移动或修改, 可以用下面的命令:

# chflags schg /kernel
内核工作,但是ps(1)根本不工作:

如果您安装了一个与系统中内建工具版本不同的内核, 例如在 4.x 系统上安装了 5.x 的内核, 许多用于检查系统状态的工具如 ps(1)vmstat(8) 都将无法正常使用。 您应该 重新编译一个和内核版本一致的系统。 这也是为什么一般不鼓励使用与系统其他部分版本不同的内核的一个主要原因。