Linux 内核编译
时间:2007-05-22 来源:LoveForLinux
Linux 内核编译
编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看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 |
使用方向键在各选项间移动;使用“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”命
令来加载需要的模块。
◆ 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)” 挂起计算;
◆“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” 支持网络,包括网络协议和网络设备,
◆“ISDN subsystem” ISDN上网必需选选项;
◆“Sound” 是声卡驱动
◆“USB Support” 一种USB设备;
执行了“make ”之后,系统会在include/linux目录下生成一个autoconf.h文件。例如,在配置内核选项时选择支持NTFS文件系统,并把它编译进了内核,那么在.config中就会生成CONFIG_NTFS_FS=y”这项,相应的在include/linux/autoconf.h中会生成“#define NFIG_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.通过下面的命令安装内核:
如果用户使用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是全自动的。”
#make install |
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 |
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 |