openEuler编译和更换内核的方法

  1. [1. 编译内核生成rpm包](#1. 编译内核生成rpm包)
  2. [2. rpm包替换内核](#2. rpm包替换内核)
  3. [3. 通过删除rpm包来删除内核](#3. 通过删除rpm包来删除内核)
  4. [4. 指定默认启动的内核](#4. 指定默认启动的内核)
  5. [5. 在两个硬盘上装双系统时,指定硬盘启动顺序](#5. 在两个硬盘上装双系统时,指定硬盘启动顺序)

1. 编译内核生成rpm包

  • 内核编译

    1. 在内核根目录下执行make openeuler_defconfig生成.config文件

    2. 通过make menuconfig指定一些内核配置选项,比如

      设置编译成的rpm包名称

      复制代码
      |  |  |
      | --- | --- |
      | 1 | General setup  ---> |
      | 2 | (_debug_sp4) Local version - append to kernel release |

      将spi_dw_mmio.c这个驱动编译为内核

      复制代码
      |  |  |
      | --- | --- |
      | 1 | Device Drivers  ---> |
      | 2 | [*] SPI support  ---> |
      | 3 | <M>     Memory-mapped io interface driver for DW SPI core |

      通过查看.config文件中对应的配置项,可以检查make menuconfig中的设置是否生效

    3. 编译rpm包:make binrpm-pkg -j <jobs number>,其中<jobs number>代表并发量,一般小于等于CPU核数

      生成的rpm包位于~/rpmbuild/RPMS/aarch64目录下,共有两个包,一个是kernel的二进制包,一个是头文件包。

      复制代码
      |  |  |
      | --- | --- |
      | 1 | [root@localhost aarch64]# pwd |
      | 2 | /home/j00521119/rpmbuild/RPMS/aarch64 |
      | 3 | [root@localhost aarch64]# ll |
      | 4 | total 32072 |
      | 5 | -rw-rw-r--. 1 j00521119 j00521119 31602553 Nov  1 16:31 kernel-4.19.90+-26.aarch64.rpm |
      | 6 | -rw-rw-r--. 1 j00521119 j00521119  1234637 Nov  1 16:30 kernel-headers-4.19.90+-26.aarch64.rpm |

    编译过程中可能会遇到缺乏依赖包的问题,根据报错内容安装需要的包即可。

  • 优化编译时间

    实际编译过程中会发现,最后打包生成rpm包的耗时较长。通过下面的两步操作,可以缩短打包生成rpm包的时间,同时减少rpm包的size。

    • 在内核源码根目录下打开scripts/package/mkspec文件,并注释这下述两行

      复制代码
      |  |  |
      | --- | --- |
      | 1 | bzip2 -9 --keep vmlinux |
      | 2 | mv vmlinux.bz2 %{buildroot}/boot/vmlinux-$KERNELRELEASE.bz2 |
    • 使用环境变量:export INSTALL_MOD_STRIP=1

    其中第一步的作用是不把vmlinux打包进rpm包中。vmlinux是linux内核的未压缩二进制文件,包含了完整的内核代码和符号表信息,通常用于调试和分析内核问题。

    INSTALL_MOD_STRIP是用来压缩内核模块的变量。在编译内核时,内核模块会被编译成.ko文件,这些文件可能会占用大量的磁盘空间。为了减少内核模块的体积,可以使用INSTALL_MODE_STRIP变量来指定内核模块是否需要被压缩。当该变量的值为1时,内核模块会被剥离符号和调试信息,从而减小文件大小。

2. rpm包替换内核

使用下面的命令更换内核,一般只用替换kernel包即可。

复制代码
|  |  |
| --- | --- |
| 1 | rpm -ivh kernel*.rpm --force |

安装完成后可以通过下面的命令检查内核是否已经安装成功。

复制代码
|  |  |
| --- | --- |
| 1 | rpm -qa | grep kernel |

3. 通过删除rpm包来删除内核

通过下面的命令查找当前已经通过rpm包安装的内核

复制代码
|  |  |
| --- | --- |
| 1 | [root@vm1 ~]# rpm -qa | grep kernel |
| 2 | kernel-5.10.0-136.12.0.86.oe2203sp1.aarch64 |
| 3 | kernel-headers-5.10.0-136.12.0.86.oe2203sp1.aarch64 |
| 4 | kernel-4.19.90_wayca_sc_with_cluster+-34.aarch64 |

使用下面的命令删除已经安装的内核

复制代码
|  |  |
| --- | --- |
| 1 | rpm -e kernel-4.19.90_wayca_sc_with_cluster+-34.aarch64 |

4. 指定默认启动的内核

有时候会存在多个内核版本同时存在的情况。一种方法是在启动阶段手动选择启动内核,使用这种方法,除了要登录BMC外,还要在启动阶段持续关注启动界面,在特定启动阶段手段选择内核。下面给出了一种指定默认启动内核的方法,使用这种方法避免了在更换内核后登录BMC的操作。

通过命令grub2-editenv list可以查看当前设置的默认启动内核

通过命令grep "^menuentry" /etc/grub2-efi.cfg可以查看当前支持的所有内核版本

通过命令grub2-set-default来设置默认启动内核。使用menuentry之后单引号内的完整字符串作为内核名

复制代码
|  |  |
| --- | --- |
| 1 | [root@vm1 ~]# grub2-editenv list |
| 2 | saved_entry=openEuler (4.19.90_debug_sp4_wayca_sc+) 22.03 (LTS-SP1) |
| 3 | [root@vm1 ~]# grep  "^menuentry" /etc/grub2-efi.cfg |
| 4 | menuentry 'openEuler (4.19.90_wayca_sc_with_cluster+) 22.03 (LTS-SP1)' --class openEuler --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-5.10.0-136.12.0.86.oe2203sp1.aarch64-advanced-3c1ec069-3a9b-461f-be6c-6f6a7184c3c5' { |
| 5 | menuentry 'openEuler (5.10.0-136.12.0.86.oe2203sp1.aarch64) 22.03 (LTS-SP1)' --class openEuler --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-5.10.0-136.12.0.86.oe2203sp1.aarch64-advanced-3c1ec069-3a9b-461f-be6c-6f6a7184c3c5' { |
| 6 | [root@vm1 ~]# grub2-set-default 'openEuler (5.10.0-136.12.0.86.oe2203sp1.aarch64) 22.03 (LTS-SP1)' |
| 7 | [root@vm1 ~]# grub2-editenv list |
| 8 | saved_entry=openEuler (5.10.0-136.12.0.86.oe2203sp1.aarch64) 22.03 (LTS-SP1) |

5. 在两个硬盘上装双系统时,指定硬盘启动顺序

有时候我们会在两个硬盘上安装两个系统,除了通过bios来手动指定启动硬盘之外,还可以使用efibootmgr命令来指定硬盘启动顺序。efibootmgr命令是一个用于管理UEFI引导选项的命令行工具。它可以列出、添加、删除和修改UEFI引导选项,以及设置默认引导选项。通过使用efibootmgr命令,用户可以轻松地管理UEFI引导选项,以确保系统正确地引导到所需的操作系统或引导设备。

efibootmgr常用的使用方法如下(也可以使用efibootmgr --help查看其它使用方法)

efibootmgr用于显示当前的启动顺序,当前启动项

efibootmgr -o用于设置新的启动顺序,设置完成后reboot即可

复制代码
|  |  |
| --- | --- |
| 1 | [root@localhost aarch64]# efibootmgr |
| 2 | BootCurrent: 0010 |
| 3 | Timeout: 10 seconds |
| 4 | BootOrder: 0010,000E,0002,0003,0004,0005,0006,0007,0008,0009,000A,000B,000C,000D,0001,0000 |
| 5 | Boot0000* BootManagerMenuApp |
| 6 | ... |
| 7 | Boot000E* openEuler |
| 8 | Boot0010* Uefi OpenEuler Grub Boot |
| 9 | [root@localhost aarch64]# efibootmgr -o 0000E,0010 |
| 10 | BootCurrent: 0010 |
| 11 | Timeout: 10 seconds |
| 12 | BootOrder: 000E,0010 |
| 13 | Boot0000* BootManagerMenuApp |
| 14 | ... |
| 15 | Boot000E* openEuler |
| 16 | Boot0010* Uefi OpenEuler Grub Boot |
| 17 | [root@localhost aarch64]# efibootmgr |
| 18 | BootCurrent: 0010 |
| 19 | Timeout: 10 seconds |
| 20 | BootOrder: 000E,0010 |
| 21 | Boot0000* BootManagerMenuApp |
| 22 | ... |
| 23 | Boot000E* openEuler |
| 24 | Boot0010* Uefi OpenEuler Grub Boot |

经过上面的操作后,启动顺序由原来的0010在前,变成了000E在前。下次启动时,系统就会从000E对应的操作系统启动。

相关推荐
信誓旦旦的程序猿7 分钟前
【Python 量化取数指南 #09】Python 拿港股通数据:港股通成交与港股财报实测
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
雯宝12 分钟前
mnt_init 函数
linux
小程序设计1 小时前
本科毕设避坑|大数据 / 单片机物联网 / 网络工程 / PLC / 机械设计选题与落地心得
java·hive·hadoop·单片机
卓怡学长1 小时前
w206基于SpringBoot的社区团购小程序设计与实现
java·spring boot·spring·intellij-idea
IT枫斗者枫哥6 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟6 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo6 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕6 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
律宏阔6 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
花开路口6 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin