linux内核-源码编译之centos7
学习linux内核的小伙伴,肯定会遇到内核编译的情况;这里记录下编译的过程供学习交流
一、 为什么要编译内核
基本上需要编译内核的伙伴,应该都是有明确目的的;这里简单说下我的需求:
1、可以生成crash调试所需要的vmliunx镜像文件,当然如果只是需要vmliunx镜像 使用这种方式显得有点麻烦了;但是如果是顺便生成的,也算是意外之喜。
单独安装需要的vmliunx镜像文件:
http://debuginfo.centos.org/7/x86_64/ 中下载
kernel-debuginfo-`uanme -r`.rpm
kernel-debuginfo-common-x86_64-`uanme -r`.rpm
使用rpm工具安装之后,会在 /lib/debug/lib/modules/$(uname -r)/ 下面
2、希望修改内核的调试选项,通过修改.config配置,再重新编译安装,运行新的内核;
3、手动升级其它版本的内核;
二、疑难杂症
在配置的过程中遇到一些奇怪的问题,之所以要先说是因为,如果真的遇到了 能先知道也可以避免浪费更多的时间如果你可以换一个更快的方式的话。
问题:
1、当我用centos7.9编译内核的时候,下载的是3.10.11 之类的,发现无法启动
比如:无法加载 /sysroot 或者 客户机已禁止CPU 之类的
尝试了很多的办法,修改配置总是无法解决,后来大部分说 可能是内核版本并非是稳定的版本导致的;
后来换了4.19.246等高版本的,结果就很顺利;
这里并没有解决问题,却说这么多,是为了如果是非必须要某个版本的就先绕过去吧;或者尽可能的去使用发行的文档版本去测试;毕竟我们这里只是介绍下通用的方法
三、演示环境
我使用的是centos7.9
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -ra
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
四、下载源码
此处正式切入正题,下载源码
一般情况下下载源码的常见形式(不限于)有两种:
第一种:
https://www.kernel.org/
第二种:
下载src.rpm包的形式
比如:centos下载地址,这里使用7.8的源码包
https://vault.centos.org/7.8.2003/os/Source/SPackages/kernel-3.10.0-1127.el7.src.rpm
4.1、两者源码区别
①、通过第一种方式下载的 tarball包解压后就能直接拿到源码了;
②、通过第二种方式下载的包需要多操作几步才能拿到源码,下面就单独说下第二种方式获取源码的步骤
- 1、通过下载获取到kernel-3.10.0-1127.el7.src.rpm 文件
- 2、安装rpm包,可能说解压更恰当一点
提示需要制定的用户和组,如何语句创建
[root@localhost ~]# groupadd mockbuild
[root@localhost ~]# useradd mockbuild -g mockbuild
再执行:
[root@localhost ~]# rpm -i kernel-3.10.0-1127.el7.src.rpm
[root@localhost ~]# ls
kernel-3.10.0-1127.el7.src.rpm rpmbuild
可以看到多出了一个 rpmbuild 文件夹
- 3、安装源代码组件及工具:
yum install asciidoc audit-libs-devel bash bc binutils binutils-devel bison diffutils elfutils -y
yum install elfutils-devel elfutils-libelf-devel findutils flex gawk gcc gettext gzip hmaccalc hostname java-devel -y
yum install m4 make module-init-tools ncurses-devel net-tools newt-devel numactl-devel openssl -y
yum install patch pciutils-devel perl perl-ExtUtils-Embed pesign python-devel python-docutils redhat-rpm-config -y
yum install rpm-build sh-utils tar xmlto xz zlib-devel -y
yum groups install "Development and Creative Workstation" "Compatibility Libraries" -y
- 4、现在源代码组件已经安装了,请解压及预备源代码文件
[root@localhost ~]# cd ~/rpmbuild/SPECS
[root@localhost SPECS]# rpmbuild -bp --target=$(uname -m) kernel.spec
现在内核的源代码目录树可以在 ~/rpmbuild/BUILD/kernel*/linux*/ 这个目录内找得到
4.2、将获取到的源码放在/usr/src/kernels/ 下
*无论通过那种方式获取的源码,后面的步骤 是没有区别的
五、编译内核
5.1、获取.config文件
cp /boot/config-3.10.0-1160.el7.x86_64 .config
5.2、修改config配置
make menuconfig
如果没有特别要修改的,可以直接save退出
5.3、编译版本号显示配置
查看Makefile
如果这里不做配置编译的显示结果,uname -r 显示的是3.10.0 而不是我们想要的 3.10.0-1127
这里我们把 EXTRAVERSION = -1127.el7
通过.config配置, 也能修改显示的内容,但是格式是Makefile里面优化
General setup —>
() Local version - append to kernel release
这里随便填写个,可以不填,这里为了测试看看结果就填了个
结果格式:VERSION+.+PATCHLEVEL+.+SUBLEVEL+EXTRAVERSION+local version
VERSION=3
PATCHLEVEL=10
SUBLEVEL=0
EXTRAVERSION=-1127.el7
local version=-cdd
组合后显示:3.10.0-1127.el7-cdd
5.4、 编译make
make -4
此阶段需要花费较长的时间,大概几十分钟到1小时多点,具体看机器性能;可以去喝杯茶休息下;
waiting…
5.5、安装内核模块和镜像配置
make modules_install && make install
此阶段耗时 几分钟到二十几分钟左右;
INSTALL /lib/firmware/edgeport/boot.fw
INSTALL /lib/firmware/edgeport/boot2.fw
INSTALL /lib/firmware/edgeport/down.fw
INSTALL /lib/firmware/edgeport/down2.fw
INSTALL /lib/firmware/edgeport/down3.bin
INSTALL /lib/firmware/whiteheat_loader.fw
INSTALL /lib/firmware/whiteheat.fw
INSTALL /lib/firmware/keyspan_pda/keyspan_pda.fw
INSTALL /lib/firmware/keyspan_pda/xircom_pgs.fw
DEPMOD 3.10.0-1127.el7-cdd
sh ./arch/x86/boot/install.sh 3.10.0-1127.el7-cdd arch/x86/boot/bzImage \
System.map "/boot"
编译安装结束!
六、重启机器验证
重启机器,选择 新编译的内核
启动后,查看内核版本
[root@localhost ~]# uname -r
3.10.0-1127.el7-cdd
参考链接:
https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source