本文以RHEL5内核源码为例,介绍内核的自动编译和手动编译。
非RHEL内核编译
对于非RHEL内核,编译内核只需四个步骤:
(1) 配置内核
可以通过执行menuconfig命令或将其他内核版本的config配置文件保存为待编译内核源码目录下.config文件。
(2) make
若当前系统有多个CPU核,可以通过make –j <进程数>来加快内核编译速度。如:
#make –j32
(3) make modules_install
(4) make install
重启系统,选择新内核版本即可。
自动编译
可以从redhat官方网站下载源码rpm包,然后通过rpmbuild命令,自动编译生成内核安装包。
操作步骤:
1、载Redhat内核源码包
RHEL5系列内核源码链接为:
ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/
RHEL5.3内核源码包文件为kernel-2.6.18-128.el5.src.rpm。
RHEL6系列内核源码链接为:
ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/
RHEL6内核源码包文件为kernel-2.6.32-71.el6.src.rpm。
2、将下载到的源码包文件拷贝到机器上。
3、创建mockbuild用户和组
[root@houyi-vm33 ~]# groupadd mockbuild
[root@houyi-vm33 ~]# useradd mockbuild -g mockbuild
4、安装内核源码包到系统中
[root@houyi-vm33 ~]# rpm -ivh kernel-2.6.18-128.el5.src.rpm
warning: kernel-2.6.18-128.el5.src.rpm: V3 DSA signature: NOKEY, key ID 37017186
1:kernel ########################################### [100%]
[root@houyi-vm33 ~]#
5、下载unifdef-1.171-5.fc6.src.rpm源码包,生成并安装rpm包。(RHEL4系列系统中必需)
(1)安装源码包
[root@houyi-vm33 ~]# rpm -ivh unifdef-1.171-5.fc6.src.rpm
warning: unifdef-1.171-5.fc6.src.rpm: V3 DSA signature: NOKEY, key ID 37017186
1:unifdef warning: user brewbuilder does not exist – using root
warning: group brewbuilder does not exist – using root
warning: user brewbuilder does not exist – using root
warning: group brewbuilder does not exist – using root
########################################### [100%]
(2)编译源码包
[root@houyi-vm33 ~]# cd /usr/src/redhat/SPECS/
[root@houyi-vm33 SPECS]# ls
kernel-2.6.spec unifdef.spec
[root@houyi-vm33 SPECS]# rpmbuild -ba unifdef.spec
(3)安装RPM安装包
[root@houyi-vm33 SPECS]# rpm -ivh /usr/src/redhat/RPMS/x86_64/unifdef-1.171-5.x86_64.rpm
Preparing… ########################################### [100%]
[root@houyi-vm33 SPECS]#
6、进入/usr/src/redhat/SPECS目录,会发现kernel-2.6.spec文件
[root@houyi-vm33 ~]# cd /usr/src/redhat/SPECS/
[root@houyi-vm33 SPECS]# ls
kernel-2.6.spec unifdef.spec
[root@houyi-vm33 SPECS]# pwd
/usr/src/redhat/SPECS
[root@houyi-vm33 SPECS]#
7、使用rpmbuild编译内核RPM包
[root@houyi-vm33 SPECS]# rpmbuild -ba kernel-2.6.spec
执行上面命令后,在当前Westmere服务器中编译等待约20分钟,内核RPM安装包制作完成。我们就可以直接使用rpm命令升级到新内核了。
… …
Wrote: /usr/src/redhat/SRPMS/kernel-2.6.18-128.el5.src.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/kernel-2.6.18-128.el5.x86_64.rpm
Wrote: /usr/src/redhat/RPMS/x86_64/kernel-devel-2.6.18-128.el5.x86_64.rpm
… ..
常见问题:
在编译内核源码过程中,通常会出现以下提示,编译无法正常继续运行。
gpg: WARNING: unsafe permissions on homedir “.”
gpg: keyring `./secring.gpg’ created
gpg: keyring `./pubring.gpg’ created
++++++++++++++++++++.++++++++++++++++++++.++++++++++.
+++++++++++++++++++++++++.++++++++++.+++++++++++++++..
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 276 more bytes)
解决办法:
(1)创建一个大文件
[root@houyi-vm33 ~]#
[root@houyi-vm33 ~]#dd if=/dev/zero of=zero.img bs=1M count=512
(2)将文件内容cat到/dev/null设备中
[root@houyi-vm33 ~]# cat zero.img > /dev/null
(3)将大文件发送到root用户
[root@houyi-vm33 ~]# sendmail root@root < zero.img
一会编译内核就可继续进行。
手工编译
若希望修改部分内核源码,然后再升级内核,可采用手工编译内核的方式。
下载源码和安装RPM源码包步骤同上。
操作步骤:
1、载Redhat内核源码包
2、将下载到的源码包文件拷贝到机器上。
3、创建mockbuild用户和组
[root@houyi-vm33 ~]# groupadd mockbuild
[root@houyi-vm33 ~]# useradd mockbuild -g mockbuild
4、安装内核源码包到系统中
[root@houyi-vm33 ~]# rpm -ivh kernel-2.6.18-128.el5.src.rpm
5、下载unifdef-1.171-5.fc6.src.rpm源码包,生成并安装rpm包。(RHEL4系列系统中必需)
6、进入/usr/src/redhat/SPECS目录,会发现kernel-2.6.spec文件
7、使用rpmbuild –bp参数生成RHEL相应版本内核源码
[root@houyi-vm33 SPECS]# rpmbuild -bp kernel-2.6.spec
这个过程就是给解压缩标准内核源码和安装patch。若提示错误,可以在rpmbuild命令中加上—nodeps参数。
8、进入/usr/src/redhat/BUILD目录,就可以找到生成的源码目录
[root@houyi-vm33 BUILD]# pwd
/usr/src/redhat/BUILD
[root@houyi-vm33 BUILD]# ls
kernel-2.6.18 unifdef-1.171
一般Redhat生成的内核源码目录名为kernel-2.6.18,如我们编译RHEL5.3源码,则该目录的源码实际为kernel-2.6.18-128.el5。
9、进入/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64目录
[root@houyi-vm33 linux-2.6.18.x86_64]# pwd
/usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64
10、根据编译内核版本,调整.config和Makefile文件
(1)调整config文件
若希望编译标准RHEL5.3 xen内核,直接将configs/ kernel-2.6.18-x86_64-xen.config拷贝成.config文件即可。
[root@houyi-vm33 linux-2.6.18.x86_64]# ls configs/*
configs/kernel-2.6.18-x86_64.config configs/kernel-2.6.18-x86_64-xen.config
configs/kernel-2.6.18-x86_64-debug.config
[root@houyi-vm33 linux-2.6.18.x86_64]# cp configs/kernel-2.6.18-x86_64-xen.config .config
cp: overwrite `.config’? y
[root@houyi-vm33 linux-2.6.18.x86_64]#
(2)调整Makefile文件中对应的内核版本名称
[root@houyi-vm33 linux-2.6.18.x86_64]# vim Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
EXTRAVERSION = -prep //若我们编译内核版本为2.6.18-128.el5xen,将-prep改为-128.el5xen即可。
RHEL_MAJOR = 5
RHEL_MINOR = 3
NAME=Avast! A bilge rat!
11、编译和安装内核
[root@houyi-vm33 linux-2.6.18.x86_64]# make -j32 && make modules_install && make install
在Westmere 服务器上(2颗CPU),编译内核过程中只要需要约5分钟时间即可完成。
编译和安装成功后,重启机器在Grub中就可以选择新内核版本启动了。
常见问题:
在RHEL4系列系统中,若安装内核过程中出现提示无法生成或更新/boot目录下的initrd文件,可以mptscsi一行注释掉即可。
[root@chen]# vim /etc/modprobe.conf
alias scsi_hostadapter mptbase
#alias scsi_hostadapter1 mptscsi
Leave a Reply