19、FreeBSD自定义内核构建指南

FreeBSD自定义内核构建指南

1. 构建自定义内核的原因

在某些情况下,你可能需要构建自定义内核,一般有以下四个原因:
- 升级到了FreeBSD的新版本,需要重新构建内核以与新版本同步。
- 需要对内核应用补丁来修复漏洞或安全问题。
- 想要移除对不需要的设备的支持,以减小内核的占用空间。
- 想要在内核中添加对某个设备的支持,且不想或不能使用动态加载模块。

2. 内核配置文件

内核配置由一个纯文本文件处理,该文件位于 /usr/src/sys/i386/conf 目录下。用于构建默认内核的配置文件名为 GENERIC ,不要直接编辑该文件,而是复制一份。你可以给副本取任何名字,常见的命名方式是使用系统在网络上的主机名。如果不在网络中,可以发挥创意,或者简单地命名为 MYKERNEL 等。例如:

cp GENERIC MYKERNEL

注意,你需要以root身份登录才能复制和修改该文件。

3. 编辑配置文件

复制文件后,用文本编辑器打开副本。文件顶部在几个以井号 # 开头的注释之后,会看到以下内容:

machine        i386
cpu        I486_CPU
cpu        I586_CPU
cpu        I686_CPU
  • 第一行指定了机器类型,除非为Alpha系统编译内核(目前FreeBSD仅对其有生产稳定版本支持),否则无需更改。
  • 接下来三行提供了对不同代处理器的支持。默认内核支持从486到最新的奔腾4和AMD Athlon处理器。在自定义内核中,你需要移除对没有的处理器的支持。例如,如果你使用奔腾3或奔腾4,可以移除除 I686_CPU 之外的所有 cpu 行。可以在这些行前加 # 来注释掉它们,而不是直接删除。

不同CPU厂商的命名方案可能会导致混淆,以下是一些准则:
| CPU类型 | FreeBSD对应类型 |
| ---- | ---- |
| 原始奔腾处理器 | I586 |
| 奔腾2 - 奔腾4处理器 | I686 |
| Cyrix 686 | I586 |
| AMD K6处理器 | I586 |
| AMD Athlon处理器 | I686 |

如果安装的内核不支持你的CPU类型,系统将无法启动。

还有一些重要的行可能需要更改:
- ident GENERIC :这是内核的名称,应与新创建文件的名称相同。
- maxusers 32 :该选项名称容易引起混淆,它与系统允许的最大用户数无关,实际上控制着重要系统参数中的可用资源数量。如果将 maxusers 设置为1,FreeBSD将自动管理可用资源数量。
- device npx0 at nexus? port IO_NPX irq 13 :该选项提供浮点支持,不能移除,因为内核没有它无法启动。
- #makeoptions DEBUG=-g :默认情况下该选项被注释掉。普通用户通常应保持原样,调试符号会大大增加内核大小,仅在排查内核问题时需要。
- options MATH_EMULATE :除非使用没有数学协处理器的古老386系统或486SX,否则可以注释掉该行。如果没有数学协处理器(奔腾及更高CPU都有),应将此选项更改为 GPL_MATH_EMULATE ,因为GPL数学例程比默认的FreeBSD例程更准确。

设备行是内核配置中需要进行大部分更改的地方。可以移除对不需要的设备的支持,也可以添加对默认内核不支持的设备的支持。例如,移除对不需要的网卡的支持;如果有某个被注释掉的设备且需要启用它,可移除设备前的 # 。还可以添加未列出的设备支持,如添加对大多数常见声卡的支持,可添加以下行:

device        pcm

4. NOTES文件

在与内核配置文件相同的目录下,有一个名为 NOTES 的文件。该文件包含所有可能的选项和设备列表,以及解释它们用途的注释,还包含设备提示。

在该目录下输入 make lint 命令会创建一个名为 LINT 的内核配置文件,该文件包含所有可能的设备和选项。但不要用 LINT 文件构建内核,因为构建出的内核会很大,且可能无法启动,甚至可能无法编译。

5. 构建新内核

编辑并保存自定义内核配置文件后,就可以构建新内核了。切换回 /usr/src 目录,使用以下命令:

make buildkernel KERNCONF=MYKERNEL

MYKERNEL 应替换为实际使用的自定义内核配置文件的名称。

输入命令后,FreeBSD会先检查内核配置文件是否有效。如果文件中有非法选项或格式错误,FreeBSD会提示你,然后停止进程,你需要回去修复问题,之后再次运行上述命令。

如果配置文件没有问题,FreeBSD将开始构建新内核。过程中屏幕上会显示很多C编译器的消息,无需担心这些消息的含义。在速度适中的系统上,构建新内核大约需要15分钟,速度极快的系统所需时间会更短,极慢的系统则需要更长时间。构建完成后,会返回到命令提示符。

graph TD;
    A[编辑并保存自定义内核配置文件] --> B[切换到/usr/src目录];
    B --> C[执行make buildkernel KERNCONF=MYKERNEL命令];
    C --> D{检查配置文件是否有效};
    D -- 是 --> E[开始构建新内核];
    D -- 否 --> F[修复配置文件问题];
    F --> C;
    E --> G[构建完成,返回命令提示符];

6. 安装新内核

构建过程完成并返回命令提示符后,新内核已构建完成,但尚未实际安装。安装新内核后,需要重启系统才能使新内核加载并运行系统。此时确保你可以物理访问系统非常重要,因为如果内核配置文件出错,新内核无法启动,系统将无法使用,直到你能到物理系统前解决问题。除非你绝对确定新内核可以启动,否则最好在能物理访问系统时再安装新内核并重启系统。

使用以下命令安装新内核:

