Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1101301
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: LINUX

2011-05-13 17:01:44

经历了n次尝试终于能用rpmbuild编译修改过的内核rpm包了

最开始只是想重新编译个内核瘦身下,但是发现redhat5系列没有完整的内核源码树rpm包,而且不能像redaht4系列一样通过编译kernel的src源码包编译出完整源码树包所需的kernel-sourcecode的rpm包,devel和head包只能用来编译模块
4系列具体怎么编译见下连接

于是只能用最土的进源码树目录编译了,以redhat5.4为例
先rpm -ivh kernel-2.6.18-164.el5.src.rpm。

最早一直想用rpmbuild来编译成rpm包,发现rpmbuild先bp然后进源码目录make menuconfig修改.congfig
然后再用rpmbuild bb编译,发现rpmbuild -bb还是会覆盖一次,所以只好直接make

后来搜索发现makefile居然能make rpm,于是修改配置,修改Makefile的EXTRAVERSION值,改成当前的内核版本-164.el5,最后发现,make rpm出来的版本会丢掉那个横线(直接rpmbuild中,Makefile的EXTRAVERSION也会改成-164.el5)....骂了个比的makefile我又不太懂....于是想了想还是去改spec文件,在rpmbuild自己make前阻塞下然后修改.config文件。

查了下kernel-2.6.spec,找到了函数BuildKernel() ,这个就是make相关的函数
可以看见
perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -%{release}$Flavour/" Makefile
make -s mrproper
cp configs/$Config .config
在rpmbulid前修改了makefile的EXTRAVERSION,然后复制了个.config
修改下这个函数,在上述代码后加入
echo  "=========now you can edit the .config file at `pwd`========="
read -p "===========if you edit finsh input ok or you will exit ===========" isOK
echo "ok!!!!!!!!"

先由打印的pwd确认.config文件的位置,然后再到其他tty把修改好的.config文件覆盖过来
再敲下键盘让rpmbuild继续走下去

但这样居然无法走下去
报错:Makefile:403: /home/cs/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686/arch//Makefile: No such file or directory
自己搞半天没解决查了下发现个下面的连接说出了原因
原来是上面代码下面有这些
Arch=`head -1 .config | cut -b 3-`
make -s ARCH=$Arch nonint_oldconfig
make -s ARCH=$Arch %{?_smp_mflags} $MakeTarget
取了.confg的第一行获取体系,而我的.config文件第一没有体系导致Arch为空值最后make的时候少了层目录,解决方法自己编辑下.config文件在第一行加入i386即可(直接参考configs/kernel-2.6.18-i686.config文件——这个文件就是默认的.config文件)
.....想了下上面方法太蠢啦,把read -p写在获取Arch值后面,make前面就是。

然后这样rpmbuild编译,能成功生成内核文件但是打包的时候会有错,卡在%_sourcedir/kabitool -b . -d %{_tmppath}/kernel-$KernelVer-kabideps -k $KernelVer -w $RPM_BUILD_ROOT/kabi_whitelist这里无法通过。看了下kabitool,好像是做什么sha加密效验的,本来想在这个脚本上做手脚,但是发现了下面一篇文章,把打包redhat5系列内核讲得超详细
 这个是redhat的解决方案里面有spec文件修改对比
简单来说就是高度自定的内核需要用直接用--without kabichk跳过这个内核kabi检查,但是redhat5系列的spec文件有问题,用了这个参数还是跳不过去,实在脑残,还要自己改少量地方,下面这个连接就是redhat提供的解决
这个连接是对比代码,

注意,不要注释掉像上面那个uddtm.com中说的注释掉if a rhel kernel, apply the rhel config options,因为我们在后面阻塞rpmbulid后覆盖了.config文件。开始rpmbulid前还要记得修改版本号,最好直接把.el5改成自己的

用下面参数编译
rpmbuild -bb --target=i686 --with baseonly --without debug --without debuginfo --without kabichk kernel-2.6_2.spec

注意,不要漏了endif后面的touch这段,不然在打包结尾运行find-provides脚本的时候会报错

顺便保留下编译内核模块的make常用命令
make mrproper (清配置文件)
make oldconfig
modules_prepare
make M=net/ipv4/netfilter/
make modules SUBDIRS=net/ipv4/netfilter
阅读(3502) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

higkoo2013-08-22 23:38:29

我现在编译阿里CentOS6的内核居然还遇到同样的问题,解决方法和你描述的相同!!!