背景:最近遇到一個bug,需要修改 RHEL 8.7 kernel config 的配置參數,然後重新安裝該kernel。踩過一些坑,復盤整理。 查詢當前的kernel uname -r 4.18.0-477.15.1.el8_8.x86_64 這是當前運行的內核版本。版本號的不同部分表示以下信息: ...
背景:最近遇到一個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