RHEL6.2下使用rpmbuild编译taobao-kernel手札

来源:互联网 发布:羞辱2破解版优化补丁 编辑:程序博客网 时间:2024/05/22 04:40

         正好失业中,就利用这段时间系统的学习下taobao优化的几个系统级开源项目,先从最基本的linuxkernel开始。

         先是参考了http://kernel.taobao.org上的 “编译使用淘宝内核”这篇引导文档,但是其中有些点没有提到。按照淘宝的引导文的顺序前进,中间补充我遇到的问题和解决方法。

         首先从github下载淘宝内核树

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

 

         然后切换到6u的分支下(因为博主是在rhel6下编译并且是直接安装到rhel6的)

                 git checkout -b 6u origin/6u

         (如果是要编译安装到rhel5的rpm包则需要切换到5u分支,不过目前github的树上好像已经没有5u这个分支了)

 

         接着利用使用项目中自带的脚本来构建build内核所需要的文件

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

         其中buildid参数可选,默认为1,仅是用于管理版本,博主是取了自己的ID前两位FE,然后单数表示rhel上的构建,双数表示centos上的构建,所以本次buildid取2551

 

         执行完成以后,项目目录下会生成taobao-kernel-build目录,包含了所有编译内核所需的文件,切换到该目录下。

 

         这里开始遇到了问题,首先按照淘宝的引导文章执行了rpmbuild,因为source文件夹就在当前目录下,所以与原文的命令略有不同:

                rpmbuild -bb kernel.spec --define="_sourcedir ."--define="_builddir ./build" --define="_rpmdir./build/rpms"

         执行后会报一串依赖缺失,正常来说应该是 elfutils-libelf-develzlib-devel binutils-devel xmlto和asciidoc。其中前面4个都能直接在安装光盘或者官方源找到的(这里可以直

接把安装光盘作为yum的repo速度快,具体方法网上应该很多,这里就不多说了),asciidoc是没有的。刚开始是直接google了,找到了asciidoc在sourceforge的源,然后下载了

源代码之后编译安装,老三步 ./configure make make install,直接asciidoc命令也可以正常执行了,但是你会发现执行上面的rpmbuild时依然会报错,asciidoc依赖缺失,这时

候就开始纳闷了,以为是path的问题,所以分别在/usr/bin/ /usr/local/bin/ /bin/ 下面都建立了asciidoc和a2x的软连接,但是缺失依旧……整个过程中首次感受好无助啊@@

google也无果(可能是关键词不对)反复的看报错信息之后发现,报的错是软件包依赖缺失,而不是找不到系统命令,这时候才恍然大悟源码编译安装的,并不会加入rpm的软

件包索引,所以使用yumlist也是看不到asciidoc installed的,不过光盘也没包,所以只能是去redhat官方的ftp站点,发现有asciidoc的源码包,大概跟系统相关性比较大?所以

需要到本地编译再安装?抱着试试看的心理down下来 rpmbuild然后再安装。具体过程如下

               lftp ftp://ftp.redhat.com:/pub/redhat/linux/enterprise/6Server/en/os/SRPMS

               get  asciidoc-8.4.5-4.1.el6.src.rpm

         接着

               rpm -ivh asciidoc-8.4.5-4.1.el.src.rpm

         这一步只是安装源码,会在当前账户的home目录下建立rpmbuild文件夹,这里不要使用sudo,不然就会把源码安装到/root/下了,安装完源码后切换到~/rpmbuild/SPEC目

录下,会发现asciidoc.spec

               rpmbuild -bb asciidoc.spec

        执行完成后能在~/rpmbuild/RPMS/noarch/目录下发现已经封装好的asciidoc-*.rpm安装包

               yum localinstall asciidoc-*.rpm

        安装之,到此依赖问题都解决了,继续执行编译内核的rpmbuild,但是新的问题出现了,一段时间后会报错,是说bzip2 无法找到文件linux-*.tar.bz2,但是这个文件明明就

在当前目录下,sourcedir参数指定也是对的,这个问题大概是因为目录切换而导致相对目录位置混乱了,所以在这里将参数都修改成绝对路径来解决,参数修改如下

                rpmbuild -bb kernel.spec --define="_sourcedir/home/ferdi/taobao/taobao-kernel/taobao-kernel-build"--define="_builddir/home/ferdi/taobao/taobao-kernel/taobao-kernel-build/build"--define="_rpmdir /home/ferdi/taobao/taobao-kernel/taobao-kernel-build/build/rpms"

        终于顺利执行编译,不过如果机器不是很好的话这里可能要等上1个多小时到2个小时……稍安勿躁……博主用的虚拟机。。。拟机。。。机。。。(以后有钱了一定要买个刀片来玩)

 

        经过漫长的等待终于编译完成,你能在BUILD/rpms/x86_64下面找到所有的rpm包,淘宝的引导文说只要

                rpm -ivh kernel*.rpm

        就大功告成了!你以为呢?才不会那么简单T。T 首先我的rpm没有自动解决依赖问题,这没啥,我手动按顺序装呗,(其实你如果不需要debug相关的话可以不用看这段),

先安装debug部分的包,首先安装kernel-debuginfo-common,然后kernel-debug-debuginfo,纳尼!他说依赖kernel-debuginfo-common包?没装上?再装一遍……纳尼!他说

我已经装过了! so……debug部分的安装死在这里了……不过这部分不影响正常的kernel安装,所以先不管他,跳过!

 

       kernel部分其实只是使用的话只需要安装kernel-*.rpm就行了,但是kernel的安装依赖kernel-firmware,这里又是一个问题的所在,正常的 rpm -ivh安装kernel-firmware会报

一个警告,说是kernel-firmware软件包有多重指向,因为和官方的同时存在,但是其实你后来安装的这个kernel-firmware压根就没装上,这是 rhel的一个bug,在官方bugzilla能

够查到 bug #671021  centos上并不存在这个问题,这时候可以干脆remove掉原来的kernel-firmware然后再安装,或者使用rpm -Uvh来安装,后者貌似比较先进些@@ 安装完

kernel-firmware后应该能顺利安装上kernel了,至于kernel-headers和kernel-devel可选,如果你需要写驱动之类的就装上,kernel-headers是一定会有冲突的,直接rpm -Uvh就

好了,安装完后重启,大功告成了?

 

       才不会咧……你发现你系统起不来了……报了一堆FATAL,都是the key is rejected by service,看描述应该是签名的问题了,跑去问了 @燕飞 大大,才知道安装自定义的

kernel需要把模块签名的参数改成0,好吧,重新来!

 

        利用官方kernel启动进入系统,修改taobao-kernel-build文件夹下面的kernel.spec文件,其中有一行

               %define signmodules 1

        将这里的1修改成0,保存后,重新编译安装,这回终于算是完成了~ daz!

 

        啊咧……你们别诅咒我啊,我到最后才说要改模块签名的问题,是因为。。。。。。(我被坑过一次了,当然要让别人也被坑一次啊。。。)问题嘛,自己亲身体验一次

会更加印象深刻@@ 而且如果是先把全文看完再去动手的同学就不会有多来一次了@@ (这个故事告诉我们看博文要看完……)

 

       卖萌结束! 最后感谢霸爷,感谢燕飞大大!

 

       后续会继续跟进centos6系统上的编译和安装,以及相关优化方面的测试,再后续会跟进taobao-jvm的编译,以及taobao-kernel中能profile java进程的perf的使用体验(如果

我忘了记得提醒我。。。)

 

结尾附上整个过程参考过的博客内容:

http://kernel.taobao.org

http://www.opsers.org/base/way-rhel6-1-kernel-with-rpm-upgrade-to-rhel6-2-bate-kernel.html

http://hi.baidu.com/higkoo/item/dcfef11bc63946cc39cb3034

http://half-blood-rock.blogspot.com/2011/08/rhel61rpmbuild.html

http://wenku.baidu.com/view/0aeb74c3d5bbfd0a7956732b.html

 

编译好的rpm包放在github: https://github.com/ferdiknight/taobao-kernel

 

新浪微博:@ferdinand童

欢迎上门讨论@@

 

原创粉丝点击