8.5. 编译新内核

为什么有些人想要编译新内核?Debian 自带的默认内核已经包含了绝大部分配置, 所以编译新内核并不是必需的。然而,基于以下这些理由,编译新内核还是很有用的:

8.5.1. 内核映象管理

不要害怕尝试编译内核。它很有趣而且很合算。

为了以 Debian 的方式编译内核,您需要一些软件包: kernel-packagekernel-source-2.4.27(与此文档写作时间最接近的版本),fakeroot 以及其它一些您可能已经安装过的软件包 (请参阅 /usr/share/doc/kernel-package/README.gz 以获得完整的列表)。

此方法将从您的内核源码创建一个 .deb 文件,并且,如果您有非标准模块, 将同时创建它们的同步依赖 .deb 文件。这是一个管理内核的较好的方法; /boot 目录将保存内核,System.map,以及当前编译的活动配置文件的日志。

注意您不 需要编译内核以 “Debian 方式”;但我们发现使用软件包系统来管理您的内核确实可以更加安全和简单。 事实上,您可以直接从 Linus 那里而不是 kernel-source-2.4.27 得到内核源码,并仍然使用 kernel-package 的编译方法。

注意您可以找到完整的文档,通过使用 kernel-package 它在 /usr/share/doc/kernel-package里。本节只包含一个简单的入门指南。

此后,我们假设您具有操作您机器的权力,可以将内核源码解到您的 home 目录[9]。我们还假设您的内核版本是 "2.4.27。确定您处于打算解开内核源码的目录, 然后使用 tar xjf /usr/src/kernel-source-2.4.27.tar.bz2 解开并进入 kernel-source-2.4.27 刚才创建的目录。

现在,您可以开始配置您的内核了。如果您已经安装配置好,并正在运行 X11, 请执行 make xconfig;否则请执行 make menuconfig(必须已经安装好 libncurses5-dev)。 请花点时间阅读在线帮助并仔细地作选择。如果有疑问,通常来说包含您所不确定的 设备驱动程序 (用来管理硬件外设的软件,例如以太网卡,SCSI 控制器等) 会比较好一点。 注意:对于与特殊硬件无关的其它选项,如果您不了解它们,最好保持默认值。 不要忘记选择 “Kernel module loader” 中的 “Loadable module support” (它们默认并没有被选择)。否则,您的 Debian 安装将会遇到问题。

清除源码树并复原 kernel-package 参数。也就是使用 make-kpkg clean

现在,开始编译内核: fakeroot make-kpkg --revision=custom.1.0 kernel_image。其中版本号 “1.0” 可以随便您修改;它仅是一个用来跟踪您的内核编译的版本号。同样地, 您也可以用任何您喜欢的单词替换 “custom” (例如,您的主机名称)。编译内核可能要花费较长的时间,这取决于您的机器的性能。

如果您需要支持 PCMCIA,您必须安装 pcmcia-source 软件包。以 root 身份将用 gzip 压缩的 tar 文件解压到 /usr/src 目录内(注意模块必须位于它们所应处的位置,即 /usr/src/modules)。然后,以 root 身份执行 make-kpkg modules_image

一旦编译完成,您就可以像安装其它软件包一样安装您的内核。以 root 身份,执行 dpkg -i ../kernel-image-2.4.27-subarchitecture_custom.1.0_i386.deb。其中 subarchitecture 部分是一个可选的子结构, 例如 “i586”, 这取决于您所设置的内核选项。 dpkg -i kernel-image... 将安装内核以及其它的一些支持文件。例如 System.map 可能会被安装 (用来辅助调试内核问题), /boot/config-2.4.27 也将被安装,它包含了您当前的配置。新的 kernel-image-2.4.27 软件包将会自动地使用您的系统上的启动引导器来更新引导区, 因此您不必重新运行启动引导器即可引导系统。 如果您创建了一个模块软件包,例如 PCMCIA,您也必须同时安装该软件包。

下面到了重启系统的时刻了;请仔细阅读前述步骤所产生的所有警告信息, 然后执行 shutdown -r now

欲获得关于 kernel-package 的更多信息,请参阅 /usr/share/doc/kernel-package



[9] 可以在其他目录解开内核源码并 build 自定义内核, 但是不需要额外的权限是最简单的方式。