为什么定制内核?
任何 Linux 系统的核心是内核本身。这部分讲述编译定制的内核、为什么要定制内核、构建内核的两个基本方法、编译内核的步骤以及应该知晓的各种选项。
一般来说,Linux 的长期用户很少在他们的系统中使用标准内核。这并不是因为多数分发版提供的内核存在严重错误 — 实际上,Red Hat 在他们的产品中提供的内核是稳定的而且“做工精良”,这是妇孺皆知的。问题是,多数主流发行商编译的内核需在尽可能多的体系结构和系统中稳定运行。所以,几乎可以肯定地说,适合于广大用户的内核并不是为您的系统和需求而优化的。
编译定制内核的一些常见理由是:
越少越好:一般来说,为某个系统编译的内核要比标准内核运行得快而且在日常操作中更稳定。
定制的内核往往使用更少的内存。这将减少 I/O 开销(内存中的内核代码从不被转移到交换区),释放系统资源,供其它进程使用。
在标准内核被发布后,定制内核使您能够利用改进的代码、新的驱动程序和错误修正。
当您从内核中除去没用的驱动程序和功能后,新内核自然要比标准内核更安全。
把重要的功能和驱动程序构建到内核中去而不是把它们作为模块装入,这样做能提高系统的响应速度。
很多人不愿编译内核的主要原因很可能是以为编译过程很复杂(或者说可怕)。希望通过学习这部分内容能使您认识到编译过程并不复杂。
两种思路……
在编译内核时有两种基本的思路:基于模块的和单块的。
在单块的内核中,所有的系统服务、功能和驱动程序都被直接构建到内核中。
在与之相对的基于模块的内核中,只有一些关键组件才被构建到内核中,其余的组件将在需要的时候作为模块被装入。
正如 Linux 中的许多其它作法那样,常用的定制方法是两种方法并用。关键的服务和驱动程序被编译到内核中去,较少用到的组件被构建成模块。一般的规律是,为某一个系统构建的内核往往更少使用模块。为多个系统构建的内核往往更多地使用模块。
内核编译概述,
只要您仔细地完成某些步骤,构建内核并不象有些人想象的那样困难。简而言之,构建的步骤如下:
决定构建内核。
下载所需的源代码 tarball 并将它移到 /usr/src。
“cd”至 /usr/src。
为安全起见,删除当前内核源代码的现有的符号链接(symbolic link)( rm -rf /usr/src/linux )。当前内核软件包被解压到名为 /usr/src/linux-kernel-version 的目录,但一些旧的软件包仍按旧的约定被解压到 /usr/src/linux — 这将覆盖现有的 Linux 源代码树。
解压源代码软件包( tar xvzf linux-kernel-version )。
再次创建先前删除的符号链接( ln -sf /usr/src/linux-kernel-version linux )。
“cd”至 /usr/src/linux。
输入 make mrproper 。这个命令将清理源代码树并删除所有旧的目标文件。现有的 .config 文件也将被删除(.config 保存着编译选项),所以,如果您想保存该文件中的设置,请把该文件复制到安全的位置,等 make 进程完成后再把它复制到 /usr/src/linux。
下一页将完成定制过程。
内核编译概述
在前一页,我们已开始构建内核的过程:下载和解压源代码,清理源代码树。在这页中我们将完成构建内核的过程。
根据您偏爱的界面,输入 make config、make menuconfig、make xconfig 或 make oldconfig。make config 是基于控制台的配置过程;make menuconfig 提供基于光标的菜单配置界面;make xconfig 是基于 X-Window 的界面;如果您想用现有的内核配置来构建新的内核而且您只想看到新内核树中存在的新选项,请使用 make oldconfig。
当您作出合适的配置选择后,请输入 make dep ; make clean 。
为了实际构建内核,请输入 make bzImage 或 make install。前一个命令构建内核映象但并不把它安装到 /boot 目录;后一个命令构建并安装内核映象。
如果内核编译时有错误,请输入 make modules && make modules_install。这两个命令将构建并安装所有基于模块的组件。
最后,把新的内核复制到 /boot(如果您使用了 make bzImage 命令)。如果您运行的是 Red Hat 的分发版,那么您还得更新 System.map 和 initrd 映象。别忘了在引导装入程序的配置中加入新的内容,这样做的目的是为了在内核引导失败的情况下使用户仍然能够回到系统中,作出合适的修改。
Red Hat 提供一个综合的实用指南,该指南详细描述了如何编译内核(请参阅参考资料)。对于初次构建 Linux 内核的人来说,这个指南值得一读。
配置窍门和提示
构建优化的 Linux 内核的最重要的步骤是前面提到的 make configure/menuconfig/xconf/oldconfig 过程。在这个过程中,您选择把哪些系统、服务和驱动程序包括在内核中,哪些东西被构建成模块。在这个过程中,最常见的问题是“在配置中包括哪些东西、不包括哪些东西?”和“哪些组件被构建到内核中去、哪些组件被构建成模块?”
对第一个问题的简短回答是“只包括您所需的并使系统按您的要求运行的东西”(别忘了,越少越好)。对于第二个问题,回答是“摸着石子过河”,这有点令人费解。甚至有经验的管理员也未必能够在第一次配置后就能使系统达到最佳性能。如果编译过程失败或者您得到的是无法引导的内核,那么请使用引导装入程序的备用选项,返回系统后仔细检查配置;试试另一组选项。
第二个问题(哪些组件被构建到内核中去、哪些组件被构建成模块?)的回答取决于您将怎样使用系统。还有经验。例如,如果 Maestro3 声音驱动程序被编译到内核中去,那么该驱动程序无法在某些 Dell 笔记本电脑上运行 — 出于某些原因,应该以模块的形式装入这个驱动程序。在其它使用主流硬件的系统中,您可以把任何需要的东西构建到内核中去。在这里,系统配置和经验常常决定了您的选择。
内核配置中的重要选项
为了使初学者熟悉内核配置的过程,下几页将讲述值得注意的一些重要选项,这些选项可能提高或降低系统性能。
在我们开始以前,请注意,在使用 menuconfig 和 xconfig 配置界面的时候,您可以获得大多数选项的描述,方法是选择您有问题的选项,用 Tab 键选中 help 按钮,再按 Enter 键。
还有,不同版本的内核的配置选项是不相同的。如果您在内核中没有看到某个选项而您需要这个功能,那么您有两种选择:试试另一个内核,或者查找合适的 diff 文件,然后手工修补内核。如果您想了解如何使用补丁,请参阅前面提及的 Kernel-HOWTO 文件(请参阅参考资料)。
内核配置选项:代码成熟程度和级别选项
第一个需要注意的选项是列表中的第一个菜单项:Code maturity level options。除非您选择“Prompt for development and/or incomplete code/drivers”,否则您将无法看到许多内核配置选项。
General setup 和 Loadable module support 中的缺省值适合于大多数系统。
在 Processor type and features 中,请注意内核编译的目标处理器的类型(缺省值是 Pentium 3/Celeron)。SMP 是缺省值;如果您在为单处理器系统构建内核,请您取消选择这个选项。当前的内核为“Preempible Kernel”提供支持。请选择这个选项。该功能的描述中说:“在响应实时或交互式事件时,通过使优先级较低的进程失效(即便它在内核模式中执行系统调用),减少内核的等待时间。即使在系统负载不大的时候,该功能也能使应用程序运行地更稳定。”
内核配置选项:电源管理选项
在列表的下面,下一个值得注意的菜单组是 Power management options。一般来说,膝上型电脑的用户至少需要某种形式的电源管理,但在这方面,BIOS 在与操作系统交互时常常会出现问题,这一点是众所周知的。除非您确信您的系统完全支持 ACPI,请使用简单的 APM。除了少数一些笔记本电脑,启用 ACPI 将使所构建的内核在引导时遇到麻烦。对于台式机用户和服务器管理员来说,设置电源管理就象设置“个人偏爱”那样无关紧要。
Bus options 包括对各种总线拓扑结构的支持,例如 PCI、EISA、MCA 和 PCI 热插拔支持。除了一个值得注意的选项外,其它缺省值已被合适地设好。如果您准备使用 PCMCIA 网络或无线卡并计划使用 pcmcia-cs 驱动程序代码而不是 Linux 内核提供的驱动程序,那么请在 Network device support 菜单中禁用 PCMCIA/Cardbus 支持选项但启用 PCMCIA.network device support。
内核配置选项:设备支持选项
配置菜单上的大多数设备支持选项不需要特别的说明:如果您需要某个选项的支持,请选择它;否则就别选它。需要特别说明的是 Network device support。目前的 2.5.x 开发内核在缺省情况下启用一小部分设备,但一些旧的内核缺省地启用许多设备(作为模块)。仔细地查看每个选项,不选所有今后用不到的选项。建议您把一个或两个 EtherExpressPro/100 选项构建到内核中去,因为许多一般的网卡支持这种芯片组,而且准备一个备用网络设备选项是不错的主意。
Filesystems 菜单是另一个需要仔细选择的菜单。如果您选择 ReiserFS 或 EXT3 文件系统,那么必须启用相关的支持并把它构建到内核中去;否则,您的系统将无法引导(在系统初始化时,Linux 必须能访问分区上的文件系统)。建议您选择 EXT2 选项。它所包含的代码相对较少,在出现问题时,内核中的 EXT2 支持可能有用。如果您准备通过 Samba 连接到 Windows 共享文件系统,那么请在 Filesystems-->Network files systems