8.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"
在 /boot/loader.conf 中添加if_ath_load="YES"
将在启动时动态加载该模块。
在某些情况下,/boot/kernel 没有相关的模块。对于某些子系统来说,这是基本正确的。