问题描述
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环境变量被设置的原因,以及解决方法:
