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