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. 因为如果内核配置文件出错,新内核无法启动,系统将无法使用,直到你能到物理系统前解决问题。除非你绝对确定新内核可以启动,否则最好在能物理访问系统时再安装新内核并重启系统。
53

被折叠的 条评论
为什么被折叠?



