如果您在硬件系统上运行 Linux,或者希望使用标准内核不支持的功能,又或者您希望减少内核内存占用以更好地利用系统内存,您可能会发现有必要构建自己的自定义内核。
内核升级包括配置所需的模块,编译内核和模块,最后安装内核镜像。 之后需要重启系统(祈祷一切顺利!)以加载新内核。 所有这些都记录在 ``README'' 文件中,该文件随每个内核包一起提供。 更多信息可以在 ``Documentation/'' 子目录中找到。 其中一个特别有用的文件是 ``Configure.help'',其中包含有关可用内核编译选项和模块的详细信息。
以下是一个示例会话,演示了在 Intel 平台上构建自定义内核版本 2.0.36 的过程。 虽然构建自定义内核通常只是配置、编译和安装的问题,但有时(通常在新硬件的情况下)如果您的硬件尚不受您正在编译的内核版本支持,则需要下载额外的驱动程序软件。
构建自定义内核的第一步是从 RPM(首选)或 tarball 下载并安装内核源代码。 有关获取适当文件的详细信息,请参阅第 10.4 节。
接下来,使用 ``rpm'' 实用程序(或 ``tar'',视情况而定)来安装内核源代码树和头文件。 例如,要安装 2.0.36-3 内核 RPM 文件
rpm -Uvh kernel-source-2.0.36-3.i386.rpm kernel-headers-2.0.36-3.i386.rpm rpm -Uvh kernel-ibcs-2.0.36-3.i386.rpm |
(如果您在笔记本电脑上运行 Linux,您可能还需要安装 ``kernel-pcmcia-cs-2.0.36-3.i386.rpm'' 文件,该文件提供电源管理功能。)
安装内核文件后,您应该能够在 ``/usr/src/linux/'' 目录中找到新的源代码树。
下一步是下载任何额外的驱动程序文件(如果适用),并将它们安装到新的内核源代码树中。 例如,要添加对 Mylex DAC960 硬件 RAID 控制器的支持,我将从 http://www.dandelion.com/ 网站下载驱动程序软件。 遗憾的是,此类驱动程序软件通常仅以 tarball 形式提供,需要使用 ``tar'' 实用程序安装。 例如
cd /usr/src/ tar zxvpf DAC960-2.0.0-Beta4.tar.gz |
您应该阅读随附的额外驱动程序软件的文档(如果适用)。 例如,DAC960 驱动程序包含一个 ``README'' 文件,其中提供了有关新下载的文件应位于何处以及如何应用内核补丁的说明
mv README.DAC960 DAC960.[ch] /usr/src/linux/drivers/block patch -p0 < DAC960.patch |
下一步是确保系统的符号文件链接与新的内核树一致。 实际上,此步骤只需执行一次,因此只有在您之前没有编译过自定义内核的情况下才需要执行以下操作
mail:/usr/src# cd /usr/include mail:/usr/include# rm -rf asm linux scsi mail:/usr/include# ln -s /usr/src/linux/include/asm-i386 asm mail:/usr/include# ln -s /usr/src/linux/include/linux linux mail:/usr/include# ln -s /usr/src/linux/include/scsi scsi |
注意:注意:对于 2.2.x 或更高版本的内核,上述步骤不再必要。
下一步是配置您的内核设置。 这是构建自定义内核的最重要步骤。 如果您禁用了错误的设置,您可能会遗漏对您需要的功能或硬件的支持。 但是,如果您启用了错误的设置,您将不必要地扩大内核并浪费宝贵的系统内存(话虽如此,最好宁愿犯后者而不是前者的错误)。
确保正确编译内核的最佳方法是了解您需要使用的功能,以及系统中您需要支持的硬件。 在您获得几次自定义内核的经验后,这个过程将变得 “老生常谈”,并且不会显得那么令人生畏!
输入以下内容以开始配置过程
mail:/usr/include# cd /usr/src/linux mail:/usr/src/linux# make mrproper mail:/usr/src/linux# make menuconfig |
(如果您运行了 X Window 系统,您可以键入 ``make xconfig'' 而不是 ``make menuconfig''; 有关如何使 X 工作的详细信息,请参阅第 5 章。)
要配置内核,请浏览各种设置并选择(启用)您需要的任何设置,并取消选择(禁用)您不需要的设置。 您可以选择将此类支持直接构建到内核中,或者将其构建为模块,该模块由内核根据需要加载和卸载。 (如果您将实际需要启动系统的功能(例如 SCSI 驱动程序)编译为模块,则需要创建 RAM 磁盘镜像,否则您的系统将无法启动。 这可以使用 ``mkinitrd'' 命令完成; 此过程在稍后会详细描述。)
在浏览配置设置时,您可以选择<Help>以获取有关给定内核选项用途的描述。
配置内核设置后,键入以下命令以编译内核
mail:/usr/src/linux# make dep ; make clean mail:/usr/src/linux# make bzImage mail:/usr/src/linux# make modules |
如果您重新编译与之前相同的内核(在此示例中为 2.0.36-3),您可能需要像以下命令一样将现有模块移动到备份目录
mail:/usr/src/linux# mv /lib/modules/2.0.36-3 /lib/modules/2.0.36-3-backup |
现在,键入以下命令以实际安装新模块
mail:/usr/src/linux# make modules_install |
下一步是将内核复制到 ``/boot/'' 目录,并使用 LILO 更新引导记录,以便识别新内核。 以下命令将创建现有内核的备份副本,复制新内核,然后刷新 LILO 引导记录
mail:/usr/src/linux# cd /boot mail:/boot# cp vmlinuz vmlinuz.OLD mail:/boot# cp /usr/src/linux/arch/i386/boot/bzImage vmlinuz-2.0.36 mail:/boot# /sbin/lilo |
最后,您需要编辑 ``/etc/lilo.conf'' 文件,并确保 “image” 引用指向新内核。 您还应该添加一个指向备份内核的部分,可能称为 “OldLinux”。 这是一个示例文件
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 image=/boot/vmlinuz label=Linux root=/dev/hdb1 read-only image=/boot/vmlinuz.OLD label=OldLinux read-only |
通过以这种方式添加备份内核信息,如果您的新内核无法正常启动(可能设备无法识别,或者守护程序无法按预期启动),您可以简单地键入 ``OldLinux'' 以从旧内核启动并调查问题。
注意:注意:如前所述,如果您已将启动系统所需的功能编译为模块,则需要创建一个初始 RAM 磁盘镜像才能启动系统。 (不要忘记编译内核时支持这种初始引导镜像。)
创建和使用初始 RAM 磁盘镜像的过程如下
在 ``/etc/lilo.conf'' 中添加一个条目,以从初始 RAM 磁盘镜像启动; 这显示为添加到前面显示的示例配置文件中
image=/boot/vmlinuz label=Linux root=/dev/hdb1 initrd=/boot/initrd-2.2.4-4.img read-only |
在您能够使用 mkinitrd 命令之前,需要加载 loopback 设备。 确保已加载 loopback 设备模块
/sbin/insmod loop |
(如果您收到有关无法加载 loopback 模块的错误消息,您可能需要为当前系统仍在运行的内核指定模块的完整路径,例如 ``/lib/modules/2.0.35/loop''.)
使用 ``mkinitrd'' 命令实际创建镜像
/sbin/mkinitrd /boot/initrd-2.0.36-3.img 2.0.36-3 |
运行 ``/sbin/lilo'' 以更新您的引导加载程序。
现在,关闭您的系统并启动新内核!
mail:/boot# /sbin/shutdown -r now |
如果您的内核完全拒绝启动,请不要惊慌。 从 Linux 安装期间创建的启动盘启动。 如果您没有此磁盘的副本,您应该可以从 Red Hat CD 创建一个。 将启动软盘插入驱动器并重新启动计算机。 当您看到 “boot:” 提示符时,键入
mount root=/dev/hda1 |
上述命令假定您的 “/” (根)分区位于 /dev/hda1 上。
然后 Linux 应该正常启动(尽管由于您使用的是启动盘中的内核,因此并非所有服务或设备都可能在此会话中正常运行),然后您可以恢复旧内核并重新安装 LILO 引导加载程序信息(即 ``mv /vmlinuz.old /vmlinuz ; /sbin/lilo'')并关闭/重启。 然后,您可以尝试使用不同的选项重新编译内核并再次尝试。