Alternatively, to load the driver as a module at boot time, place the
following line in loader.conf(5):
if_ath_load="YES"
第 10 章. 配置 FreeBSD 内核
目录
10.1. 概要
内核是 FreeBSD 操作系统的核心。它负责管理内存、执行安全控制、网络、磁盘访问等等。虽然 FreeBSD 的大部分内容都是动态可配置的,但有些用户可能希望配置和编译自定义内核。
阅读完本章后,您将了解
何时构建自定义内核。
如何进行硬件清单。
如何自定义内核配置文件。
如何使用内核配置文件创建并构建新的内核。
如何安装新的内核。
如果出现问题,如何进行故障排除。
本章示例中列出的所有命令都应以root
身份执行。
10.2. 为什么构建自定义内核?
传统上,FreeBSD 使用单内核。内核是一个大型程序,支持固定的设备列表,并且为了更改内核的行为,必须编译然后重新引导到新的内核。
如今,FreeBSD 内核中的大部分功能都包含在模块中,这些模块可以根据需要动态加载和卸载到内核中。这允许正在运行的内核立即适应新硬件,并允许将新功能引入内核。这被称为模块化内核。
偶尔,仍然需要执行静态内核配置。有时,所需的功能与内核紧密相关,无法使其成为动态可加载的。某些安全环境会阻止加载和卸载内核模块,并要求仅将所需的功能静态编译到内核中。
构建自定义内核通常是高级 BSD 用户的必经之路。此过程虽然耗时,但可以为 FreeBSD 系统带来好处。与必须支持各种硬件的GENERIC 内核不同,自定义内核可以精简到仅为计算机的硬件提供支持。这有很多好处,例如
更快的启动时间。由于内核将只探测系统上的硬件,因此系统启动所需的时间可以减少。
更低的内存使用率。通过省略未使用的功能和设备驱动程序,自定义内核通常比GENERIC 内核使用更少的内存。这一点很重要,因为内核代码始终驻留在物理内存中,从而阻止应用程序使用该内存。因此,自定义内核在 RAM 较小的系统中很有用。
额外的硬件支持。自定义内核可以添加对GENERIC 内核中不存在的设备的支持。
构建自定义内核时,请注意,非默认配置的测试不如 GENERIC 配置彻底。虽然自定义内核可以提供特定的好处,但它也增加了遇到构建或运行时问题的风险。仅建议高级用户在有特定修改理由并愿意在必要时参与调试过程的情况下使用自定义内核配置。 |
在构建自定义内核之前,请考虑构建的理由。如果需要特定硬件支持,它可能已经以模块的形式存在。
内核模块存在于/boot/kernel中,可以使用kldload(8)动态加载到正在运行的内核中。大多数内核驱动程序都有一个可加载模块和手册页。例如,ath(4) 无线网络驱动程序在其手册页中包含以下信息
将if_ath_load="YES"
添加到/boot/loader.conf将在启动时动态加载此模块。
在某些情况下,/boot/kernel中没有关联的模块。这主要适用于某些子系统。
10.3. 查找系统硬件
在编辑内核配置文件之前,建议对机器的硬件进行清单。在双引导系统上,可以从另一个操作系统创建清单。例如,Microsoft® 的设备管理器包含有关已安装设备的信息。
某些版本的 Microsoft® Windows® 具有一个系统图标,可用于访问设备管理器。 |
如果 FreeBSD 是唯一安装的操作系统,请使用dmesg(8)确定在引导探测期间找到并列出的硬件。FreeBSD 上的大多数设备驱动程序都有一个手册页,其中列出了该驱动程序支持的硬件。例如,以下行表示psm(4)驱动程序找到了一只鼠标
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0
由于此硬件存在,因此不应从自定义内核配置文件中删除此驱动程序。
如果dmesg
的输出未显示引导探测输出的结果,请改读/var/run/dmesg.boot的内容。
另一个查找硬件的工具是pciconf(8),它提供更详细的输出。例如
% pciconf -lv
ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
vendor = 'Atheros Communications Inc.'
device = 'AR5212 Atheros AR5212 802.11abg wireless'
class = network
subclass = ethernet
此输出显示ath驱动程序找到了一个无线以太网设备。
man(1)的-k
标志可用于提供有用的信息。例如,它可用于显示包含特定设备品牌或名称的手册页列表
# man -k Atheros
ath(4) - Atheros IEEE 802.11 wireless network driver
ath_hal(4) - Atheros Hardware Access Layer (HAL)
创建硬件清单后,请参考它以确保在编辑自定义内核配置时不会删除已安装硬件的驱动程序。
10.4. 配置文件
为了创建自定义内核配置文件并构建自定义内核,必须首先安装完整的 FreeBSD 源代码树。
如果/usr/src/不存在或为空,则表示尚未安装源代码。可以使用 Git 按照“使用 Git”中的说明安装源代码。
安装源代码后,查看/usr/src/sys的内容。此目录包含许多子目录,包括表示以下受支持体系结构的子目录:amd64、i386、powerpc和sparc64。特定体系结构目录内的所有内容都只处理该体系结构,其余代码是所有平台通用的机器无关代码。每个受支持的体系结构都有一个conf子目录,其中包含该体系结构的GENERIC内核配置文件。
不要对GENERIC进行编辑。相反,将文件复制到另一个名称,并对副本进行编辑。约定是使用全大写字母的名称。在维护具有不同硬件的多个 FreeBSD 机器时,最好以机器的主机名命名它。此示例创建了一个名为MYKERNEL的副本,它是amd64
体系结构的GENERIC配置文件
# cd /usr/src/sys/amd64/conf
# cp GENERIC MYKERNEL
MYKERNEL现在可以使用任何ASCII
文本编辑器进行自定义。默认编辑器是 vi,但 FreeBSD 还安装了一个更易于初学者使用的编辑器,称为 ee。
内核配置文件的格式很简单。每一行包含一个表示设备或子系统的关键字、一个参数和一个简短的描述。#
后的任何文本都被视为注释并被忽略。要删除对设备或子系统的内核支持,请在表示该设备或子系统的那一行的开头加上#
。不要在你不理解的任何行添加或删除#
。
删除对设备或选项的支持并最终导致内核损坏很容易。例如,如果从内核配置文件中删除了ata(4)驱动程序,则使用 |
除了此文件中提供的简短描述外,其他描述还包含在NOTES中,可以在与该体系结构的GENERIC相同的目录中找到。对于体系结构无关的选项,请参考/usr/src/sys/conf/NOTES。
自定义内核配置文件完成后,将备份副本保存到/usr/src外部的位置。 或者,将内核配置文件保留在其他位置,并创建一个指向该文件的符号链接
|
配置文件中可以使用include
指令。这允许将另一个配置文件包含在当前文件中,从而可以轻松地维护相对于现有文件的少量更改。如果只需要少量附加选项或驱动程序,则可以相对于GENERIC维护一个增量,如本例所示
include GENERIC ident MYKERNEL options IPFIREWALL options DUMMYNET options IPFIREWALL_DEFAULT_TO_ACCEPT options IPDIVERT
使用此方法,本地配置文件表达了与GENERIC内核的本地差异。在执行升级时,添加到GENERIC的新功能也将添加到本地内核,除非使用nooptions
或nodevice
明确阻止它们。可以在config(5)中找到配置指令及其描述的完整列表。
要构建包含所有可用选项的文件,请以
|
10.5. 构建和安装自定义内核
保存对自定义配置文件的编辑后,可以使用以下步骤编译内核的源代码
过程:构建内核
更改到此目录
# cd /usr/src
通过指定自定义内核配置文件的名称来编译新内核
# make buildkernel KERNCONF=MYKERNEL
安装与指定的内核配置文件关联的新内核。此命令会将新内核复制到/boot/kernel/kernel,并将旧内核保存到/boot/kernel.old/kernel
# make installkernel KERNCONF=MYKERNEL
关闭系统并重新引导到新内核。如果出现问题,请参考内核无法启动。
默认情况下,编译自定义内核时会重新构建所有内核模块。为了更快地更新内核或仅构建自定义模块,请在开始构建内核之前编辑/etc/make.conf。
例如,此变量指定要构建的模块列表,而不是使用构建所有模块的默认设置。
MODULES_OVERRIDE = linux acpi
或者,此变量列出要从构建过程中排除的模块。
WITHOUT_MODULES = linux acpi sound
还有其他可用的变量。有关详细信息,请参阅make.conf(5)。
10.6. 如果出现问题
构建自定义内核时可能会出现四类问题。
config
失败如果
config
失败,它将打印错误的行号。例如,对于以下消息,请确保通过将其与GENERIC或NOTES进行比较,第 17 行键入正确。config: line 17: syntax error
make
失败如果
make
失败,通常是由于内核配置文件中存在错误,而该错误不足以使config
捕获。检查配置,如果问题不明确,请发送电子邮件到FreeBSD 通用问题邮件列表,其中包含内核配置文件。
- 内核无法启动
如果新内核无法启动或无法识别设备,请不要惊慌!幸运的是,FreeBSD 拥有一个出色的机制来从不兼容的内核中恢复。只需在 FreeBSD 启动加载程序中选择要启动的内核即可。当系统启动菜单出现时,可以通过选择“转到加载程序提示符”选项来访问它。在提示符下,键入
boot kernel.old
,或任何已知可以正常启动的其他内核的名称。使用良好内核启动后,检查配置文件并尝试再次构建它。一个有用的资源是/var/log/messages,它记录了每次成功启动的内核消息。此外,dmesg(8)将打印当前启动的内核消息。
在对内核进行故障排除时,请确保保留已知可工作的内核的副本,例如GENERIC。这很重要,因为每次安装新内核时,kernel.old都会被最后一个安装的内核覆盖,该内核可能可启动也可能不可启动。尽快通过重命名包含良好内核的目录来移动工作内核。
# mv /boot/kernel /boot/kernel.bad # mv /boot/kernel.good /boot/kernel
- 内核工作,但ps(1) 不工作
如果内核版本与系统实用程序构建的版本不同,例如,在 -RELEASE 系统上安装了从 -CURRENT 源代码构建的内核,则许多系统状态命令(如ps(1) 和vmstat(8))将无法工作。要解决此问题,请重新编译并安装一个与内核相同的源代码树版本构建的世界。使用与操作系统其余部分不同的内核版本绝不是一个好主意。
上次修改时间:2024 年 10 月 2 日,作者:Ed Maste