问题描述
Rocky Linux 9.2环境,手工配置了GRUB_TIMEOUT
为30秒,但重启后发现没有显示菜单,未出现30秒倒计时。
调试方法
梳理GRUB启动流程,下载GRUB源码并重新编译、安装、调试,具体步骤如下:
0. 梳理GRUB启动流程
Linux启动流程参考: 谈谈Linux系统启动流程
GRUB启动流程参考下图:(图片非原创,转载)
1. 确认GRUB版本号
1 | # rpm -qa | grep grub |
得到GRUB版本号为2.06
2. 下载GRUB源码
1 | wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.gz |
3. 修改GRUB源码,添加调试日志
修改grub-core/normal/menu.c
中的函数run_menu
- 使用
grub_printf
函数添加日志打印timeout
,timeout_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
1 | yum install -y bison gcc flex # 安装必要依赖 |
5. 重启后,通过串口查看GRUB日志,确认修改生效
串口日志打印如下:
1 | GRUB loading. |
发现timeout
值为1,timeout_style
为2(TIMEOUT_STYLE_HIDDEN),不符合预期的30秒设定,查看/boot/grub2/grub.cfg
,找到了对应的代码段:
通过grub2-editenv
命令查看menu_auto_hide
这个环境变量的确存在,且值为1,所以匹配了else语句,timeout
的值被设置了1秒
1 | # grub2-editenv - list | grep menu_auto_hide |
查看Rocky Linux官方文档,找到了menu_auto_hide
环境变量被设置的原因,以及解决方法: