1 centos6.2 内核编译定制技能详解
在学习了第三章在centos5.2平台上进行内核定制编译后,我们再以centos6.2为例,完整的走一遍,基本步骤是一样的,细节上可能会略有差异,大家可以继续在虚拟机上快速实战,内核定制编译讲究的是熟练操作,能够在后续我们内核实战学习中辅助我们进行内核代码调试及内核功能开发。
1.1 安装内核源码
1.1.1 下载官方内核源码
大家可以从下面官方路径下载内核源码包,或者课堂上我们会单独拷贝给大家进行实战练习。
Centos62源码路径:
http://vault.centos.org/6.2/os/Source/SPackages/kernel-2.6.32-220.el6.src.rpm
1.1.2 安装官方内核源码
首先我们配置一下rpmmacros宏定义文件,这个文件用于指导rpmbuild命令,该命令以及rpm我们放在第5章进行详细介绍,现在我们先要了解基本步骤和会熟练使用:
echo “%_topdir /usr/src/redhat” > ~/.rpmmacros
然后安装源码src.rpm包:
rpm -ihv kernel-2.6.32-220.el6.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild –bp - -target x86_64 kernel.spec
可以将内核源码安装至/usr/src/redhat/目录中。
F 注意保证剩余空间至少10G,不然编译时会报剩余空间不足。
1.2 内核patch
1.2.1 给内核打入一个真实功能的patch
以scst和iscsi-scst模块为例介绍centos6.2内核打patch过程,大家可以不必过多学习scst的知识,这里只是以两个实用的模块作为一个例子,实战练习如何在centos6.2上给内核进行打patch。这两个内核patch可以从以下链接中找到 或者 课堂我们也会拷贝给大家进行现场练习:
scst模块官网路径:
https://scst.svn.sourceforge.net/svnroot/scst/trunk/;
patch路径为:
scst/kernel/rhel/scst_exec_req_fifo-2.6.32.patch;
iscsi-scst/kernel/patches/rhel/put_page_callback-2.6.32-220.patch
1.2.2 验证patch的正确性
进入目录
/usr/src/redhat/BUILD/kernel-2.6.32-220.el6/linux-2.6.32-220.el6.x86_64可以看到centos6.2源码安装在此路径下。
1. 修改scst和iscsi-scst的patch,将所有函数中定义的int res;修改成intres=0;(不做修改,编译内核时会报错误)
2. 进入/usr/src/redhat/BUILD的源码目录下运行命令:
patch-p1 < scst_exec_req_fifo-2.6.32.patch;
patch -p1 < put_page_callback-2.6.32-220.patch
打patch时如果提示有问题,一般都是patch中需要修改的地方与patch中标注的位置不匹配:
1. 如果提示success,不需要改动;
2. 如果提示failure,则patch文件有误,需要下载正确的patch。
1.3 配置内核
1.3.1 配置文件
Centos6.2配置文件(.config)全部是通过config-*开头的文件生成的,这些config-*针对不同的架构有对应的config-*,以x86架构为例,如果文件内容中有相同的内核配置信息,优先使用顺序为:
1. config-x86_64-nodebug-rhel, config-x86_64-nodebug
2. config-x86_64-generic-rhel, config-x86_64-generic
3. config-nodebug-rhel, config-nodebug
为了配置自己的内核我们需要在原有的config-*中加上自己的配置,配置时,如优先级较高的配置文件某个选项已经被选中则低优先级的config-*文件不需要在更改。
1.3.2 查找内核修改项
接着执行:make menuconfig,我们以定制XFS 文件系统为例进行实战。
n 打开XFS选项,编译成内核模块
u Filesystems --->
u <M>XFSfilesystem support
u [*] XFS Quota support
u [*] XFS POSIX ACL support
u [*] XFS Realtime subvolume support
n 打开scst网络相关参数(此部分只有在打了scst和iscsi-scst的patch后才能出现)
u Networkingsupport --à
l Networkingoptions -à
n [*]TCP/IPzero-copy transfer completion notification
配置时可以按h键查看每一内核选项的详细介绍,包括每一选项的名称、依赖等信息。记录下修改的几个选项的名称以及其临近的选项名称(用于定位其在config文件中的具体位置)。
1. XFS文件系统相关:CONFIG_XFS_RT,其附近选项:
CONFIG_XFS_FS=m
2. Scst和iscsi-scst相关:
CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION,其附近选项:
CONFIG_INET=y
到现在为止,我们可以执行make&& make modules && make modules_install && make install完成内核编译了,但是我们继续介绍如何制作内核的rpm包,将我们的内核最终放在rpm包中,这样我们就能发布我们自己制作的内核了。具体rpm的介绍我们放在第5章详细介绍,我们继续往下走。
1.3.3 修改并保存内核定制过程中的配置文件
1. 进入目录:
/usr/src/redhat/BUILD/kernel-2.6.32-220.el6/linux-2.6.32-220.el6.x86_64拷贝配置文件并返回上层目录,执行如下命令:
cp config-* ../. && cd ..
2. 搜索所有包含CONFIG_XFS_FS的config-*文件:
grep CONFIG_XFS_FSconfig-*,
结果包含以下文件:
a) config-generic
b) config-i686-rhel
c) config-powerpc-generic-rhel
d) config-s390x-rhel
在x86_64环境中,只需要修改文件config-generic,将
#CONFIG_XFS_RT is not set修改成CONFIG_XFS_RT=y即可。
3. 搜索所有包含CONFIG_INET的config-*文件:
grep -r CONFIG_INET config-*
结果包含以下文件:
a) config-generic
b) config-s390x-kdump
只需要修改文件config-generic,在CONFIG_INET=y行下面加CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION=y即可。
4. 保存最终被修改的配置文件config-generic,执行以下命令:
cp config-generic /usr/src/redhat/SOURCES/
覆盖SOURCES目录下的config-generic文件。
1.4 修改spec文件及制作rpm包
1.4.1 spec文件修改
进入目录/usr/src/redhat/SPECS,在文件kernel.spec中搜索Patch999999,然后添加如下项:
Patch999998: put_page_callback-2.6.32-220.patch
Patch999997: scst_exec_req_fifo-2.6.32.patch
搜索ApplyOptionalPatchlinux-kernel-test.patch,在ApplyOptionalPatch linux-kernel-test.patch之后添加
ApplyOptionalPatchscst_exec_req_fifo-2.6.32.patch
ApplyOptionalPatchput_page_callback-2.6.32-220.patch
搜索buildid,然后在下面添加:%define buildid .talk,
修改此值,可以改变生成的rpm包的名称,如下(红色部分为buildid):
修改前:kernel-2.6.32-220.el6.x86_64.rpm
修改后:kernel-2.6.32-220.el6.talk.x86_64.rpm
1.4.2 生成rpm包
拷贝scst_exec_req_fifo-2.6.32.patch/put_page_callback-2.6.32-220.patch到/usr/src/redhat/SOURCES目录下;
进入目录/usr/src/redhat/SPECS,执行如下命令:
rpmbuild -ba --with baseonly --with firmware --without kabichk--target=`uname -m` kernel.spec
此命令最终会生成:源码包、rpm包(包括debug包,可用于内核代码调试),可以分别进入/usr/src/redhat/RPMS和/usr/src/redhat/SRPMS中查看。