第十三章 内核升级与定制内核
13.1 内核升级
   13.1.1 2.4版本的内核
   13.1.2 准备升级
   13.1.3 下载可用于升级的内核
   13.1.4 升级内核
   13.1.5 校验初始 RAM 磁盘映像是否被创建
   13.1.6 配置引导装载程序
   13.1.7 内核模块
13.2 定制内核
   13.2.1 准备定制
   13.2.2 定制内核
   13.2.3 建构单一化内核
  13.1.1 2.4版本的内核

它包括以下功能:

  • 内核源码的目录是 /usr/src/linux-2.4/ ,而不是 /usr/src/linux/ 。
  • 对 ext3 文件系统的支持。
  • 对多重处理器(SMP)的支持。
  • 对 USB 的支持。
  • 对 IEEE 1394 设备(又称 FireWire)的初步支持。

TOP

 
  13.1.2 准备升级

为防止升级出问题,准备一张使用你系统的可运行的引导盘。或者在引导装载程序中保留老的内核选项。

要创建引导盘,在 shell 提示下登录为根用户,然后键入以下命令:

 /sbin/mkbootdisk `uname -r` 

确定要升级的软件包:若你想重新编译内核,或把系统用于内核开发,应该还要升级 kernel-source 软件包。如果你需要 PCMCIA 支持(例如在便携电脑上), kernel-pcmcia-cs 软件包就必不可少。

RPM 软件包的 x86 版本被包括在文件名中。例如: kernel-2.4.20-2.47.1.athlon.rpm 是为AMD Athlon™ 和 AMD Duron™ 系统的, kernel-2.4.20-2.47.1.i686.rpm 是为 Intel® Pentium® II、 Intel® Pentium® III、和 Intel® Pentium® 4 系统的。在你判定了软件包之后,你需要升级内核,为 kernel 、 kernel-smp 、和 kernel-bigmem 软件包选择适用于微机的i386体系。

TOP

 
  13.1.3 下载可用于升级的内核

要判定是否有可用于你的系统的升级内核,方法有好几种。

TOP

 
  13.1.4 升级内核

下载了所需要的内核升级软件包,可以开始升级。建议保留原来的内核,以防万一。

使用 rpm 命令的 -i 选项来保留就内核。如果你使用了 -U 选项来升级 kernel 软件包,它会覆盖当前安装了的内核。该命令为(内核版本和 x86 版本会有所不同):

 rpm -ivh kernel-2.4.20-2.47.1.i386.rpm  

如果系统是多处理器系统,还需安装 kernel-smp 软件包(内核版本和 x86 版本会有所不同):

 rpm -ivh kernel-smp-2.4.20-2.47.1.i386.rpm  

如果系统是基于 i686 的,并包含超过 4GB 的内存,还需安装为 i686 体系建构的 kernel-bigmem 软件包(内核版本和 x86 版本会有所不同):

 rpm -ivh kernel-bigmem-2.4.20-2.47.1.i686.rpm  

如果你打算升级 kernel-source 、 kernel-docs 、或 kernel-utils 软件包,你可能不需要保留老版本。使用下面的命令来升级这些软件包(版本会有所不同):

 rpm -Uvh kernel-source-2.4.20-2.47.1.i386.rpm 
rpm -Uvh kernel-docs-2.4.20-2.47.1.i386.rpm
rpm -Uvh kernel-utils-2.4.20-2.47.1.i386.rpm 

如果系统需要 PCMCIA 支持(例如便携电脑),你还需要安装 kernel-pcmcia-cs 并保留老版本。如果你使用了 -i 选项,它可能会返回冲突,因为老内核需要该软件包来引导带有 PCMCIA 支持的系统。要绕过这个问题,使用 --force 选项,如下所示(版本会有所不同):

 rpm -ivh --force kernel-pcmcia-cs-3.1.24-2.i386.rpm  

TOP

 
  13.1.5 校验初始 RAM 磁盘映像是否被创建

如果系统使用 ext3 文件系统或 SCSI 控制器,你就需要初始 RAM 磁盘。初始 RAM 磁盘的目的是允许模块化的内核在它能够进入模块通常驻留的设备之前具备进入内核需要从该设备引导的模块的能力。初始 RAM 磁盘通过使用 mkinitrd 命令来创建。然而,如果内核及其相关文件是从 Red Hat, Inc. 发行的 RPM 软件包中安装或升级的话,这个步骤会被自动执行;因此,它不必被手工进行。要校验它是否被创建了,使用 ls -l /boot 命令来确定 initrd-2.4.20-2.47.1.img 文件被创建了(版本应该匹配刚刚安装了的内核的版本)。

