Linux配置与编译内核  
作者:赛迪网 发文时间:2004.04.15

编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看Readme文件和Documentation目录下的Changes文件。它们对内核进行了描述,比如升级内核可能出现的问题和内核对系统中工具的版本要求等。Linux内核的编制方法下面将做具体说明。

下载与解压

首先需要将内核源码下载到/usr/src/目录下面。如果压缩格式是gzip,那么执行如下命令:

#tar xzvf linux-2.4.23.tar.gz



如果是bzip2格式,则执行如下命令:

#tar xjvf linux-2.4.23.tar.bz2



这时会建立Linux-2.4.23内核源代码树。进入该目录,并确保今后的所有操作都在这个目录下完成。

配置内核

有了要编译配置的内核,先来介绍怎么样配置内核。具体的步骤分为一下几步:

1.在开始配置内核之前,首先需要通过下面的命令清除所有的临时文件、中间件和配置文件。对于一个刚从网上下载的内核来说,它肯定是干净的,这么做只会多此一举。但是这是一个良好习惯,而且不会有坏结果。

#make mrproper



2. 然后要了解自己系统的硬件配置情况,比如CPU的类型、主办芯片、显卡和声卡的型号等。

3. 配置内核选项,用到的命令是:

#make <config_opt>



用到的配置工具有:

◆ config 基于交互式的文本配置界面。每个问题以线形格式出现,并被一个一个地回答,而且一旦作出了回答就不能再修改了。

◆ oldconfig 同config相似,但是使用原有的配置文件,而且只会提问有关新内核特性的问题,对于内核升级很方便。

◆ menuconfig 一个文本模式、选单驱动的配置界面。

◆ xconfig 基于Tcl/Tk的X图形配置界面。

现在开始配置内核,使用的工具为menuconfig。在命令行模式下执行下面的命令:

#make menuconfig



在闪过几行字之后就出现了如图1所示的界面。




图1 内核配置界面


使用方向键在各选项间移动;使用“Enter”键进入下一层选单;每个选项上的高亮字母是键盘快捷方式,使用它可以快速地到达想要设置的选单项。在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。

注意,如果“make menuconfig”命令失败,很可能是ncurses库没有安装。

内核的配置选项很多,这里就主要选项进行简要说明,使大家能根据自己的情况,进行内核定制。如果某些项把握不准,可以参考documentation/Configure.help文件,也可搜索整个系统,并查看相关的选项都在哪些文件中出现了。接下来就是个选项的配置说明情况。

◆ Loadable module support(可加载模块支持)。其中“Enable loadable module support”选项可让内核支持模块;“Module unloading”选项可以让用户卸载不再使用的模块,如果不选的话用户将不能卸载任何模块(注意,有些模块一旦加载就不能卸载,与是否选择了此选项无关);“Module versioning support(EXPERIMENTAL)”选项允许用户可以使用其它版本内核中编译的模块,不过并不可靠,所以一般不选择它;“Automatic kernel module loading”选项允许内核自动调用“modprobe”命令来加载需要的模块。

模块是一小段代码,编译后可在系统内核运行时被动态地加入内核,从而为内核增加一些特性或对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以缩小内核的体积。在运行时可以使用“modprobe”命令把模块加载到内核中去(在不需要时还可以卸载它)。

◆ Set version infomation on all symbols for modules(CONFIG_MODVERSIONS)是有关内核模块版本控制的选项。如果用户打算开发内核模块代码(包括当前内核源码树中之外的任何模块代码),就开启这个设置。一般的用户可以关闭。

◆(Pentium-III/Celeron(Coppermine))Processor family用来选择CPU类型。它允许内核使用高级处理器内部的特殊指令。当然,如果用户的CPU是80386,就没必要选择P4。但是如果实在不知该怎么选择,就选386。这时如果用户使用高级的CPU,内核的运行速度会比它应有的速度慢,但至少它能够运行。建议使用Help和/proc/cpuinfo获得更多的帮助。

◆ High Memory Support (CONFIG_NOHIGHMEM)使内核支持大内存。通常情况下内核只支持1GB内存(实际情况是896MB,它与vmalloc()的实现有关,这超出了我们的讨论范围)。如果用户的内存数量超过了896MB,请选择内核对4GB内存的支持,甚至64GB内存的支持。

