Linux 内核软件包包含内核源代码及其头文件。
编译内核包含几个步骤(配置、编译和安装)请阅读内核源码树里的 README 文件,选择不同于本书的其它配置内核的方式。
运行下面的命令做编译前的准备:
make mrproper
这样可以确保内核源码树是绝对干净的,内核开发组推荐每次编译内核之前都先运行这个命令。请不要以为解包后内核源码树自动就是干净的。
如果在 Section 7.6. "配置 Linux 控制台" 中决定了要把键盘映射表编入内核,请运行下面的命令:
loadkeys -m /usr/share/kbd/keymaps/[path to keymap] > \ drivers/char/defkeymap.c
例如,如果您使用荷兰语键盘,请使用 /usr/share/kbd/keymaps/i386/qwerty/nl.map.gz 。
通过菜单界面配置内核:
make menuconfig
BLFS 有一些关于 LFS 之外的一些软件包的特别的内核配置需求,具体参见这里:http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index 。另外,在某些情况下 make oldconfig 可能是更恰当的,请参考 README 以获得更多信息。
如果您愿意,可以跳过配置内核的步骤,直接把宿主系统里的内核配置文件 .config(如果存在的话)复制到解压后的 linux-2.6.11.12 目录下。当然,我们不推荐这样做,考察全部的配置菜单并从头开始创建内核配置是更好的办法。
NPTL 的支持要求内核使用 GCC-3.x 及以上的版本编译,在这本书里是GCC-3.4.3 。不推荐使用 GCC-2.95.x ,因为它会导致 Glibc 测试套件失败并且在 LFS Book 中不会提及这样的失败,因为 LFS 不是用 GCC-2.95.x 创建的。很不幸,内核文档相当陈旧,还在建议使用 GCC-2.95.3 作为编译器。
编译内核镜像和模块:
make
如果使用内核模块,就需要 /etc/modprobe.conf 文件。关于模块和内核配置的信息请参考 linux-2.6.11.12/Documentation 目录下的内核文档,modprobe.conf(5) 也是有用的。
阅读其它文档的时候请小心,因为它们通常只适用于 2.4.x 版本的内核。据我们所知,关于 Hotplug 和 Udev 的内核配置问题还没有文档说明。这个问题是这样的:如果 Hotplug 或用户写的脚本把模块插入内核,Udev 只创建了一个设备节点,而且不是所有模块都可以被 Hotplug 检测到。请注意,/etc/modprobe.conf 文件里像下面这样的语句在 Udev 下是不起作用的:
alias char-major-XXX some-module
因为 Hotplug、Udev 和模块的复杂性,我们强烈推荐您从完全非模块化的内核配置开始,特别是第一次使用 Udev 的时候。
如果内核配置了模块,就安装它们:
make modules_install
内核编译完之后,还需要一些步骤来完成安装,有些文件要复制到 /boot 目录里去。
内核镜像文件所在的路径根据您使用的平台不同而不同,x86平台上请运行下面的命令安装内核:
cp -v arch/i386/boot/bzImage /boot/lfskernel-2.6.11.12
System.map 是内核的符号文件,它映射了每个内核 API 函数的入口,以及运行中内核数据结构的地址。请运行下面的命令安装这个文件:
cp -v System.map /boot/System.map-2.6.11.12
上面 make menuconfig 这一步产生的内核配置文件 .config 包含了刚才编译的内核的全部配置选项,保留这个文件以备将来参考:
cp -v .config /boot/config-2.6.11.12
很重要的一点是要注意到内核源码目录里的文件所有者不是 root 。只要是用 root 用户解压软件包(像我们在 chroot 环境里做的那样),解压出来的文件的用户和组 ID 是这个软件包打包者计算机上的用户和组 ID,对于其它软件包,这通常不是问题,因为安装完这些软件包之后源码目录就删除了,但是 Linux 内核源码树常常会保存很长的时间,这样就有可能打包者的用户 ID 和您计算机上某个用户的 ID 相同,从而让您计算机上的这个用户获得了内核源码的写权限。
如果您准备保留内核源代码,在 linux-2.6.11.12 目录下运行 chown -R 0:0 命令以确保全部文件的所有者是 root 。
一些内核文档推荐创建一个从 /usr/src/linux 指向内核源代码目录的符号连接。这只是一个对 2.6 以前版本内核的特殊要求,并且在 LFS 系统上是 不允许 这样做的,因为这样做会导致你的基本 LFS 系统安装好以后再安装别的软件包的时候导致问题。
另外,系统 include 目录下的头文件应当 永远 保持 Glibc 在编译时使用的那个版本,也就是 Linux-Libc-Headers 包中的那个版本。决不要 使用内核包中的头文件。