10.2.为什么要编译自定义内核

传统上,FreeBSD 使用宏内核。内核是一个庞大的程序,有一个固定支持的设备列表,为了改变内核的行为,必须编译并重新启动到新内核中。

如今,FreeBSD 内核中的大多数功能都包含在可以根据需要动态加载和卸载的模块中。这使得运行中的内核可以立即适应新的硬件,并将新功能引入内核。这被称为模块化内核。

有时仍然需要执行静态内核配置。因为所需的功能与内核紧密关联,无法以动态加载的方式提供。或者一些安全环境禁止加载和卸载内核模块,要求只有仅需要的功能静态编译到内核中。

对于高级的 BSD 用户来说,构建自定义内核通常是一种成年礼。尽管这个过程很费时,但可以为 FreeBSD 系统提供一些好处。与必须支持各种硬件的 GENERIC 内核不同,自定义内核可以简化为仅提供对该计算机硬件的支持。这有许多好处,例如:

  • 启动时间更快。由于内核只会探测系统上的硬件,系统启动所需的时间可以减少。

  • 内存使用更低。通过省略未使用的功能和设备驱动程序,自定义内核通常使用的内存比 GENERIC 内核少。这很重要,因为内核代码始终驻留在物理内存中,阻止该内存被应用程序使用。因此,在只有小内存的系统上,自定义内核很有用。

  • 额外的硬件支持。自定义内核可以为 GENERIC 内核中不存在的设备添加支持。

在构建自定义内核之前,请考虑这样做的原因。如果需要特定的硬件支持,可能已经作为一个模块而存在。

内核模块存在于 /boot/kernel 中,并且可以使用 kldload(8) 动态加载到运行中的内核。大多数内核驱动程序都有可加载的模块和手册页。例如,ath(4) 无线网络驱动程序在其手册页中有以下信息:

Alternatively, to load the driver as a module at boot time, place the
following line in loader.conf(5):

    if_ath_load="YES"

if_ath_load="YES" 添加到 /boot/loader.conf 将在启动时动态加载此模块。

在某些情况下,/boot/kernel 中没有关联的模块。这在某些子系统中通常是正确的。

最后更新于

FreeBSD 中文社区