linux kernel 编译/安装/切换/删除 以及添加preempt rt patch的方法
编译preempt_rt内核
注意:因为编译的是x86的设备,所以不存在交叉编译,arm编译需要指定交叉编译工具链及架构等,不能照搬这份教程
解压源码及补丁
preempt_rt补丁下载链接
选取匹配版本的补丁下载
$ tar -xzvf linux-6.8.2.tar.gz
$ gunzip patch-6.8.2-rt11.patch.gz
将解压得到的patch-6.8.2-rt11.patch文件复制到内核解压文件夹linux-6.8.2中,执行以下命令,make menuconfig需要将CONFIG_PREEMPT_RT的配置enable:
$ patch -p1 < patch-6.8.2-rt11.patch
$ make menuconfig # need to config "CONFIG_PREEMPT_RT=y"
$ make bindeb-pkg -j 16
如果有证书密钥问题可以尝试禁用,一般不需要执行
$ scripts/config --disable SYSTEM_TRUSTED_KEYS
$ scripts/config --disable SYSTEM_REVOCATION_KEYS
使用make bindeb-pkg进行编译
$ sudo make bindeb-pkg -j16
执行完成之后,在源码目录的上层会生成4个文件
linux-headers-6.1.80--000_6.1.80-rt26-0_amd64.deb #kernel头文件,kernel模块开发时会需要
linux-image-6.1.80--000_6.1.80-rt26-0_amd64.deb
linux-image-6.1.80--000-dbg_6.1.80-rt26-0_amd64.deb # debug版本,调试需要
linux-libc-dev_6.1.80-rt26-0_amd64.deb
安装编译的新内核
拷贝生成的所有deb到需要安装的目标机器上,执行安装(tips: linux-image-6.1.80--000-dbg_6.1.80-rt26-0_amd64.deb是debug版本image,可以不用拷贝)
$ sudo dpkg -i *.deb
更新grub
安装完成后需要更新grub
$ sudo update-grub
重启后就可以切换到想要的内核,因为加了rt补丁,所以会有“PREEMPT_RT”的字段
$ uname -a #查看当前内核
Linux sw-server 6.8.2-rt11 #1 SMP PREEMPT_RT Wed Feb 11 13:19:54 UTC x86_64 x86_64 x86_64 GNU/Linux
切换内核:
查看需要使用的内核在启动选项中的位置
$ sudo nano /boot/grub/grub.cfg
之后我们向下查找,直至看到 menuentry ‘Ubuntu’ ,menuentry表示grub启动选项的显示条目。如下所示
$ grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
menuentry 'Ubuntu, with Linux 6.8.2-rt11' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.2-rt11-advanced-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
menuentry 'Ubuntu, with Linux 6.8.2-rt11 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.2-rt11-recovery-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
menuentry 'Ubuntu, with Linux 6.8.0-57-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-57-generic-advanced-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
menuentry 'Ubuntu, with Linux 6.8.0-57-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-57-generic-recovery-7a1c4c23-68ef-4f9e-b834-0c629dce82c2' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
Advanced options for Ubuntu下有四个启动选项,在grub中的序号分别是0-3
更改grub默认启动项
该命令需要root模式下操作
$ sudo nano /etc/default/grub
切换启动内核
打开grub文件后,找到 GRUB_DEFAULT=0 该项定义,可以修改,指定启动的内核“1 > x”,x为需要启动的kernel序号
GRUB_DEFAULT="1 > 2" #对应启动序号2,即'Ubuntu, with Linux 6.8.0-57-generic'
更新开机引导文件
$ sudo update-grub
重启切换指定内核
$ reboot
注意
有时因为操作失误,会出现grub中的内核实际上已经被删除的同步问题,可以查询想要的内核是否已经被安装
$ dpkg -l |grep linux-image
删除内核
首先查看当前使用的内核版本:
$ uname -a
正在使用的内核是无法删除的,我们可以删除其他内核
查询目前系统中存在的内核版本:
$ dpkg --get-selections | grep linux-image
linux-image-5.15.0-1026-intel-iotg install
linux-image-6.6.78-rt51-test hold
linux-image-intel-iotg install
使用以下命令卸载当前未使用的多余内核:
$ sudo dpkg -P linux-image-5.15.0-1026-intel-iotg
这时再查看目前系统中存在的内核,会发现卸载的内核变成啦deinstall:
$ dpkg --get-selections | grep linux-image
linux-image-5.15.0-1026-intel-iotg deinstall
linux-image-6.6.78-rt51-test hold
linux-image-intel-iotg install
本作品采用 CC BY-NC-SA 4.0 协议

浙公网安备 33010602011771号