GRUB菜单不显示问题定位

问题描述

Rocky Linux 9.2环境,手工配置了GRUB_TIMEOUT为30秒,但重启后发现没有显示菜单,未出现30秒倒计时。

调试方法

梳理GRUB启动流程,下载GRUB源码并重新编译、安装、调试,具体步骤如下:

0. 梳理GRUB启动流程

Linux启动流程参考: 谈谈Linux系统启动流程
GRUB启动流程参考下图:(图片非原创,转载)
请添加图片描述

1. 确认GRUB版本号

# rpm -qa | grep grub
grub2-pc-2.06
# grub2-install --version
grub2-install (GRUB) 2.06

得到GRUB版本号为2.06

2. 下载GRUB源码

wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.gz
tar -xzvf grub-2.06.tar.gz
cd grub-2.06

3. 修改GRUB源码,添加调试日志

修改grub-core/normal/menu.c中的函数run_menu

  • 使用grub_printf函数添加日志打印timeouttimeout_style, default_entry
  • 使用grub_millisleep函数休指定休眠时间(单位毫秒,休眠目的是让日志停留一段时间,方便定位)
    在这里插入图片描述
    kernel.img执行流程:startup.S -> grub_main -> grub_load_normal_mode -> grub_command_execute("normal", 0 ,0) -> grub_show_menu -> show_menu -> run_menu -> ...

4. 编译和安装GRUB

yum install -y bison gcc flex  # 安装必要依赖
./configure --prefix=/usr	# 笔者的RockyLinux9.2默认应安装到/usr, 其他环境只需后台确认下grub安装的路径,指定对应的prefix即可
make # 编译
make install # 安装
grub2-install /dev/sda # 重新安装GRUB到MBR, 根据你的环境把/dev/sda改成具体的虚拟硬盘设备

5. 重启后,通过串口查看GRUB日志,确认修改生效

串口日志打印如下:

GRUB loading.
Welcome to GRUB!
GET DEFAULT ENTRY: 0
GET TIMEOUT: 1
GET TIMEOUT STYLE: 2

发现timeout值为1,timeout_style为2(TIMEOUT_STYLE_HIDDEN),不符合预期的30秒设定,查看/boot/grub2/grub.cfg,找到了对应的代码段:
在这里插入图片描述
通过grub2-editenv命令查看menu_auto_hide这个环境变量的确存在,且值为1,所以匹配了else语句,timeout的值被设置了1秒

# grub2-editenv - list | grep menu_auto_hide
menu_auto_hide=1

查看Rocky Linux官方文档,找到了menu_auto_hide环境变量被设置的原因,以及解决方法:
在这里插入图片描述

参考资料

【1】 谈谈Linux系统启动流程
【2】 Red hat Customer Portal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pcj_888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值