TOP

 
  13.1.6 配置引导装载程序

如果你安装了 GRUB 或 LILO 引导装载程序, kernel RPM 软件包配置它们来引导刚刚安装的内核,但是它并不配置引导装载程序默认引导新内核。

13.1.6.1 GRUB

如果你选择了 GRUB 作为引导装载程序,请确认 /boot/grub/grub.conf 文件中包含的 title 部分中的版本与你刚刚安装的 kernel 软件包的版本相同(如果你安装了 kernel-smp 和/或 kernel-bigmem ,你也会看到这个部分):

 # Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/hda2
#          initrd /initrd-version.img
#boot=/dev/hda
default=3
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-2.47.1)
        root (hd0,0)
        kernel /vmlinuz-2.4.20-2.47.1 ro root=LABEL=/
        initrd /initrd-2.4.20-2.47.1.img
title Red Hat Linux (2.4.20-2.30)
        root (hd0,0)
        kernel /vmlinuz-2.4.20-2.30 ro root=LABEL=/
        initrd /initrd-2.4.20-2.30.img 

如果你创建了单独的 /boot 分区,到内核与 initrd 映像的路径是相对于 /boot 分区而言的。

注意,默认引导项目没有被设置为新内核。要配置 GRUB 来默认引导新内核,把 default 变量的值改成包含新内核的 title 部分的号码。这个号码从 0 开始。例如,如果新内核是第二个 title 部分,把 default 设置为 1

你可以重新引导计算机来开始测试这个新内核,观察屏幕上的消息来确保硬件被正确地检测到了。

13.1.6.2 LILO

如果你选择了 LILO 作为引导装载程序,请确认 /etc/lilo.conf 文件中包含的 image 部分中的版本与你刚刚安装的 kernel 软件包的版本相同(如果你安装了 kernel-smp 和/或 kernel-bigmem ,你也会看到这个部分):

 prompt
timeout=50
default=2.4.20-2.30
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
message=/boot/message
linear

image=/boot/vmlinuz-2.4.20-2.47.1
        label=2.4.20-2.47.1
        initrd=/boot/initrd-2.4.20-2.47.1.img
        read-only
        append="root=LABEL=/"

image=/boot/vmlinuz-2.4.20-2.30
        label=2.4.20-2.30
        initrd=/boot/initrd-2.4.20-2.30.img
        read-only
        append="root=LABEL=/" 

注意,默认引导项目没有被设置为新内核。要配置 LILO 来默认引导新内核,把 default 变量的值改成包含新内核的 image 部分中的 label 的值。以根用户身份运行 /sbin/lilo 命令来启用改变。运行后,其输出会与如下相似:

 Added 2.4.20-2.47.1 *
Added linux 

2.4.20-2.47.1 后面的 * 意味着那部分中的内核是 LILO 会默认引导的内核。

你可以重新引导计算机来开始测试这个新内核,观察屏幕上的消息来确保硬件被正确地检测到了。

TOP

 
  13.1.7 内核模块

Linux 内核具有模块化设计。在引导时,只有少量的驻留内核被载入内存。之后,无论何时用户要求使用驻留内核中没有的功能,某内核模块(kernel module),有时又称驱动程序(driver)。就会被动态地载入内存。在安装过程中,系统上的硬件会被探测。基于探测结果和用户提供的信息,安装程序会决定哪些模块需要在引导时被载入。安装程序会设置动态载入机制来透明地运行。 当系统使用新硬件引导后,Kudzu 程序会运行,如果新硬件被支持,它就会被检测到,该程序还会为它配置模块。你也可以通过编辑模块配置文件 /etc/modules.conf 来手工指定这个模块。

/sbin/lsmod 命令显示了当前载入了的模块列表。例如:

 Module                  Size  Used by    Not tainted
