定制Linux内核详解(转)

时间:2021-06-23 16:33:56
概述 

   在大多数情况下各种Linux发行版默认提供的内核都运行得非常好,但有些时候我们必须重新构造和定制内核,例如: 


系统中加入了当前内核不支持的或者尚未启用相应功能的硬件。 

需要使用某些操作系统功能或软件,默认情况下它们的内核支持被关闭。此时,我们需要构造一个启用了相应内核支持的新内核。 

为节省磁盘空间而使用较小的内核映象。如果系统的磁盘空间非常紧张,构造新内核并使其只支持那些确实需要用到的功能能够节省出一份可观的空间。 

为了安装新的软件或添加新的功能,这些软件和功能需要修改内核才能正常工作。 

为了使用最新、最好的内核。各个主要发行版中由供应商提供的内核往往明显地落后于最前沿的技术,而且很遗憾地,它们的更新也很不及时,这就要求我们自己构造Linux内核。 
   好在自己构造和定制Linux内核并不是非常复杂,下面我们依次介绍它的各个步骤。 

准备工作 

   在构造新内核之前我们必须做好必要的准备工作。首先必须有一个开发环境(如C编译器等);另外还必须安装内核头和内核本身的源代码,前者通常是默认安装的,而后者往往是不安装的。 

   在Red Hat系统上,我们可以用rpm命令确定内核头和内核的源代码是否已经安装: 


# rpm --query -a | grep kernel 
kernel-source 
kernel-headers 




   上例的输出表明这两种源代码都已经安装到了系统上。如果内核源代码还没有安装,则可以用包含源代码RPM的CD进行安装,安装命令如下所示: 


rpm --install /cdlocation/SRPMS/kernel-source-2.2.X.i386.rpm 




   这里的cdlocation是/dev/cdrom的装配点(mount point),而X则是内核版本号的一部分。如果系统属于另外的体系,则i386也应该用相应的后缀替代。 

   另外,内核源代码也可以从Internet下载,然后只要按通常的方式解开tar文件即可。 

   安装好的源代码通常可以在名为/usr/src/linux-2.2.x目录下面找到。按照惯例,/usr/src/linux目录是一个指向内核源代码的符号链接。通常这个链接是在安装源代码RPM时自动创建的,不过有些时候需要手工创建(或将链接目标从原来的内核源代码目录修改过来)。 

   构造新内核的第一步是进入内核源代码目录树的*目录: 


# cd /usr/src/linux 




   如果需要为内核源代码追加补丁,请执行类如下面的命令: 


# zcat /patch-location/patchN.gz | patch -p0 -e 




   这里的N是补丁编号。一般我们只有在新增从Intenet下载的软件时才需要补丁。 

   下一步是保存现有的配置文件并彻底地清理一下内核源代码: 


# cp .config .config.save 
# make mrproper 




   如果这是第一次从这份源代码构造内核,.config文件可能不存在(下面有更多关于它的讨论)。 

配置内核 

   接下来是定义新内核的特征,指定内核应当提供对哪些硬件和软件的支持。这一个步骤是半自动的,可以用三种方法来完成,具体由make命令的参数决定: 


# make config --或-- 
# make menuconfig --或-- 
# make xconfig 




   所有这三个命令都会在当前目录创建.config文件。.config文件指定了数量庞大的系统配置选项,这些选项控制着内核行为及其软/硬件支持的各个方面。make config命令通过一系列字符界面提示用户设定选项,它的缺点在于:如果我们在某个选项的界面过去之后再想改变这个选项,就必须从头开始才能改变它。 

 
图1:make xonfig提供配置内核的图形用户界面 


   make menuconfig和make xconfig分别通过字符界面和基于X的图形界面完成同一任务。图1显示的是make xconfig的主菜单。 
作者: 220.176.67.* 2005-8-22 15:17 回复此发言 

2 定制Linux内核详解(转)

   这个工具将所有的内核配置选项按照它们所关联的系统功能分成一系列的组。图2显示的是General Setup组的窗口。窗口中的每一项都可以设置成分别表示启用或禁止的y、n(即Yes或No)。此外,make xconfig为所有的选项都提供了帮助,图2显示了PCI Quirks的帮助。帮助窗口不仅简明地说明了选项的含义,而且还给出设置建议,这对缺乏经验的管理员来说是很有用的。 

 


图2:make xconfig的General Setup窗口及其帮助功能 

   每个窗口的底部都有Next和Prev按钮,通过这两个按钮我们无需返回主菜单即可直接访问下一组或上一组选项。此外,通过Main Menu按钮可以关闭当前窗口返回主菜单。 

   图3显示了两个设置SCSI支持选项的窗口。左边窗口的几个选项确定内核是否支持SCSI设备,在这里我们启用了所有设备类型的SCSI支持。 

 