◆ Symmetric multi-processing support(CONFIG_SMP)使内核支持多处理器。如果用户有多于一个CPU,那么一定要选这项。

◆ Maximum number of CPUs(2-32)用以选择处理器数量。对于单CPU用户来说,选多少都没有意义。

◆ General setup表示通用配置。这里可设置内核对虚拟内存的支持和为System V的进程提供通信机制;通过“Sysctl support”选项可以动态地更改一些核心参数与变量,而不需要重新启动系统。

◆ File systems(文件系统)。这里的内容很多,建议在缺省的基础上进行修改。一般需要DOS FAT(FAT16、FAT32)、VFAT,EXT3、NTFS和ISO9660(标准光盘使用的文件系统)支持。

介绍完这些内核配置的主要选项,用户在根据自己的要求配置好内核之后,接下来就要编译内核。

◆ Power management options (ACPI、APM)是高级电源管理。要注意ACPI与APM不能同时使用。如果同时配置了这两者,那么在系统启动时,若发现一个可工作的ACPI设备,那么APM将被关闭,ACPI会被加载。

如果想让Linux支持高级电源管理,例如软关机、系统休眠等,需要选择“Power Management support”选项;“Software Suspend(EXPERIMENTAL)”选项可以挂起计算机(类似Windows XP中的休眠),这个功能不需要高级电源管理的支持;“Processor”选项可让处理器在空闲时节省电能,应该选上;“Thermal Zone”选项在系统温度过高时,及时调整系统的工作状态,以保护CPU(需要硬件的支持)。

◆ Bus options(PCI、PCMCIA、EISA、MCA和ISA)用以设置系统总线。根据主板参数自己进行选择。针对PCI总线的是“PCI support”选项,下面还有ISA和EISA子项,一般都是需要的;“Support for hot-pluggable devices”选项是对热插拔设备的支持;“PCMCIA/CardBus support”选项支持PCMCIA。

◆ Executable file formats表示可执行文件格式,一般全要选上。

◆ Device Drivers用来选择设备驱动程序。声卡、显卡、网卡和电视卡等驱动都在这里选择。其中“Plug and Play support”选项支持即插即用;“Block devices”选项支持块设备;“SCSI device support”选项支持SCSI 设备;“Multi-device support(RAID and LVM)”选项支持RAID和逻辑卷;“Networking support”选项支持网络,包括网络协议和网络设备,协议中肯定要“TCP/IP”项,根据自己的网卡选择相应的设备;ISDN上网必需选“ISDN subsystem”选项;“Sound”选项是声卡驱动,有两种选择,一种是ALSA驱动,一种是Open Sound System驱动,选择支持自己声卡的那种,将之编译进内核;“USB Support”选项该项很重要,平常用的优盘就是一种USB设备;对USB而言,至少需要“Support for USB”、“USB device filesystem”、“ECHI HCD(USB 2.0)support”、“UCHI HCD(most Intel and VIA)support”、“USB Audio support”、“USB MIDI support”和“USB Mass Storage support”选项。

执行了“make ”之后,系统会在include/linux目录下生成一个autoconf.h文件。例如,在配置内核选项时选择支持NTFS文件系统,并把它编译进了内核,那么在.config中就会生成“CONFIG_NTFS_FS=y”这项,相应的在include/linux/autoconf.h中会生成“#define CONFIG_NTFS_FS 1”这项。因此所有与NTFS文件系统相关的C源文件都会包含include/config/ntfs/fs.h这个头文件。

新的2.6.0内核中增加了两个GUI配置工具,要使用xconfig必需先安装Qt库(一般发行版的光盘里都有),要使用gconfig就要先安装Gtk库。

在启动配置工具时,2.6.0内核会读取当前的系统配置,从而保持与当前配置相同的选项。这个特性是为方便以后的升级工作,在内核特性变化不大的情况下可以直接以当前的选项为基础,省去了逐项配置的麻烦。有两种方法可以让2.6.0内核以默认选项来启动配置工具,一种是将当前的配置文件/boot/config-XXX删除;另一种是在执行配置工具前先执行“make defconfig”命令。

