RHEL内核源码编译实例讲解



RHEL内核源码编译实例讲解。

1. 环境说明

使用的是RHEL6.3的系统:

$cat /etc/issue
Red Hat Enterprise Linux Server release 6.3
$uname -a
Linux myhost 2.6.32-279.el6 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

#useradd mockbuild #解决warning: user mockbuild does not exist – using root 问题

#groupadd mockbuild #解决warning: group mockbuild does not exist – using root问题

2. 需要的RPM包
安装基本工具包:rpm-build redhat-rpm-config unifdef。一般情况这三个包都是安装过的,检查一下即可。

$sudo yum install rpm-build
Package rpm-build-4.4.2.3-18.el5.x86_64 already installed and latest version
$sudo yum install redhat-rpm-config
Package redhat-rpm-config-8.0.45-32.el5.noarch already installed and latest version
$sudo yum install unifdef
Package unifdef-1.171-5.fc6.x86_64 already installed and latest version
3. 下载并安装源码包
红帽内核源码包地址:http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/


*************************************************************************

本文以RHEL5内核源码为例,介绍内核的自动编译和手动编译。
非RHEL内核编译
对于非RHEL内核,编译内核只需四个步骤:
(1)清理临时文件
#make clean
(2) 配置内核
可以通过执行menuconfig命令或将其他内核版本的config配置文件保存为待编译内核源码目录下.config文件。
#make menuconfig
(3)编译内核
make bzImage V=1
(4)make modules编译模块
(4) make
若当前系统有多个CPU核,可以通过make –j <进程数>来加快内核编译速度。如:
#make –j32
(5) make modules_install
(6) make install
本命令自动修改grub
或者受到cp文件。。。再 手动改grub
重启系统,选择新内核版本即可。
RHEL内核编译
自动编译
可以从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
或者 # rpm -ivh kernel-2.6.18-128.el5.src.rpm –prefix/usr/src #强制安装到/usr/src目录
5、下载unifdef-1.171-5.fc6.src.rpm源码包,生成并安装rpm包。(RHEL4系列系统中必需)
6、进入/usr/src/redhat/SPECS目录,会发现kernel-2.6.spec文件(或者在/root/rpmbuild/SPECS目录下)
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
以下的步骤参考(
非RHEL内核编译
)吧。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
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

参考:http://blog.csdn.net/lishenglong666/article/details/7320864
******************************************
~/.rpmmacros文件用以修改rpm打包的默认路径
更改默认路径的方法是,在用户目录下添加一个.rpmmacros文件
例:
电脑登录用户名是sysadm
则在/sysadm/
目录下新建.rpmmacros文件
文件内容:
%_topdir /home/aa
这样,默认路径就改为/home/aa
当然,你自己需要在/home/aa目录下(mkdir)新建BUILD,SOURCES,SPECS,RPMS,SRPMS几个文件夹,用于rpm的打包。
**********其他方法*****************
#rpm -ivh –prefix /usr/local filename.rpm
#强制安装到/usr/local目录下边

*******************************************************************************************

非RHEL内核编译
对于非RHEL内核,编译内核只需四个步骤:
(1) 配置内核
可以通过执行menuconfig命令或将其他内核版本的config配置文件保存为待编译内核源码目录下.config文件。
(2) make
若当前系统有多个CPU核,可以通过make –j <进程数>来加快内核编译速度。如:
#make –j32
(3) make modules_install
(4) make install
重启系统,选择新内核版本即可。