编译RHEL 8.7 kernel 并重新安装
背景:最近遇到一个bug,需要修改 RHEL 8.7 kernel config 的配置参数,然后重新安装该kernel。踩过一些坑,复盘整理。
查询当前的kernel
uname -r
4.18.0-477.15.1.el8_8.x86_64
这是当前运行的内核版本。版本号的不同部分表示以下信息:
• 4.18.0: 内核的主版本号、次版本号和发布版本号。
• 477.15.1.el8_8: 补丁级别和发行版本信息。
• x86_64: 内核的体系结构,这里是64位
RHEL 查询当前系统已经安装的kernel
如下有三种常用的方式:
#1 rpm -qa | grep kernel | xargs rpm -qi
#2 sudo yum list installed kernel
#3 rpm -qa | grep -i kernel
RHEL 选择并切换到具体的kernel
这部分与Ubuntu 不同,不能直接sudo update-grub, RHEL/CentOS 的方式先修改 /etc/default/grub
sudo vim /etc/default/grub #更换选择的kernel
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 更新配置
sudo reboot
前面的铺垫结束,现在可以开始下载source code,修改config, 然后重编kernel。
如何安装src rpm
sudo useradd -s /sbin/nologin mockbuild
sudo rpm -ivh kernel-4.18.0-425.3.1.el8.src.rpm
cd /root/rpmbuild/SOURCES/
ll
-rw-rw-r-- 1 mockbuild mock 120898584 Sep 30 2022 linux-4.18.0-425.3.1.el8.tar.xz
找到source code 包 然后mv 出来并解压缩
Compile Kernel 直接安装 (在本地compile 并安装)
make mrproper
作用是在每次配置并重新编译内核前需要先执行make mrproper
命令清理源代码树,包括过去曾经配置的内核配置文件.config
都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。即检查有无不正确的.o文件和依赖关系,如果使用刚下载的完整的源程序包即第一次进行编译,那么本步可以省略。而如果你多次使用了这些源程序编译内核,则最好要先运行。
make menuconfig
使用make menuconfig
生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。
sudo dnf search ncurses
sudo dnf install ncurses-devel.x86_64
$ nproc
96
#make –j96
生成内核模块和vmlinuz,initrd.img,Symtem.map文件。
注:#make相当于分别执行#make bzImage 和#make modules,由于是本机替换内核,所以无需分开执行。
build 完之后 echo $? 看是否返回值为0
sudo make modules_install
编译成功后,系统会在/lib/modules目录下生成一个子目录,里面存放着新内核的所有可加载模块(即将编译好的modules拷贝到/lib/modules下)。
DEPMOD 4.18.04.18.0-425.13.1_default.el8_7
make install
Issue:
# 1 CONFIG_SYSTEM_TRUSTED_KEYS
此时需要在Kernel文件夹"linux-5.8.1"中,找到"./config"文件,禁掉"certs/rhel.pem":
将CONFIG_SYSTEM_TRUSTED_KEYS=“certs/rhel.pem”,
改成CONFIG_SYSTEM_TRUSTED_KEYS=""
# 2 提示"Try to disable CONFIG_DEBUG_INFO_BTF"
屏蔽这一条config