【运维案例】安装新内核后启动仍为原来的内核版本

标题:安装新内核后启动仍为原来的内核版本

产品:openEuler

版本:openEuler 20.03-LTS-SP2

组件:kernel、grub

分类:启动、引导

来源:现网

【背景及现象描述】

在使用openEuler-20.03-LTS-SP2操作系统的环境时,保留原有内核并安装新的内核,重启机器,启动后仍为原有内核。

【原因分析】

首先查看新内核已成功安装,且查看/boot/efi/EFI/xxxx/grub.cfg, 观察menuentry,发现新内核已加入grub.cfg,且顺序第一,说明正常情况应在启动时看到新内核的选项且排列在第一个。继续查看grub2-editenv list, 发现默认启动内核也更改为新内核,说明启动时应会默认使用新内核启动。但是尝试重启,则发现menuentry界面并没有新内核的选项。

此时怀疑启动时并没有用到该grub.cfg文件。输入df -Th查看系统分区发现分区sda1未挂载,sda2 为vfat 类型,且挂载点为/boot/efi,sda3则为ext2类型,挂载点为/boot。输入fdisk -l发现sda1 类型为 BIOS boot, sda2类型为Linux filesystem, sda3类型为 EFI System,与正常系统有两个不同:1. openEuler的arm架构不会生成BIOS boot分区; 2. sda3取代sda2为EFI System类型。

检查sda3的挂载点/boot目录,发现grub2目录下的文件除了正常的grubenv文件外,还有grub.cfg、fonts、arm64-efi等文件,查看此目录下的grub.cfg 发现不包含新内核。将此文件内容替换为boot/efi/EFI/xxxx/grub.cfg的文件内容后,再次启动发现可以识别到新内核。此时我们可以确定,启动时读取的是/boot/grub2/grub.cfg。

那么为什么会读取/boot/grub2下的grub.cfg呢?查阅资料后发现,/boot/grub2/grub.cfg 用在non-UEFI(legacy)模式中,如果系统中没有/sys/firmware/efi 则是uefi模式引导,反之则是legacy引导。然而查看此系统发现包含/sys/firmware/efi 目录,这就比较奇怪了。查看同一批的其他机器,发现很多机器为麒麟v10的机器,且分区方式与此台机器相同,都包含BIOS boot分区,怀疑是BIOS boot分区导致了引导使用了legacy模式,有可能此问题环境是由麒麟机器重装而来,且重装过程中遗留了原BIOS boot分区。

【解决方法】

用户可直接修改/boot/grub2/grub.cfg ,将内容替换为/boot/efi/EFI/xxxx/grub.cfg中的即可使用新内核正常启动。

【相关参考文档】

https://forums.centos.org/viewtopic.php?t=75218

1 个赞