这几天处理一个线上设备异常重启问题,需要安装内核的debuginfo软件包。虽然OS团队提供了相关的debuginfo软件包,
但是还想自己尝试编译一次。
拿到了相关OS内核的src.rpm软件包,如下所示:
-rw-r--r-- 1 root root 82990501 Aug 8 2017 kernel-3.10.0-327.22.2.el7.cgsl1473.src.rpm
一般编译步骤如下:
安装src rpm包:
# rpm -ihv kernel-3.10.0-327.22.2.el7.cgsl1473.src.rpm
注:一般会安装在/root/rpmbuild目录下
切换目录:
# cd /root/rpmbuild
打补丁:
# rpmbuild -bp SPECS/kernel.spec
编译内核的rpm:
rpmbuild -ba SPECS/kernel.spec
编译完后,输出rpm包为:
如果想要指定安装目录,使用--define参数,编译过程如下:
# rpm -ivh kernel-3.10.0-327.22.2.el7.cgsl1473.src.rpm --define "%_topdir /root/supermith"
安装目录信息:
切换目录:
# cd /root/supermith
后面的命令也要带上--define参数,切换目录后,可以使用`pwd`命令指定为当前目录
# rpmbuild -bp SPECS/kernel.spec --define "%_topdir `pwd`" 或者
# rpmbuild -bp SPECS/kernel.spec --define "%_topdir /root/supersmith"
编译内核rpm:
# rpmbuild -ba SPECS/kernel.spec --define "%_topdir `pwd`"
编译结果:
使用rpmbuild编译内核时,最好不要使用--nodeps参数。因为使用rpmbuild命令编译时,需要一些依赖包,如果系统
没有安装,但这时候被忽略了,在编译到最后就会出现某些命令错误,而这些错误一般就是由于某些依赖包没有安装造成的。
出错示例1:
+ '[' -f arch/x86_64/boot/zImage.stub ']'
+ %pesign -s -i arch/x86/boot/bzImage -o arch/x86/boot/bzImage.signed -a /root/kernel_v503_1473/SOURCES/centos.cer -c /root/kernel_v503_1473/SOURCES/centos.cer
/var/tmp/rpm-tmp.07AsgA: line 105: fg: no job control
error: Bad exit status from /var/tmp/rpm-tmp.07AsgA (%build)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.07AsgA (%build)
出错示例2:
+ %fdupes /var/tmp/kernel-source-3.0.101-build
/var/tmp/rpm-tmp.21139: line 56: fg: no job control
error: Bad exit status from /var/tmp/rpm-tmp.21139 (%build)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.21139 (%build)
所以,当使用 rpmbuild -bp命令出现依赖错误时,一定要重视,要安装相应的rpm包。
比如以下的错误信息:
# rpmbuild -bp SPECS/kernel-source.spec --define "%_topdir `pwd`"
error: Failed build dependencies:
fdupes is needed by kernel-source-3.0.101-0.47.105.1.x86_64
这就是编译内核依赖fdupes软件包,需要安装,否则就会出现以上类似问题。
之前也拿到过SUSE11SP3的src.rpm包,但是使用以上方法确没有生产debuginfo软件包,还没找到问题原因,或者
SUSE11根本不支持该编译方法。需要进一步探索编译debuginfo软件包的方法。
如果内核出现crash,有了vmcore,但是没有debuginfo rpm包安装,就无法使用crash工具分析vmcore dump文件。
反过来想,crash统计分析dump文件,无非是需要一个带debug symbols的vmlinux,而内核config文件中,有一个
CONFIG_DEBUG_INFO配置项,如果配置项为y,则编译的内核就会带有debug symbols信息。那么,我们可以在编译
内核时,配置该选项做内核编译。这个方式,经过实际操作是可行的!!!
一般拿到内核源码后,编译就比较简单,步骤如下:
1.拷贝系统/boot/config-`uname -r`文件到源码安装目录,比如/usr/src/linux/,文件名为.config
# cp /boot/config-`uname -r` /usr/src/linux/.config
2.生成内核功能间的依赖关系,为编译内核做好准备
# make dep
3.在每次配置并重新编译内核前需要先执行。一般不需要
#make mrprobe
4.编译和安装内核
make all -j32; make modules_install; make install
参考文章:
https://www.thegeekstuff.com/2015/02/rpm-build-package-example/
内核Documentation/dump/kdump.txt