Linux软件包包含Linux内核。
安装内核包括几个步骤:配置,编译和安装。要选择不同于本书的其他配置内核的方式, 请阅读内核源文件目录中的README
文件。
运行下面的命令来为编译做准备:
make mrproper
这样可以确保内核源码树是绝对干净的,内核开发组推荐每次编译内核之前都先运行这个命令。 请不要以为解包后内核源码树自动就是干净的。
通过菜单界面配置内核。要获得内核配置的全面信息,请参考 http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt。BLFS 有一些关于LFS之外的一些软件包的特别的内核配置需求, 具体参见这里: http://www.linuxfromscratch.org/blfs/view/svn/longindex.html#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。
一些内核文档建议建立一个从 /usr/src/linux
指向源码目录的符号链接。 这只是一个对 2.6 以前版本内核的特殊要求,并且在 LFS 系统上是不允许这样做的,因为你的基本LFS系统完成以后,你会安装其他软件包,这可能引起问题。
系统include
目录中的头问题件应该总是保持Glibc编译时的那个版本,这也是Linux内核tar包中的干净的头文件。因而,它们绝不要被替换成原始的内核头文件和其他干净的头文件。
需要创建/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