本期为“服务器操作系统常见问题解析”系列报道第十期,介绍在系统重启时,若遇到grub无法启动的问题,应该怎样进行调试。
问题描述
GRUB(Grand Unified Bootloader)作为Linux系统的核心引导加载程序,是连接硬件固件与操作系统的关键桥梁。其主要作用包括:
在计算机启动时检测操作系统并生成引导菜单;
加载Linux内核(vmlinuz)及初始化内存文件系统(initramfs);
向内核传递关键启动参数(如根文件系统路径);
提供故障恢复机制(如单用户模式或救援模式);
在系统的启动流程中,GRUB通过BIOS/UEFI加载的初始启动文件(grubx64.efi或shimx64.efi),解析配置文件(grub.cfg),定位内核文件并解压至内存运行,最终将控制权移交内核,完成从硬件初始化到系统服务启动的平滑过渡。作为系统引导的核心环节,GRUB的稳定运行是确保操作系统顺利加载与初始化的基石。
系统启动的时候,大家有没有遇到过下面的场景:
a. 通过BIOS的F11选项,选择启动设备后,没有出现预期的grub界面,出现了黑屏或屏幕左上角一直闪光标的现象;
b. 启动到了grub界面,但没有出现预期的倒计时,或倒计时进行到一半时卡住,又或者倒计时结束了,却没有启动进入grub中所选择的内核,仍然停留在grub界面;
c. 从grub界面中开始启动内核了,但没有预期的内核启动日志打印,出现了黑屏或左上角一直闪光标的现象;
这些场景中,系统内核还没开始启动,没有任何的系统日志打印内容,应该怎样定位这样的问题呢?grub有没有debug模式,或者怎样对grub进行调试呢?
调试步骤
一.在grub界面增加调试参数
上述场景中,场景b是最常见的,已经启动进入grub界面了,在grub界面通常可以进行下面的调试动作:
(1)在grub参数中增加打印信息
在grub界面中,编辑grub参数,可以增加echo打印信息:
按“e”编辑grub参数:
可以在已有的命令行中,逐行增加打印信息,按组合键Ctrl-x执行启动,根据打印信息,确定在执行哪行命令时出现问题:
(2)手动执行grub引导命令
通过按组合键“Ctrl+c”进入grub命令界面,手动输入需要执行的命令,删除所有不必要的参数,观察在执行什么命令时出现问题:
在grub命令行界面中,可以执行的命令列表如下,可以根据实际情况,适当的使用这些命令查看或设置更多的调试信息:
3)修复引导文件grub.cfg
系统在使用过程中,可能由于各种原因导致grub.cfg文件损坏,导致系统在启动时停在grub界面:
通常可以尝试使用下面的方法,尝试手动引导进入系统:
进入系统后,重新生成一份grub.cfg文件,即可完成修复:
#grub2-mkconfig–o/boot/efi/EFI/kos/grub.cfg
二、手动开启grub调试模式
对于场景c,从grub界面开始引导所选择的内核时出现的问题,可以在grub界面中,设置开启调试模式后再启动,会打印更多的日志。
如下,在grub界面中,按“c”进入grub的命令行界面:
在命令行界面中,输入“set debug=all”开启调试模式:
按“Esc”键返回grub界面,正常启动内核,会在启动过程中,逐页打印详细的debug日志信息,需要手动翻页查看:
由于debug日志过多,手动翻页很麻烦,可以在开启调试模式时,再设置一个禁用分页的参数“set pager=0”,并在grub参数中,添加串口参数,将启动日志打印到串口输出,以便于观察:
三、修改grub配置文件
对于场景a,从bios开始加载bootloader开始就出现问题,grub还未加载出命令行界面的情况,需要预先配置,或进入救援模式,修改grub的配置,开启更详细的debug信息,并配置串口输出,将详细的日志打印到串口输出查看。
具体配置方法如下:
(1)配置开启串口
#vim/etc/default/grub
删除GRUB_CMDLINE_LINUX行中的rhgb quiet
增加console=tty0 console=ttyS0,115200
(2)修改00_header配置
#vim/etc/grub.d/00_header
将set pager=1修改为set pager=0
(3)增加01_grub_debug文件开启debug
#vim/etc/grub.d/01_grub_debug #!/bin/sh-e echo"setdebug=all
#chmod755/etc/grub.d/01_grub_debug
(4)重新生成grub.cfg
#grub2-mkconfig-o/boot/efi/EFI/kos/grub.cfg
完成后,在下一次系统启动时,grub界面的前后,将出现如下更多的debug日志:
加载出grub界面:
开始加载所选择的内核:
开始启动内核:
调试总结
作为系统引导的核心组件,GRUB的正常运行直接关系到操作系统能否成功启动。本文通过分析GRUB界面加载的前、中、后三个场景,对于出现的黑屏、引导卡光标、日志缺失等典型故障场景,系统性地提出了GRUB调试方法论:
a. 对于可以进入GRUB操作界面的场景,可通过追加调试参数、手动执行引导命令或修复配置文件快速定位问题;
b. 对于离开GRUB界面后,开始加载内核阶段的异常,需启用debug=all并配合pager=0禁用分页,以获取完整的GRUB调试日志;
c. 而对于GRUB界面加载前的故障,则需预先配置串口输出及全局调试参数,通过日志回溯分析根本原因。
该调试方案涉及了从固件层面到内核启动的整个引导流程,通过整合基础命令行操作与配置参数的精细化配合,能够高效地应对并解决大多数与GRUB引导相关的技术问题。
同时,在运维实践中,建议定期校验grub.cfg完整性并备份关键配置,以提升系统启动可靠性。
售前咨询
售后服务
回到顶部