make installkernel KERNCONF=MYKERNEL

同样, MYKERNEL 应替换为你自定义内核配置文件的名称。安装过程会导致两件主要的事情发生:
- 新内核将被复制到 /boot 目录并命名为 kernel
- 旧内核将被复制到 /boot/kernel.old ,为你提供一个已知可用的救援内核。如果新内核无法启动,你可以使用这个救援内核重启系统,然后修复阻止新内核启动的问题。

需要注意的是,每次安装新内核时,当前安装的内核都会被复制到 /boot/kernel.old 。这意味着如果你搞砸了内核配置,创建了一个无法启动的内核,下次安装内核时,这个损坏的内核会被复制到 kernel.old 。如果新创建的内核无法启动,你就会陷入困境,因为此时 kernel kernel.old 都损坏了。因此,如果你不得不使用 kernel.old 启动并修复新内核的问题,最好将 kernel.old 复制到其他名称(例如 kernel1.old ),以确保即使第二个内核无法启动,你仍然有一个可启动的内核。

安装过程完成后,你可以重启系统以启动新内核。如果一切顺利,系统重启时应该会显示你自定义内核的名称以及创建时间。

graph TD;
    A[新内核构建完成] --> B[执行make installkernel KERNCONF=MYKERNEL命令];
    B --> C{安装是否成功};
    C -- 是 --> D[新内核复制到/boot/kernel];
    C -- 是 --> E[旧内核复制到/boot/kernel.old];
    D --> F[重启系统];
    E --> F;
    C -- 否 --> G[检查并解决安装问题];
    G --> B;

7. 从失败的内核构建中恢复

在尝试构建新内核时,可能会出现以下几种问题及解决方法:

7.1 重启后出现“Kernel panic!”消息

这是最严重的问题之一。内核构建和安装正常,但重启后“崩溃”。重启时可能会出现“Kernel panic!”错误消息,随后是简短的错误描述,系统可能会自动重启或停止。不过,你不必惊慌,因为安装新内核时创建了备份内核,可以使用它启动系统,然后修复阻止新内核启动的问题。

要从旧内核启动,若系统未自动重启则手动重启。在倒计时10秒的提示处,按任意键中断启动过程,然后在提示处输入以下命令:

boot /boot/kernel.old

如果需要启动其他内核,只需将 kernel.old 替换为所需内核的名称,例如 kernel1.old 。内核启动完成后,重新开始内核配置步骤。

7.2 重启后系统挂起

另一个可能出现的问题是内核在启动过程中挂起而不是崩溃。这种情况下,你可以重启系统,按照上述从旧内核启动的步骤操作。还有一种可能是内核并非挂起,而是在尝试探测你没有的设备,这种情况下内核可能会等待很长时间才继续启动,屏幕上的消息应该能帮助你找出导致问题的设备。

7.3 内核构建失败并出现“* Error code”消息

构建过程可能会因错误消息而中断,最常见的是“* Error code 1”。这意味着内核源代码本身存在问题。此时,尝试使用最后一条编译器消息找出出错时正在编译的模块。如果你不是程序员,最好的办法可能是将错误消息和最后几行内容发布到FreeBSD - questions邮件列表并寻求帮助。在此之前,如果你更新到了较新的源代码树,确保检查freebsd - stable邮件列表,看是否有当前内核编译可能失败的警告。如果有,等待列表上发布清除警告的消息,再次更新源代码树,然后重新开始。

另一种可能看到的编译器错误消息是信号11错误,这是一种内部编译器错误,通常更难追踪。它可能是由不稳定的硬件引起的,常见的原因是坏的RAM。记录信号11错误发生的位置,然后尝试重新构建内核。如果信号11错误在不同的位置再次出现,几乎可以肯定是硬件问题。

7.4 某些系统实用程序停止工作

你可能会遇到的另一个问题是,某些系统实用程序(如 ps )在新内核下停止工作。这通常是因为内核与系统的其他部分不同步。如果你将源代码树更新到了FreeBSD的新版本,但没有重新构建系统,就会出现这种情况。此时,内核是用较新的源代码构建的,而系统的其他部分是用较旧的源代码构建的。你需要重新构建系统的其他部分,使其与新内核同步。

8. 总结

通过上述内容,你了解了构建自定义内核的原因、内核配置文件的编辑方法、新内核的构建和安装过程,以及在构建过程中出现问题时的恢复方法。掌握这些知识,你可以根据自己的需求定制适合的FreeBSD内核。

9. 测验

以下测验问题旨在测试你对内核和内核配置的理解:
1. 内核提供以下所有功能,除了:
A. 控制对系统资源的访问
B. 提供基本的网络服务
C. 为用户提供与系统交互的界面
D. 提供支持多个用户使用系统的功能
2. 内核配置文件位于哪个目录?
A. /usr/src/sys/i386/conf
B. /etc/kernel.conf
C. /boot/kernel
D. /usr/src/kern
3. 你可以通过中断系统启动并输入以下命令来加载备份内核:
A. start /boot/kernel.old
B. load /boot/kernel.old
C. boot /boot/kernel.old
D. kernel = /boot/kernel.old
4. 构建新内核的命令是:
A. make kernel kernconf=MYKERNEL
B. make buildkernel kernconf=MYKERNEL
C. make MYKERNEL build
D. 以上都不是
5. 为什么在安装新内核时确保你可以物理访问系统很重要?

测验答案:
1. C
2. A
3. C
4. B
5. 因为如果内核配置文件出错,新内核无法启动,系统将无法使用,直到你能到物理系统前解决问题。除非你绝对确定新内核可以启动,否则最好在能物理访问系统时再安装新内核并重启系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值