1. 1. 编译内核生成rpm包
  2. 2. rpm包替换内核
  3. 3. 通过删除rpm包来删除内核
  4. 4. 指定默认启动的内核
  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对应的操作系统启动。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