Documents/kernel development at taobao

出自淘宝内核组

跳转到: 导航, 搜索

目录

内核开发@淘宝

与内核社区的合作和反馈

根据王晨维护的内核patch统计信息,自2010年底开始,淘宝在Linux内核社区中越来越活跃。

以下是最近几个版本的Linux内核中来自淘宝的patch数量统计

版本       | patch数量    |      数据来源
2.6.37     |        2     |      http://www.remword.com/kps_result/2.6.37_whole.html
2.6.38     |        4     |      http://www.remword.com/kps_result/2.6.38_whole.html
2.6.39     |       49     |      http://www.remword.com/kps_result/2.6.39_whole.html
3.0        |       24     |      http://www.remword.com/kps_result/3.0_whole.html
3.1        |       29     |      http://www.remword.com/kps_result/3.1_whole.html
3.2        |       20     |      http://www.remword.com/kps_result/3.2_whole.html
3.3        |        7     |      http://www.remword.com/kps_result/3.3_whole.html
3.4        |        4     |      http://www.remword.com/kps_result/3.4_whole.html
3.5        |        8     |      http://www.remword.com/kps_result/3.5_whole.html
3.6        |        7     |      http://www.remword.com/kps_result/3.5_whole.html
3.7        |       11     |      http://www.remword.com/kps_result/3.7_whole.html
3.8        |       43     |      http://www.remword.com/kps_result/3.8_whole.html

patch的数量上来评价,自2011年初开始,淘宝已经成为了在Linux内核社区比较活跃的开发团队之一。

自维护内核树

我们基于Red Hat Enterprise Linux 6的2.6.32内核,加上自己的一系列patch,构建成淘宝Linux-2.6.32内核。该内核在线上有了一定数量的实际部署,性能、稳定性和功能都经过了比较长期的实际业务压力考验。有兴趣的朋友可以从下面链接检出这个内核树,我们不对这个代码树的质量承担任何担保,但是我们很乐意对bug报告进行及时的修复。希望这个内核树中的patch能够为大家提供一些积极的信息。

http://kernel.taobao.org/git/?p=taobao-kernel.git;a=summary

简要说明

  • 5u分支是运行在RHEL5上的2.6.32内核分支,6u分支是运行在RHEL6上的2.6.32内核分支
  • master分支是开发测试分支,只有经过比较充分验证的patch才会合并到5u/6u的产品分支中进行实际测试。
  • 整个内核树是RHEL6内核代码+淘宝自维护patch这两部分组成,内核树结构主要是借鉴SuSE Linux Enterprise的工程维护体系组建的。
  • 后续我们会陆续将编译和使用这个内核树的文档释放出来。

本地编译方法

[注意]:在编译内核之前,请确定内核代码是维护正确的branch下;如果内核是要运行在RHEL6系列操作系统上,则需要切换到6u的branch下;如果是在RHEL5系列操作系统上运行,则需要切换到5u4的branch下。

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

这个命令会生成一个叫 taobao-kernel-build 的子目录,里边放置了编译所需的全部文件,在此目录里做rpmbuild即可本地编译生成kernel rpm包。 buildid用来指定生成的RPM包的build number,YUM在安装RPM包时会凭借此序号来判断各个RPM包的新旧(例如,在写作本文时,yum.corp.taobao.com上的内核rpm名是 kernel-2.6.32-95.45a36c6.x86_64.rpm,这表示此RPM为2.6.32内核的第95次build,源码对应于kernel git tree的Commit 45a36c6).如果您只是自己编译使用,则此序号可以随意指定.若没有指定buildid,则默认为1. 例如:

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目录下找源代码。

郑重感谢

  • 绝大多数工作,是由几千名上游内核社区的开发人员完成的,绝大多数的维护和反向移植工作,是由上游操作系统厂商开发团队完成的。正是由于开源软件的开发模式,我们才可能基于这个非常出色的代码之上,针对互联网行业的需求进行专门定制和性能优化。
  • 淘宝在使用Linux内核的过程中,所有的bug和bugfix,都会及时的反馈到上游操作系统厂商和内核开发社区,我们在代码和patch上完全对社区和同行透明公开。
  • 我们将这个代码树和大家分享,是希望能够得到更多有利于促进Linux内核本身质量和性能提升的积极反馈,做到社区和用户的双赢。对于大家的建设性反馈和爱心帮助,我们表示诚挚的感谢。

信息反馈

我们非常欢迎任何的建设性反馈,敬请邮件联系 bosong.ly 在 taobao 点 com 。

个人工具