iptable_filter          2412   0 (autoclean) (unused)
ip_tables              15864   1 [iptable_filter]
nfs                    84632   1 (autoclean)
lockd                  59536   1 (autoclean) [nfs]
sunrpc                 87452   1 (autoclean) [nfs lockd]
soundcore               7044   0 (autoclean)
ide-cd                 35836   0 (autoclean)
cdrom                  34144   0 (autoclean) [ide-cd]
parport_pc             19204   1 (autoclean)
lp                      9188   0 (autoclean)
parport                39072   1 (autoclean) [parport_pc lp]
autofs                 13692   0 (autoclean) (unused)
e100                   62148   1
microcode               5184   0 (autoclean)
keybdev                 2976   0 (unused)
mousedev                5656   1
hid                    22308   0 (unused)
input                   6208   0 [keybdev mousedev hid]
usb-uhci               27468   0 (unused)
usbcore                82752   1 [hid usb-uhci]
ext3                   91464   2
jbd                    56336   2 [ext3] 

对每行而言,第一列是模块名称;第二列是模块大小;第三列是用量计数。 /sbin/lsmod 输出和查看 /proc/modules 的输出相同。

要载入内核模块,使用 /sbin/modprobe 命令,然后跟着内核模块的名称。按照默认设置, modprobe 试图从 /lib/modules/<kernel-version> /kernel/drivers/ 子目录中载入模块。每类模块都有一个子目录,如用于网络接口驱动程序的 net/ 子目录。某些内核模块有模块依赖关系,这意味着你必须首先载入其它模块才能载入这些模块。 /sbin/modprobe 命令检查这些依赖关系,并在载入指定模块前载入满足这些依赖关系的模块。你还可以使用 /sbin/insmod 命令来载入内核模块;不过它不解决依赖关系。因此,推荐你使用 /sbin/modprobe 命令。 要卸载内核模块,使用 /sbin/rmmod 命令和模块名称。 rmmod 工具只卸载不在使用的、和不是被正使用的模块所依赖的模块。另一个有用的模块工具是 modinfo 。使用 /sbin/modinfo 命令来显示关于内核模块的信息。包括 -d 在内的选项显示了关于模块的简短描述, -p 选项列举了模块所支持的参数。

TOP

 
13.2 定制内核
13.2.1 准备定制
13.2.2 定制内核
13.2.3 建构单一化内核
13.2.1 准备定制

在建构定制内核之前,最重要的步骤是确定你有一张可运行的紧急引导盘,以防万一出错。要制作一个将会使用当前运行的内核来引导的引导盘,执行以下命令:

 /sbin/mkbootdisk `uname -r` 

制作了磁盘后,请测试它以确定它能够引导系统。

要重新编译内核,你必须安装了 kernel-source 软件包。启用命令来判定它是否被安装:

 rpm -q kernel-source 

TOP

13.2.2 定制内核

要定制内核,遵循以下步骤(以根用户身份执行):

  • 打开一个 shell 提示,改换到目录 /usr/src/linux-2.4 下。从此以后的命令都必须在该目录下执行。
  • 你应该明确建构内核所使用的源码树的状况,这一点至关重要。因此,建议你从命令 make mrproper 开始着手。它会删除所有的配置文件,以及散落在源码树周围的从前建构的版本遗迹。如果你已有一个存在的配置文件 /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 软件包。)
  • 如上图所示,点击一个类别来选择它。在每个类别中包含的是组件。选择组件旁的 y(是)、m(模块)、或 n(否)来把它编译入内核、编译成内核模块、或不编译它。要进一步了解某组件,点击它旁边的help按钮。(要使用 kmod 和内核模块,在配置中对 kmod support 和 module version (CONFIG_MODVERSIONS) support 回答 Yes 。 )

    点击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 包括的内核创建一个配置文件。这能够帮助你按照已知的工作默认值来设置内核,然后关闭你不想使用的功能。
     
  • 创建了 /usr/src/linux-2.4/.config 文件后,使用 make dep 命令来正确设置依赖关系。
  • 使用 make clean 命令来准备要建构的源码树。
  • 推荐你给定制内核添加一个修改版本号码,因此现存内核不会被覆盖。此处描述的方法是从意味事件中恢复的最简易方法。 关于其它可能性,请参阅 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。

TOP  

13.2.3 建构单一化内核

要建构单一化内核,除了几个例外以外,其步骤和和建构模块化内核相同。

  • 当配置内核时,不要把一切都编译成模块。换一句话说,只对问题回答 YesNo 。还有,你应该对 kmod support 和 module version (CONFIG_MODVERSIONS) support 回答 No
  • 省略下面几个步骤:
     make modules 
     make modules_install 
  • 在 grub.conf 文件中的 kernel 行后补 nomodules 或编辑 lilo.conf 来包括 append=nomodules 行。

TOP