除此之外,还为make添加了几个新选项,是allyesconfig、allnoconfig和allmodconfig。它们是为内核开发人员与测试人员准备的。

用户根据自己的要求配置好内核之后,接下来就要编译内核。

编译内核

编译内核的软件环境是kbuild系统,它泛指构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序、脚本、中间件、配置文件和Makefile。现在就讲解内核的编译过程,具体步骤如下:

1.“make dep”或“make depend”

kbuild调用中间件scripts/mkdep来生成描述与相关核心文件形成依赖关系的.h文件(绝大多数)列表。这个列表保存在.depend中。用户即使不执行这一步,kbuild也会自动执行的。

2. 构建内核镜像的命令是:

#make <boot_opt>



其参数如下:

◆ zImage 构建小内核镜像。

◆ compressed 同zImage。

◆ bzImage 构建大内核镜像。

◆ zdisk 使用zImage生成一张引导软盘。

◆ bzdisk 使用bzImage生成一张引导软盘。

◆ zlilo 使用lilo作为zImage的引导器。

◆ bzlilo 使用lilo作为bzImage的引导器。

根据实际情况选择内核境象类型,大多数情况下选择“make bzImage”。

2.6.0内核的kbuild系统与2.4.23比起来有一定的差异,但是绝大多数功能都是相似的。只是构建内核镜像的命令参数增加了一下几项:

◆ fdimage 制作一张1.44M的引导软盘

◆ fdimage144 同fdimage

◆ fdimage288 制作一张2.88M的引导软盘

3.通过下面的命令安装内核:

#make install



如果用户使用LILO,它会把内核镜像放到正确的位置并且修改LILO的配置,那么用户可以免去手动操作。如果使用别的引导器(例如GRUB),那么不使用这个命令。因为修改grub.conf需要交互式的手动编辑,自动修改可能会带来一些不可预计的错误,所以编译完毕后用户需要进行一些手动操作(见下面第6步)。

在2.6.0中“make install”更加智能,它会依此将arch/i386/boot/bzImage、System.map复制为/boot/vmlinuz-2.6.0,/boot/System.map-2.6.0,并创建vmlinuz-2.6.0的软链接vmlinuz和System.map-2.6.0的软链接System.map。kbuild还会自动创建/boot/initrd-2.6.0.img,并且修改grub.conf,以前这一切都要手动才能完成。引用别人的话来说:“2.4.x还是半自动的,而2.6.x是全自动的。”

4. 用下条命令编译所有被配置为模块的内核组件:

#make modules



5. 把所有编译好的内核模块按照功能拷贝到/lib/modules/2.4.23/目录下,使用下面命令:

#make modules_install



6. 手动操作将内核境像文件(/linux/arch/i386/boot/bzImage)拷贝到/boot分区,然后修改LILO或GRUB的相关设置。这里以grub.conf为例:

default=0
timeout=10
splashimage=(hd0,1)/grub/image/37.xpm.gz
title kernel-2.4.22
        root (hd0,1)
        kernel/vmlinuz-2.4.22 ro root=oot=LABEL=/
        initrd /initrd-2.4.22.img
title kernel-2.4.23
        root (hd0,1)
        kernel /vmlinuz-2.4.23 ro root=/dev/hda1
        initrd /initrd-2.4.23.img
title kernel-2.6.0
        root (hd0,1)
        kernel /vmlinuz-2.6.0 ro root=/dev/hda1
        initrd /initrd-2.6.0.img



注意,在2.4.23之前的内核,通常制定LABEL参数,但是对于2.4.23和2.6.0内核,这个参数已经被废弃了,使用root参数指定根文件系统的位置。

如果重新启动后出现“kernel panic”错误或显示应该修改“init”信息,则基本都是以上kernel语句错误。

根据发行版的不同,通常GRUB配置文件会在/etc/grub.conf、/boot/grub/menu.lst或/boot/grub/grub.conf三个地方。

7.最后将在编译过程中的垃圾文件进行清理,命令如下:

#make clean