内核编译
(一)什么是内核
内核也是程序。它是操作系统最基本的组成部分。其他程序
通过调用内核提供的接口调用物理设备完成具体的工作。
(二)linux内核
1、/boot/vmlinuz.x.x.x是当前系统使用的内核文件。该
文件会在开机过程中被读入引导启用我们所使用的操作
vmlinuz.x.x.x文件本质是经过bzip2压缩的内核
2、主版本号后的次版本分为单数系和双数系
1)单数系:用来测试的版本,如2.5
2)双数系:稳定的版本,如2.6
3、获取linux内核的渠道
1)“公版内核”的源码可访问www.kernel.org下载。
2)"发行版内核"可以去发行版的开源社区下载
Redhat修改的内核源码可访问ftp.redhat.com下
载。但是,下载的是srcrpm包,还需要进行编译或
提取才可使用。
4、升级内核的原因
1)需要新的功能
例如RHEL5默认内核中没有加入对ntfs文件系统的支持
2)需要定制内核(增加功能和裁剪)
3)改进稳定性
4)修补漏洞
注意:如果没有以上特别的需要,通常无需频繁更新内核。特别是在生产环境中,我们追求的是稳定性,而不是赶时髦!
5、如何定制或升级内核
方法一: rpm或yum命令升级内核
必须是RHEL付费用户或CentOS这类发行版的用户才可以方便的使用此种方式
方法二:使用“公版”内核源码编译升级
redhat发行版为了追求稳定性,往往内核版本较低。使用公版可以更新最新版本的内核,但是相对的redhat为内核所做的那些稳定性和优化补丁就会丢失。
1)访问www.kernel.com,
注意不建议升级到3.8跨大版本的升级,建议在版本
范围内进行相应的升级。
点击tar.xz下载。
下载完毕。
tar.xz文件的解压:
首先需要下载xz工具,
http://tukaani.org/xz/xz-4.999.9beta.tar.bz2
安装:
1>tar -jxvf xz-4.999.9beta.tar.bz2
2>cd xz-4.999.9beta
3>./configure --prefix=/
4>make
5>sudo make install
解压方法:
1>xz -d **.tar.xz
2>tar -xvf **.tar
2)将内核文件拷贝到/tmp目录下并解压
执行tar -xvf linux-2.6.32.60.tar,切换到
linux-2.6.32.60目录下,即可显示linux内核的源代码
3)编译内核的方式
(1)make config 在字符界面下以一问一答的形
式让用户选择linux kernel中的各项
编译参数的选择。
缺点是需要选择的参数多;并且一旦
选择错误无法更正。
(2)make xconfig 图像界面的内核编译选择程序。
由于生产环境中的服务器不安装
xwindow图像界面,所以一般无法使用
(3)make menuconfig 最为常用的内核编译选择程序。
在字符界面下开启一个为图像界
面帮助用户进行选择。
如果显示过小会提示错误,
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
解决方法是将Terminal字体改小.
linux内核是对各项硬件设备支持和相应功能模块的组成。
注意:linux的内核升级变化迅速,并且不同版本的linux相应
的选单内容也会发生变化。所以不能以某个版本的文档为
标准。对内核的详细变迁了解以官网的发布为准。
file systems 文件系统相应的支持
该程序的使用方式:
<1> ← → 控制select(选择)和exit(退出或返回上一级)
help(相应选项的帮助)
<2> ()或者<>表示该选项可以被选择成为模块,也可以编译进内核。
<3> 编译内核选择功能时有两种方式:
一种是直接编译进内核内部:
另一种是编译成模块,模块在内核应用到时加载
注意:不是所有选项都可以编译进内核和模块两种的。
<>表示的既能编译进内核的基本组成部分,又能编译成
模块的;<>首次选中显示M,表示二者都可。
再次选中显示*,表示把该选项编译进内核
内部,不把它编译成模块。
[]选择后[]内变成*显示的,表示只能编译进内核内部,
不能编译成模块
如
经验:由于内核需要选择的选项非常多,容易造成漏选或误选,
导致内核编译失败,无法正常使用。
避免方法:当执行make menuconfig修改相应选项后,
在内核的源代码中会显示.config文件
.config文件是配置文件,记录着对当前内核
编译的选项。
当前正在使用的内核,配置文件默认放在/usr/src/kernels/目录下,
该目录下基本为空。因为redhat出于商业目的只提供linux内核的源代码架构,不提供内容。但受制于GPL协议,所以以相应的src rpm包(源代码rpm包)的方式发布到其官方网站上,使用时需到redhat官网上下载再编译成源代码包或rpm包才能再编译使用。
将.config文件拷贝到/tmp/linux-2.6.32.60目录下
按照习惯,我们一般将linux内核文件放在
/usr/src/kernels/2.6.18.194.el5-i686目录下,现在将
内核文件移动到该目录下
然后cd linux-2.6.32.60/,重新执行make menuconfig,然后把.config这个配置文件读取进来,
默认就是.config,点击OK
可以继续其他相应功能,比如我们选择NTFS文件格式写的支持;
选择完毕,就可以开始编译了
现在对于linux内核的配置选项已经完成。
现在我们执行make命令开始编译,需要等待一段时间
编译完毕之后,执行make modules命令单独将内核中选择成为模块的部分再编译一次。
现在编译的部分已经结束,编译的结果存放在当前目录中,
执行make install命令安装内核,提示错误
因为/lib/modules/不存在对应目录,需要创建
再次执行make install安装。make install执行的过程:往/boot/拷贝了新的内核文件vmlinuz-2.6.32.60和
initrd-2.6.32.60.img文件
修改了/grub/grub.conf文件
vi /grub/grub.conf
然后执行make module_install安装模块(当前目录必须在/usr/src/kernels/linux-2.6.32.60/)
重新启动计算机,内核选项会出现2.6.32.60选项,进入系统,内核升级完成。
注意:虚拟机升级会出现失败。
方法三:使用RedHat发布的SRCRPM包编译升级
访问ftp://ftp.redhat.com/
点击redhat ,点击linux ,点击
enterprise ,点击5server ,点击en ,
点击os ,点击SRPMS ,
现在如果我们不仅需要使用reahat发布的内核,又要编译出
新的功能模块。我们必须到redhat官方网站的这个目录下下
载对应内核版本的src rpm包进行编译。从里面获取相应的
源代码程序;然后再进行编译。
执行uname -a获取我们现在使用的内核版本
回到网站的目录下搜索相应本版的内核
点击下载,下载完毕进入下载目录
现在我们从redhat发布的
kernel-2.6.18.-194.26.1.el5.src.rpm包中提取redhat内核源代码,并且进行编译
执行rpm -ivh kernel-2.6.18-194.26.1.el5.src.rpm安装,安装的目录是/usr/src/redhat/
该目录下有5个目录,这5个目录又被称为构建rpm的工厂。
SOURCES 目录放置的是构建rpm包的源代码包程序;
其中linux-2.6.18.tar.bz2文件是linux公版的内核
.patch文件是redhat为公版内核打的补丁。
所以如果需要redhat已经打过补丁的linux源代码,需要先把linux-2.6.18.tar.bz2解压得到公版的内核源代码,然后执行patch命令将补丁逐个打到源代码包内。
但是patch文件数量非常多。
SPECS目录下的kernel-2.6.spec文件描述了构建rpm包所经历的各种步骤,其中包括将这些源代码进行解包和打补丁的整个过程。
利用kernel-2.6.spec文件帮助我们做完解压缩源代码包再打补丁的过程,而不需要生成rpm包。
如果利用该文件制作rpm包,内核需要反复编译4次,非常耗费时间,没有必要编译完整个内核生成rpm包;只需要提取源代码程序即可。
rpmbuild -bp kernel-2.6.spec --target=i686
构建rpm包 制作成i686的版本
-b 创建
p (prepare)前期准备
编译完毕,进入BUILD/kernel-2.6.18/linux-2.6.18.i686/目录,该目录存放的就是redhat发布的打过补丁的内核。
接下来编译的步骤和linux公版的内核编译相同
执行make menuconfig,选中相应的选项,然后执行make命令开始编译。
生产中,如果需要对内核模块做一些新的变化,如增加一个功能,一般无需将内核完全编译,只需要下载相对应内核版本的src rpm包,解压出rpm包,编译指定的模块即可。