Documents/Kernel build

出自淘宝内核组

跳转到: 导航, 搜索

目录

本地编译

下载淘宝内核树

git clone https://github.com/taobao/taobao-kernel.git

在淘宝内核树下有三个branch, 5u, 6u和master。5u是针对RHEL5环境下编译内核的源码,6u是针对RHEL6环境下编译内核的源码,master是放置我们最新开发的patch的地方,这里的代码通常是不稳定的。 :) 所以请选择正确的源码树编译。

[注意]:在编译内核之前,请确定内核代码是维护正确的branch下。

如果内核是要运行在RHEL6系列操作系统上,则需要切换到6u的branch下

git checkout -b 6u origin/6u

如果是在RHEL5系列操作系统上运行,则需要切换到5u的branch下

git checkout -b 5u origin/5u

生成编译环境

scripts/package.py [--buildid {number}]

这个命令会生成一个叫 taobao-kernel-build 的子目录,里边放置了编译所需的全部文件,在此目录里做rpmbuild即可本地编译生成kernel rpm包。 buildid用来指定生成的RPM包的build number,YUM在安装RPM包时会凭借此序号来判断各个RPM包的新旧(例如kernel-2.6.32-220.23.1.tb750.el5.x86_64.rpm, 这表示此RPM为2.6.32内核的第750次build).如果您只是自己编译使用,则此序号可以随意指定.若没有指定buildid,则默认为1.

编译

cd taobao-kernel-build
rpmbuild -bb kernel.spec --define="_sourcedir `pwd`" --define="_builddir `pwd`" --define="_rpmdir `pwd`/rpm"

使用--define="_rpmdir `pwd`/rpm"后最终生成的rpm包会放在 `pwd`/rpm/$arch/下。请根据需要更改。 其他经常用到的参数有:

--with rhel5 指定编译出来的内核会被安装在RHEL5上。如果不加这个参数,则默认是要安装在RHEL6上。
--without firmware 不出kernel-firmware包(默认要出firmware)
--with baseonly 只出最主要的kernel,kernel-headers,kernel-devel和kernel-firmware包,可用于验证代码是否正确,编译能否通过,打包是否正确等等。
--without kdump 不出kernel-kdump包(默认要出kernel-kdump,若已指定--with baseonly则不需要加此开关)
--without debug 不出kernel-debug包(默认要出kernel-debug,若已指定--with baseonly则不需要加此开关)
--without headers 不出kernel-headers包 (默认要出kernel-headers)
--without perftool
--without perf 不出perf相关的包 (默认要出perf包,若已指定--with baseonly则不需要加此开关)
--without debuginfo 不出kernel-debuginfo包 (默认要出kernel-debuginfo,若已指定--with baseonly则不需要加此开关)
--without dracut 指定在生成boot image时new-kernel-pkg不要使用dracut,而是使用mkinitrd (默认使用dracut,而RHEL 5u4根本没有dracut,因此在5u4上编译时必须指定此开关)

例如,rpm/taobao-kernel-build.sh是ABS编译内核时使用的脚本,其调用的rpmbuild命令如下:

 rpmbuild -bb  --rmsource *.spec --without debuginfo --without dracut --without debug --define="_rpmdir $1/rpm" --define="_builddir $1/taobao-kernel-build" --define="_sourcedir $1/taobao-kernel-build" --define="_tmppath $1/rpm"

例如,在自己的RHEL 5u4机器上进行本地编译时,如果只是希望验证code base能顺利通过编译,则合适的rpmbuild命令是:

rpmbuild -bb kernel.spec --with rhel5 --with baseonly --without dracut --define="_sourcedir `pwd`" --define="_builddir `pwd`" --define="_rpmdir `pwd`/rpm"

如果希望在RHEL 5u4机上生成较完整的各种包,则合适的rpmbuild命令可能是:

rpmbuild -bb kernel.spec --with rhel5 --without dracut --define="_sourcedir `pwd`" --define="_builddir `pwd`" --define="_rpmdir `pwd`/rpm"

这表示为了节约编译时间,ABS不需要debuginfo包(暂时没有调试需求),不出debug包(线上不会使用debug内核),不使用dracut来生成/boot/initramfs-xxx(rhel 5u4上根本>没有dracut)

后边的若干--define指定了给rpmbuild使用的_rpmdir,_builddir,_sourcedir等环境变量。如果不指定这些rpmbuild默认会去~/rpmbuild目录下找源代码

安装内核

对于RHEL6系列,直接安装就可以了。

rpm -ivh kernel*.rpm

如果是在RHEL5上使用淘宝32的内核,需要先安装新的mkinitrd和nash,下载链接如下。

http://kernel.taobao.org/images/1/11/nash-5.1.19.6-75.tb456.el5.x86_64.rpm
http://kernel.taobao.org/images/4/49/mkinitrd-5.1.19.6-75.tb456.el5.x86_64.rpm

下载后先删除以前的mkinitrd和nash,然后安装新的mkinitrd和nash,最后安装kernel。

sudo rpm -e --nodeps --allmatches mkinitrd nash
sudo rpm -ivh mkinitrd* nash*
sudo rpm -ivh kernel*.rpm

请一定要先安装mkinitrd和nash然后再安装内核rpm,因为安装内核时会使用mkinitrd来生成启动时需要的initrd文件。

个人工具