ITEEDU

8.3. Linux-2.6.32.8

Linux软件包包含Linux内核。

预计编译时间: 1.5 - 5.0 SBU
所需磁盘空间: 450 - 500 MB

8.3.1. 安装内核

安装内核包括几个步骤:配置,编译和安装。要选择不同于本书的其他配置内核的方式, 请阅读内核源文件目录中的README文件。

运行下面的命令来为编译做准备:

make mrproper

这样可以确保内核源码树是绝对干净的,内核开发组推荐每次编译内核之前都先运行这个命令。 请不要以为解包后内核源码树自动就是干净的。

通过菜单界面配置内核。要获得内核配置的全面信息,请参考 http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt。BLFS 有一些关于LFS之外的一些软件包的特别的内核配置需求, 具体参见这里: http://www.linuxfromscratch.org/blfs/view/svn/longindex.php#kernel-config-index

make LANG=<host_LANG_value> LC_ALL= menuconfig

make 参数的含义:

LANG=<host_LANG_value> LC_ALL=

这个参数建立主机上使用的 locale 设置。UTF-8 的linux文本控制台上的菜单配置ncurses 接口线图需要这个值。确保用你的主机上的$LANG变量代替<host_LANG_value>, 如果主机没有设置,你可以使用$LC_ALL$LC_CTYPE的值代替。

另外,在一些场合,使用make oldconfig可能更合适。更多信息请参考README文件。

如果您愿意,可以跳过配置内核的步骤,直接把宿主系统里的内核配置文件.config(如果存在的话) 复制到解压后的linux-2.6.32.8目录。 当然,我们不推荐这样做, 考察全部的配置菜单并从头开始创建内核配置是更好的办法。

编译内核镜像和模块:

make

如果使用内核模块,可能需要/etc/modprobe.d 目录中的模块配置。 关于模块和内核配置的信息请参考 Section 7.9, “LFS 系统的设备和模块处理”linux-2.6.32.8/Documentation 目录的内核文档。 modprobe.conf(5)也可能有用。

如果内核配置使用模块,就安装它们:

make modules_install

内核编译完成后,还需要一些步骤来完成安装。需要把一些文件拷贝到 /boot目录。

内核镜像文件所在的路径因您使用的平台不同而不同, 下面的文件名可以更改为适合您的口味,但是,为了与下一节描述的启动过程的自动安装兼容,文件名的词干应该是vmlinux 。x86平台上请运行下面的命令:

cp -v arch/x86/boot/bzImage /boot/vmlinux-2.6.32.8-lfs-6.6

System.map是内核的符号文件。它映射了内核API中每个函数的入口, 以及正在运行内核的数据结构的地址。在调查内核问题时,使用它作为一种资源, 请运行下面的命令安装这个文件:

cp -v System.map /boot/System.map-2.6.32.8

上面make menuconfig这一步产生的内核配置文件 .config 包含了刚刚编译的内核的所有配置选项, 最好保留这个文件以备将来参考:

cp -v .config /boot/config-2.6.32.8

安装 Linux内核的文档:

install -d /usr/share/doc/linux-2.6.32.8
cp -r Documentation/* /usr/share/doc/linux-2.6.32.8

重要的一点是要注意到内核源码目录里的文件所有者不是root。只要是用 root(像我们在 chroot 环境里做的那样)用户解压软件包,解压出来的文件的用户和组 ID 是这个软件包打包者计算机上的用户和组 ID, 对于其它软件包, 这通常不是问题, 因为安装完这些软件包之后源码目录就删除了,但是 Linux 内核源码树常常会保存很长的时间, 这样就有可能打包者的用户 ID 和您计算机上某个用户的 ID 相同, 从而让您计算机上的这个用户获得了内核源码的写权限。

如果您准备保留内核源代码,在linux-2.6.32.8目录上执行chown -R 0:0命令以确保全部文件的所有者是 root

[Warning]

警告

一些内核文档建议建立一个从 /usr/src/linux 指向源码目录的符号链接。 这只是一个对 2.6 以前版本内核的特殊要求,并且在 LFS 系统上是不允许这样做的,因为你的基本LFS系统完成以后,你会安装其他软件包,这可能引起问题。

[Warning]

警告

系统include目录中的头问题件应该总是保持Glibc编译时的那个版本,这也是Linux内核tar包中的干净的头文件。因而,它们绝不要被替换成原始的内核头文件和其他干净的头文件。

8.3.2. 配置Linux模块装载顺序

需要创建/etc/modprobe.d/usb.conf文件,以便如果将USB驱动(ehci_hcd, ohci_hcd 和uhci_hcd) 编译成模块时,它们会按正确的顺序装载, 为了避免在启动时出现警告,ehci_hcd 必须在ohci_hcd和uhci_hcd之前装载。

通过运行下面的命令来建立一个新文件/etc/modprobe.d/usb.conf

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

8.3.3. Linux 的内容

安装的文件: config-2.6.32.8, lfskernel-2.6.32.8, and System.map-2.6.32.8

简要描述

config-2.6.32.8

包含内核所有的配置选项

vmlinux-2.6.32.8-lfs-6.6

内核是 Linux 系统的引擎。 启动计算机时, 内核是操作系统首先装入的部分, 它检测并初始化所有的硬件, 然后将这些设备以文件树的形式存 放使得其它软 件可以访问, 内核还使单个 CPU 成为拥有多任务处理能力的机器, 可以同时运行许多程序。

System.map-2.6.32.8

一个地址和符号的列表,映射了内核中所有函数和数据结构的入口和地址。