Linux 内核编译笔记

南楼画角 提交于 2020-01-22 18:17:01

  这几天处理一个线上设备异常重启问题,需要安装内核的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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!