图3:make xconfig中的SCSI设备设置 


图3显示的大多数选项都有三个可选择的值,即在“y”、“n”之外加上了“m”。m是module的缩写,它表示该选项所代表的功能应该启用,但不是直接编译到内核映象里面,而是由可装载模块提供。注意使用m选项时,Loadable Module Support选项组中的模块支持也应当启用(该选项通常默认启用)。 

   

   图3右边的窗口显示的是各种可支持SCSI适配器的配置选项。这个窗口通过左边窗口最下面的选项按钮,即SCSI low-level drivers按钮打开。 

   本例启用了对Adaptec AIC7系列适配器的以模块形式提供的支持,图中以红色表示。选中该选项之后,下面的四个选项也允许设置(用亮蓝色表示),这些选项用于指定AIC7特有的配置。 

   按照要求正确设置所有配置选项之后,我们可以用主菜单右下角的按钮来结束配置过程。Save and Exit和Quit Without Saving这两个按钮都可退出配置工具,但前者保存配置结果,后者不保存。Load Configuration from File按钮用于从文件读取配置信息,Store Configuration to File按钮用于将配置结果保存到文件。注意为了让新内核按照这里的配置结果进行构造,如果我们把配置结果保存到其他文件,还需要再保存到/usr/src/linux/.config文件(Save and Exit按钮自动将结果保存到.config文件)。 

   接下来我们要做的是执行下面两个make命令: 


# make dep 
# make clean 




   第一个命令创建一些文件,这些文件描述了内核构造过程中各个部分之间的依赖关系;第二个命令在实际编译内核之前从源代码目录树中清除所有不需要的文件(包括此前各步操作所创建的文件)。 

构造内核 

   现在我们可以正式构造内核了。完成这一任务的典型命令为: 


# make bzImage 




   该命令将生成一个用bzip压缩的内核执行文件。 

   如果增加或改动了任何内核模块,或者这是第一次从当前版本的源代码构造内核,接下来还必须构造模块执行文件: 


# make modules 




   这一过程完成后,如果当前正在使用的内核版本和新构造内核的版本相同,我们必须决定是否备份原来的内核模块。备份可以通过改变模块目录的名字实现,命令如下所示: 


# mv /lib/modules/2.2.x /lib/modules/2.2.x.save 




   和前面一样,这里的x也用于补足内核版本号。 

   接下来是安装这些模块: 


# make modules_install 




   不管事实上是否存在新的模块,每次构造启用模块支持的内核时都必须执行这一步骤,这是因为它还要执行其它启用模块支持所必不可少的操作。 

   接下来就可以安装新内核: 


# cp /boot/vmlinuz /boot/ vmlinuz.save 
#mv arch/i386/boot/bzImage / boot/new_vmlinuz 




   首先我们备份了原来的内核,然后把新构造的内核映象移到/boot目录,命名为new_vmlinuz。使用这种方法,我们为可能出现的无效新内核采取了双重保护:原来的内核以及它的一份拷贝。 

   现在将这个新的内核登记到/etc/lilo.conf。一种简便方法是拷贝现有的登记条目,然后修改label=和image=这两行,最后运行lilo命令安装新的配置。 

运行新内核 

   接下来就可以重新启动试验新的内核了。不要忘了在lilo提示时输入新内核的名称。如果系统能够正常地启动,接着对系统的所有功能进行测试。 

   一旦确认新内核可以作为默认内核使用,删除原来的内核文件(不是原内核的备份!),把新内核拷贝或者移动到/boot/vmlinuz(或者,如果这个文件是一个符号链接,修改该链接使其指向新内核),然后再编辑/etc/lilo.conf,删除启动新内核的内容(现在新内核已经成了默认内核),加入启动备份的稳定原内核的内容(仅仅是为了预防万一)。最后再运行lilo安装新的配置。 

  定制内核应注意的问题 

   谈到由Linux发行版原来提供的内核,有几个问题我们必须加以注意。大多数时候,发行版的创建者会修改标准的内核源代码。例如,它们会在自己的发行版中提供一些要求修改内核的软件。虽然这些软件往往是很有用的,但它同时也意味着在下面两种特殊的情况下我们可能会遇到问题: 


在内核代码已经被发行版提供者修改的环境下试图从标准的源代码构造新内核。在这种情况下,我们需要手工地把发行版所依赖的补丁安装到用于构造内核的源代码(一个常见的例子是knfsd NFS服务器软件所需要的补丁)。 

需要安装新的软件,这些软件将对内核代码作重大的修改。在这种情况下,新软件所提供的补丁会假定修改是在标准的内核代码上进行,在发行版供应商修改过的内核上安装补丁可能会失败。此时,我们必须自己检查问题所在(这需要相当丰富的编程经验)或联系发行版供应商以获得帮助。