快速业务通道

linux内核编译详解

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-12
一、内核简介

  内核,是一个操作系统的核心.它负责管理系统的进程、内存、设备驱动程序、文件
和网络系统,决定着系统的性能和稳定性.

  linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在
/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源
程序代码.全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引
发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用.而Linux的内
核则是这些特点的最直接的代表.

  想象一下,拥有了内核的源程序对你来说意味着什么?,我们可以了解系统是如
何工作的.通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方
夜谭.其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重
新编译内核.在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名
其妙过.再次,我们可以对内核进行修改,以符合自己的需要.这意味着什么?没错,相
当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并
实现自己需要的功能.在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了.



二、内核版本号

  linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发
布给他人使用.Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),
为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统.一个树是稳定树
(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree).
一些新特性、实验性改进等都将在开发树中进行.如果在开发树中所做的改进也可以
应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进.一旦开发
树经过了足够的发展,开发树就会成为新的稳定树.开发数就体现在源程序的版本号中;
源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳
定树大一(因此,是奇数).到目前为止,稳定树的最高版本是2.4.18;开发树的最新版
本是2.5.10.下载内核版本请访问[url]http://www.kernel.org[/url].



三、为什么重新编译内核

  linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订
了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的
系统度身定制一个更高效,更稳定的内核,就需要重新编译内核.

  通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更
稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是
linux使用者的必要操作内容.

  为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般
主要有下面四个考虑:

  自己定制编译的内核运行更快(具有更少的代码)

  系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)

  不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞

  将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些



四、内核编译模式

  要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中
(build-in),也可以把该部分编译成模块(module),动态调用.如果编译到内核中,
在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,
你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,
它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡.
如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内
核过分庞大,缺点是你得自己来调用这些模块.



五、新版本内核的获取和更新

  linux内核版本发布的官方网站是[url]http://www.kernel.org[/url].新版本的内核分两种,一
种是full Source版本,另外一种是patch文件,即补丁.完整的内核版本比较大,一般是
tar.gz或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压
缩.patch文件则比较小,一般只有几十K到几百K,但是patch文件是针对于特定的版本的,
你需要找到自己对应的版本才能使用.

  编译内核需要root权限,以下操作都假定你是root用户.请把你需要升级的内核拷贝
到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为



#cp linux-2.4.18.tar.gz /usr/src



  让我们先来查看一下当前/usr/src的内容,注意到有一个linux-2.4的符号链接,指向
一个linux-2.4.7-10(以REDHAT7.2为例)的目录.这就是你所装linux的kernel源代码,
删除这个链接.



  现在解压我们下载的源程序文件.如果所下载的是.tar.gz(.tgz)文件,请使用下面
的命令:



#tar -zxvf linux-2.4.18.tar.gz.tar.gz



  如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令



#bzip2 -d linux-2.4.18.tar.bz2

#tar -xvf linux-2.4.18.tar



  文件将解压到/usr/src/linux目录中,我们把它稍作修改:



#mv linux linux-2.4.18

#ln -s linux-2.4.18 linux



  如果下载的是patch文件,就可以进行patch操作(下面假设patch-2.4.18已经位于
/usr/src目录下了,否则你需要先把该文件拷贝到/usr/src下):



#patch -p0 < patch-2.4.18



  

六、内核编译

  通常要运行的第一个命令是:



#cd /usr/src/linux

#make mrproper



  该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖.我们使用刚
下载的完整的源程序包进行编译,本步可以省略.而如果你多次使用了这些源程序编
译内核,那么最好要先运行一下这个命令.

  确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码的.
它们分别链向源代码目录下的真正的、该计算机体系结构(对于PC机来说,使用的体系结
构是i386)所需要的真正的include子目录.如:asm指向/usr/src/linux/include/asm-i386
等.若没有这些链接,就需要手工创建,按照下面的步骤进行:



# cd /usr/include/

# rm -r asm linux scsi

# ln -s /usr/src/linux/include/asm-i386 asm

# ln -s /usr/src/linux/include/linux linux

# ln -s /usr/src/linux/include/scsi scsi



  这是配置非常重要的一部分.删除掉/usr/include下的asm、linux和scsi链接后,再
创建新的链接指向新内核源代码目录下的同名的目录.这些头文件目录包含着保证内核在
系统上正确编译所需要的重要的头文件.现在你应该明白为什么我们上面又在/usr/src下
"多余"地创建了个名为linux的链接了吧?



  接下来的内核配置过程比较烦琐,但是配置的适当与否与日后linux的运行直接相关,
有必要了解一下一些主要的且经常用到的选项的设置.

  

配置内核可以根据需要与爱好使用下面命令中的一个:



#make config(基于文本的最为传统的配置界面,不推荐使用)

#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)

#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)

#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)



  这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐
你使用这个命令,界面如下:



  如果你不能使用Xwindow,那么就使用make menuconfig好了.界面虽然比上面一个差
点,总比make config的要好多了,下图为make menuconfig的界面:





  选择相应的配置时,有三种选择,它们分别代表的含义如下:

  Y--将该功能编译进内核

  N--不将该功能编译进内核

  M--将该功能编译成可以在需要时动态插入到内核中的模块

  如果使用的是make xconfig,使用鼠标就可以选择对应的选项.如果使用的是
make menuconfig,则需要使用空格键进行选取.你会发现在每一个选项前都有个括号, 但
有的是中括号有的是尖括号,还有一种圆括号.用空格键选择时可以发现,中括号里要么
是空,要么是"*",而尖括号里可以是空,"*"和"M".这表示前者对应的项要么不要,要么
编译到内核里;后者则多一样选择,可以编译成模块.而圆括号的内容是要你在所提供的
几个选项中选择一项.

  在编译内核的过程中,最烦杂的事情就是这步配置工作了,很多新手都不清楚到底该
如何选取这些选项.实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根
据用户不同的需要选择.选择的原则是将与内核其它部分关系较远且不经常使用的部分功
能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能
相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密经常使用
的部分功能代码直接编译到内核中.



至于选项,比较复杂,只是简单做一介绍,编译时应视具体情况,参考帮助的内容再
加以选择.



1. Code maturity level options

  代码成熟等级.此处只有一项:prompt for development and/or incomplete code/drivers,
如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就把该项选择为Y了;
否则可以把它选择为N.



2. Loadable module support

  对模块的支持.这里面有三项:



  Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的.

  Set version inFORMation on all module symbols:可以不选它.

  Kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上.



3. Processor type and features

  CPU类型.内容蛮多的,不一一介绍了,有关的几个如下:



  Processor family:根据你自己的情况选择CPU类型.

  High Memory Support:大容量内存的支持.可以支持到4G、64G,一般可以不选.

  Math emulation:协处理器仿真.协处理器是在386时代的宠儿,现在早已不用了.

  MTTR support:MTTR支持.可不选.

  Symmetric multi-processing support:对称多处理支持.除非你富到有多个CPU,否则就不用选了.



4. General setup

  这里是对最普通的一些属性进行设置.这部分内容非常多,一般使用缺省设置就可以了.下面介绍一下经常使用的一些选项:



  Networking support:网络支持.,没有网卡也建议你选上.

  PCI support:PCI支持.如果使用了PCI的卡,当然必选.


重启以后就可以用新内核了.





凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号