拿升级RHEL5.1默认xen-2.6.18-53内核至xen-2.6.18-92(RHEL5.2默认内核版本)来说事。
下载对应内核源码包:
http://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/kernel-2.6.18-92.el5.src.rpm
先解决依赖问题:
libgomp-4.1.2-14.el5.i386.rpm
kernel-headers-2.6.18-53.el5.i386.rpm
glibc-headers-2.5-18.i386.rpm
glibc-devel-2.5-18.i386.rpm
gcc-4.1.2-14.el5.i386.rpm
elfutils-libs-0.125-3.el5.i386.rpm
elfutils-0.125-3.el5.i386.rpm
rpm-build-4.4.2-47.el5.i386.rpm
unifdef-1.171-5.fc6.i386.rpm
redhat-rpm-config-8.0.45-22.el5.noarch.rpm
ncurses-devel-5.5-24.20060715.i386.rpm
# rpm -ivh libgomp-4.1.2-14.el5.i386.rpm&&rpm -ivh kernel-headers-2.6.18-53.el5.i386.rpm&&rpm -ivh glibc-headers-2.5-18.i386.rpm&&rpm -ivh glibc-devel-2.5-18.i386.rpm&&rpm -ivh gcc-4.1.2-14.el5.i386.rpm&&rpm -ivh elfutils-libs-0.125-3.el5.i386.rpm&&rpm -ivh elfutils-0.125-3.el5.i386.rpm&&rpm -ivh rpm-build-4.4.2-47.el5.i386.rpm&&rpm -ivh unifdef-1.171-5.fc6.i386.rpm&&rpm -ivh redhat-rpm-config-8.0.45-22.el5.noarch.rpm
安装源码包:
# rpm -ivh kernel-2.6.18-92.el5.src.rpm
生成内核源码:
# rpmbuild -bp --target=`uname -m` /usr/src/redhat/SPECS/kernel-2.6.spec
# uname -r
得知本机TYPE为xen。
# vi /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`/Makefile
将“EXTRAVERSION = -prep”改为“EXTRAVERSION = -92.el5xen”,其中“xen”是必需的。
# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`
# cp /boot/config-`uname -r` .config
# make oldconfig
使用系统原.config会询问新选项。既然是升级,内核编译的新选项看不懂,就都选n好了。反正按原来的配置就能用,我觉得不知道怎么定制内核新选项还是不启用的好。
# uname -i
得知i386,
# vi /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`/.config
第一行原来只有一个井号,现改为“# i386”,井号和“i386”间有一个空格。
将内核定制文件保存至内核源代码中:
# cp /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`/.config /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`/configs/kernel-2.6.18-`uname -m`-xen.config
# cp /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.`uname -m`/.config /usr/src/redhat/SOURCES/kernel-2.6.18-`uname -m`-xen.config
打开“/usr/src/redhat/SPECS/kernel-2.6.spec”文件,确保“%define buildid”没有被注释起来;
如果有补丁要打,搜索“Patch”,找到patch的声明部分,并在当中添加一行自己的patch声明:
Patch40000: my-custom-kernel.patch
使用从40000开始的序列号可以保证不与系统patch冲突。添加前搜索下pathc序列号是否已存在便是。
再搜索“%patch”部分,并在当中添加一行:
%patch40000 -p1
确保之后的rpmbuild自动应用补丁(注意“p1”是一二三四的1);
编译成内核rpm包:
# rpmbuild -bb --target=`uname -m` --with xenonly --without debug --without debuginfo /usr/src/redhat/SPECS/kernel-2.6.spec
rpmbuild命令编译选项:
--with baseonly
--with xenonly
--without up
--without xen
--without debug
--without debuginfo
--without fips
--without kabichk
编译完成后,产生内核更新包:
/usr/src/redhat/RPMS/i686/kernel-xen-2.6.18-92.el5.i686.rpm
/usr/src/redhat/RPMS/i686/kernel-xen-devel-2.6.18-92.el5.i686.rpm
安装内核更新包:
# rpm -Uvh /usr/src/redhat/RPMS/i686/kernel-xen-2.6.18-92.el5.i686.rpm
重启,内核更新就生效了~
总结:看来所谓升级内核就是更新内核安装包。更新内核很快,但是编译很慢。而且最主要的问题在于.config文件配置的复杂性,可能导致定制出性能拙劣的内核。还是去下官方的内核安装包吧。注意内核安装包和一般rpm包不同,不能下CentOS的内核安装包,CentOS有自己的定制方式。可以下新版本RHEL的disc1,其中包含这个其对应版本的内核安装包。
查看本机内核安装包:
# rpm -qa|grep kernel
看见什么就更新什么,更新kernel-headers前需安装gcc。如果先更新了kernel-headers再装原光盘中的gcc包会报错。
RedHat官方公布的内核RPM包的MD5:
http://rhn.redhat.com/errata/RHBA-2008-0314.html
kernel-xen-2.6.18-92.el5.i686.rpm
MD5:0f2273ec19a037f392a46067cdb9c11c
kernel-headers-2.6.18-92.el5.i386.rpm
MD5:a83bb33c9f8eebba673d90c7ea0fedfa