许多 Linux 的新用户经常会问:“我为什么应该建构自己的内核?”鉴于在内核模块使用上的发展,对这个问题最恰当的回答应该是:“除非你已经知道你为什么需要建构自己的内核,你可能没必要这么做。”
Red Hat Linux 和通过 Red Hat Linux 勘误系统所提供的内核提供了对多数现代硬件而支持以及内核功能。对多数用户来说,它不必被重新编译。本附录只是一个 为想要重新编译他们的内核,并想进一步学习有关知识的用户以及想把试验性的功能编译入内核的用户而提供的指南。
要使用 Red Hat, Inc. 发行的内核软件包来升级内核,请参阅 第30章 。
警告:建构定制内核不被 Red Hat Linux 安装支持组所支持。要获得更多关于使用 Red Hat, Inc. 发行的 RPM 软件包来升级内核的信息,请参阅 第30章 。
A.1.建构筹备 在建构定制内核之前,最重要的步骤是确定你有一张可运行的紧急引导盘,以防万一出错。要制作一个将会使用当前运行的内核来引导的引导盘,执行以下命令:
/sbin/mkbootdisk `uname -r` 制作了磁盘后,请测试它以确定它能够引导系统。
要重新编译内核,你必须安装了 kernel-source 软件包。启用命令:
rpm -q kernel-source 来判定它是否被安装。如果它没有被安装,从 Red Hat Linux 光盘、Red Hat FTP 站点( ftp://ftp.redhat.com ,其镜像列表位于 http://www.redhat.com/mirrors.html )或 Red Hat 网络中安装它。 关于安装 RPM 软件包的详情,请参阅 第 V 部分 。
A.2.建构内核 本节的说明应用于建构定制的模块化内核。要建构单一化内核,请参阅第 A.3 节来获得关于建构和安装单一化内核的各方面的解释。
注记:这个例子使用 2.4.20-2.47.1 作为内核版本(内核版本可能会有所不同)。要判定内核版本,键入 uname -r 命令,然后用返回的内核版本来代替 2.4.20-2.47.1。
要建构用于 x86 体系的内核,遵循以下步骤(已根用户身份执行):
打开一个 shell 提示,改换到目录 /usr/src/linux-2.4 下。从此以后的命令都必须在该目录下执行。
你应该明确建构内核所使用的[url=http://www.pccode.net].net" class="wordstyle"源码树的状况,这一点至关重要。因此,建议你从命令 make mrproper 开始着手。它会删除所有的配置文件,以及散落在[url=http://www.pccode.net].net" class="wordstyle"源码树周围的从前建构的版本遗迹。如果你已有一个存在的配置文件 /usr/src/linux-2.4/.config ,在运行这项命令前把它备份到另一个目录中,命令运行后再把它复制回来。
推荐你从默认 Red Hat Linux 内核的配置着手。其步骤是,把系统体系的配置文件从 /usr/src/linux-2.4/configs/ 目录中复制到 /usr/src/linux-2.4/.config 目录中。如果系统的内存大于 4GB,复制包含 bigmem 的文件。
下一步,定制设置。如果 X 窗口系统可用,建议的方法是使用 make xconfig 命令来运行 Linux Kernel Configuration 。
注记: 要使用 make xconfig 命令所启动的图形化工具,你必须安装提供了 wish 命令的 tk 软件包。 关于安装 RPM 软件包的详情,请参阅 第 V 部分 。
图 A-1. 配置内核组件的类别
如图 A-1所示,点击一个类别来选择它。在每个类别中包含的是组件。选择组件旁的 y (是)、 m (模块)、或 n (否)来把它编译入内核、编译成内核模块、或不编译它。要进一步了解某组件,点击它旁边的 help 按钮。
点击 Main Menu 来返回到类别列表。
完成了配置后,点击主菜单中的 Save and Exit 按钮来创建配置文件 /usr/src/linux-2.4/.config 并退出 Linux Kernel Configuration 程序。
即便没有对设置进行任何改变,在继续前你也需要运行 make xconfig 命令(或其它内核配置方法)。
其它可用的内核配置方法包括:
make config — 互动文本程序。组件以线形格式出现,并被一个一个地回答。这种方法不需要运行 X 窗口系统,而且不允许你改变对前面问题的回答。
make menuconfig — 文本模式、菜单驱动的程序。组件以类别菜单的格式被显示; 使用和文本模式 Red Hat Linux 安装程序所用的同样方法来选择想要的组件。双态切换和要包括的项目相对应的标签: [*] (内建)、 [ ] (排除)、 <M> (模块)、或 < > (具备模块能力)。这种方法不需要 X 窗口系统。
make oldconfig — 这是一个非互动的脚本。它设置配置文件来包含默认的设置。如果系统使用的是默认 Red Hat Linux 内核,它会为用于该体系的 Red Hat Linux 包括的内核创建一个配置文件。这能够帮助你按照已知的工作默认值来设置内核,然后关闭你不想使用的功能。
注记:要使用 kmod 和内核模块,在配置中对 kmod support 和 module version (CONFIG_MODVERSIONS) support 回答 Yes 。
创建了 /usr/src/linux-2.4/.config 文件后,使用 make dep 命令来正确设置依赖关系。
使用 make clean 命令来准备要建构的[url=http://www.pccode.net].net" class="wordstyle"源码树。
推荐你给定制内核添加一个修改版本号码,因此现存内核不会被覆盖。此处描述的方法是从意味事件中恢复的最简易方法。 关于其它可能性,请参阅 http://www.redhat.com/mirrors/LDP/HOWTO/Kernel-HOWTO.html 或 /usr/src/linux-2.4 中的 Makefile 的详情。
按照默认设置, /usr/src/linux-2.4/Makefile 在以 EXTRAVERSION 开头的行的结尾处包括 custom 这个词。后补这个词会允许系统同时拥有原有的工作内核和新内核(版本 2.4.20-2.47.1custom)。
如果系统包含不止一个定制的内核,区别它们的好办法是在后面添加日期(或其它标识符号)。
使用 make bzImage 来建构内核。
建构使用 make modules 所配置的模块。
使用 make modules_install 命令来安装内核模块(即便事实上什么也没有建构)。请留心命令中的下划线( _ )。 这会把内核模块安装入 /lib/modules/ <KERNELVERSION> /kernel/drivers 目录( KERNELVERSION 是 Makefile 中指定的版本)。在这个例子里是 /lib/modules/2.4.20-2.47.1custom/kernel/drivers/ 。
使用 make install 来把新内核和相关文件复制到正确的目录中。
除了在 /boot 目录中安装内核文件,这个命令还执行 /sbin/new-kernel-pkg 脚本。该脚本会建构一个新的 initrd 映像,并在引导装载程序的配置文件中添加一个新项目。
如果系统有一个 SCSI 适配器,而 SCSI 驱动程序被作为模块编译了;或在建构内核时把 ext3 支持作为模块(Red Hat Linux 的默认设置)编译入,你就需要 initrd 映像。
即便 initrd 映像和引导装载程序被修改了,你也应该校验这些修改的正确性,并确定使用定制的内核版本而不是 2.4.20-2.47.1。关于校验这些修改的信息,请参阅 第 30.5 节 和 第 30.6 节 。
A.3.建构单一化内核 要建构单一化内核,除了几个例外以外,其步骤和和建构模块化内核相同。
当配置内核时,不要把一切都编译成模块。换一句话说,只对问题回答 Yes 或 No 。还有,你应该对 kmod support 和 module version (CONFIG_MODVERSIONS) support 回答 No 。
省略下面几个步骤:
make modules make modules_install 在 grub.conf 文件中的 kernel 行后补 nomodules 或编辑 lilo.conf 来包括 append=nomodules 行。