Linux 软件包包含 Linux 内核。
构建内核涉及几个步骤——配置、编译和安装。阅读README内核源代码树中的文件,了解本书配置内核的替代方法。
通过运行以下命令准备编译
make mrproper
这确保内核树是绝对干净的。内核团队建议在每次内核编译之前发出此命令。不要依赖于解压后源代码树是干净的。
如果在 第 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.
通过菜单驱动的界面配置内核。BLFS 包含有关 LFS 之外软件包的特定内核配置要求的信息,网址为 http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index
make menuconfig
或者,在某些情况下,make oldconfig 可能更合适。请参阅README文件以获取更多信息。
如果需要,可以通过复制内核配置文件来跳过内核配置,.config,从宿主系统(假设可用)复制到解压后的linux-2.6.11.12目录。但是,我们不建议使用此选项。通常最好浏览所有配置菜单并从头开始创建内核配置。
NPTL 要求内核使用 GCC-3.x 或更高版本编译,在本例中为 3.4.3。不建议使用 GCC-2.95.x 编译内核,因为这会导致 Glibc 测试套件失败。通常,由于 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 检测到。请注意,
文件中的如下语句不适用于 Udev/etc/modprobe.conffile do not work with 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
内核配置文件.config由上面 make menuconfig 步骤生成的文件包含刚刚编译的内核的所有配置选择。最好保留此文件以供将来参考
cp -v .config /boot/config-2.6.11.12
重要的是要注意,内核源代码目录中的文件不归 root 所有。每当软件包以用户 root 身份解压时(就像我们在 chroot 内部所做的那样),文件都具有打包者计算机上的用户和组 ID。对于要安装的任何其他软件包,这通常不是问题,因为源代码树在安装后被删除。但是,Linux 源代码树通常会保留很长时间。因此,打包者使用的任何用户 ID 都有可能分配给机器上的某个人。然后,该人将拥有内核源代码的写入权限。
如果要保留内核源代码树,请在linux-2.6.11.12目录上运行 chown -R 0:0,以确保所有文件都归用户 root 所有。
一些内核文档建议从/usr/src/linux创建一个指向内核源代码目录的符号链接。这特定于 2.6 系列之前的内核,并且 绝不能 在 LFS 系统上创建,因为它可能会给您在基本 LFS 系统完成后可能希望构建的软件包带来问题。
此外,系统include目录中的头文件应始终是编译 Glibc 所针对的头文件,即来自 Linux-Libc-Headers 软件包的头文件,因此绝不应被内核头文件替换。