Linux 内核软件包包含内核源代码及其头文件。
编译内核包含几个步骤——配置、编译和安装。阅读内核源码树里的 README
文件可选择不同于本书的配置内核的其他方法。
运行下面的命令准备编译:
make mrproper
这样可确保内核树绝对干净。内核开放团队推荐每次编译内核之前都运行这个命令。不要指望解压后的源码树都是干净的。
配置内核通过一个菜单来驱动界面。BLFS 在 LFS 包之外有一些详细的有关内核配置要求的软件包,在 http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#kernel-config-index:
make LANG=<host_LANG_value>
LC_ALL= menuconfig
编译参数的含义:
LANG=<host_LANG_value>
LC_ALL=
这建立了在主机上使用的本地设置。这需要一个适当的内核界面接口线来动用 UTF-8 的 linux 文本控制台。
确保用你主机上变量 $LANG
的值来替换 <host_LANG_value>
。如果未设置,你可以用主机上
$LC_ALL
或者 $LC_CTYPE
的值来替代它。
在同样的情况下选择 make
oldconfig 可能更合适。阅读 README
以获取更多信息。
如果愿意,可以跳过内核配置,直接从主机系统(假定可用)复制内核配置文件 .config
,解压到 linux-2.6.27.4
目录下。然而,我们不推荐这种选择。通常探究所有配置菜单项并且从头创建内核配置更好。
编译内核镜像和模块:
make
如果使用内核模块,可能需要 /etc/modprobe.conf
文件。有关模块和内核的配置信息可在 第 7.4 节 “LFS
系统的设备和模块处理” 和 linux-2.6.27.4/Documentation
目录中的内核文档中找到。同样,modprobe.conf(5)
可能也很重要。
如果内核配置使用模块,安装它们:
make modules_install
内核编译完成后,为完成安装还需要额外的步凑。一些文件需要拷贝副本到 /boot
目录。
内核镜像的路径,根据平台的不同可能会改变。下面的命令假定架构在 x86 上:
cp -v arch/x86/boot/bzImage /boot/lfskernel-2.6.27.4
System.map
是内核的一个符号文件。它映射每个内核 API
函数的入口,以及内核在运行中的数据结构地址。运行下面这个命令安装这个映射文件:
cp -v System.map /boot/System.map-2.6.27.4
内核配置文件 .config
产生于步凑 make
menuconfig,包含所有被编译的内核配置选项。保留这个文件以备将来参考是个好主意:
cp -v .config /boot/config-2.6.27.4
安装Linux内核文档:
install -d /usr/share/doc/linux-2.6.27.4 cp -r Documentation/* /usr/share/doc/linux-2.6.27.4
有一点重要提示,内核源码目录的所有者不是 root。只要是用 root(类似我们在 chroot 环境下做的)解压,无论他们在什么打包者的计算机上解压后的文件都有用户和组的 ID。对于其他安装包这通常不是问题因为源码树在安装后被移除了。但是,Linux 源码树通常保留很长时间。为此,无论包装者使用什么 ID,用户的 ID 仍然有可能被分配给机器上的某人。此人将拥有改写内核源码的权限。
如果要保留内核源码,在 linux-2.6.27.4
目录下运行
chown -R
0:0,确保所有文件都属于 root。
推荐一些内核文档创立一个指向内核源码目录的 /usr/src/linux
链接,特别对 2.6 版本的内核。而在 LFS 系统上
不允许,它会导致你在完成 LFS
系统构建后,安装其它软件包时出现错误。
系统 include
目录下的头文件应该 始终 基于 Glibc 编译后的版本。也就是和
Linux-Libc-Headers 相同。因此, 决不要 替换内核头文件。