GRUB debug选项设置方法
为方便调试和问题定位,可将 GRUB 的 debug 开启,并输出至串口,方便日志保存供调试。
·
GRUB debug选项设置方法
1. 目的说明
为方便调试和问题定位,可将 GRUB 的 debug 开启,并输出至串口,方便日志保存供调试。
说明:本指南介绍三种常用方法,任选其一即可,无需全部操作。推荐优先使用方法一。
方法一:通过脚本和配置文件设置(推荐)
- 在
/etc/grub.d/40_custom或新建/etc/grub.d/09_debug,添加如下内容:set debug="efi disk video loader net fs partition acpi usb serial ata scsi mm malloc file normal term font crypto datetime env core module mmap multiboot linux initrd boot devicetree pci bios pxe tpm lzma gcry gpt zfs btrfs ext2 fat ntfs iso9660 squashfs lvm raid luks password menu cmdline configfile search probe test trig verifiers verifier xen apple chainloader reboot halt recovery" - 保存后,更新 GRUB 配置:
- Ubuntu/Debian:
sudo update-grub - RHEL/CentOS:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg - EFI 系统可能是
/boot/efi/EFI/<distro>/grub.cfg
- Ubuntu/Debian:
- 重启系统,GRUB debug 环境变量会自动生效。
方法二:直接编辑grub.cfg(不推荐)
- 直接编辑
/boot/grub/grub.cfg或 EFI 分区的grub.cfg,在启动项前加:set debug="efi disk ..."~ - 注意: 此方法升级 GRUB 或内核后会被覆盖,建议仅临时调试使用。
方法三:在GRUB命令行下设置并持久保存环境变量
- 启动时进入GRUB菜单界面。
- 按
c进入GRUB命令行模式。 - 输入如下命令设置调试选项并保存:
set debug="efi disk ..." terminal_output serial_com0 # 或 terminal_output serial_efi0 # 如需同时在屏幕和串口输出: # terminal_output console serial_com0 save_env debug save_env terminal_output - 输入
echo $debug可查看当前debug变量内容。 - 按
ESC返回菜单,选择启动项继续启动。 - 重启后,GRUB 会自动加载
grubenv文件中的变量,调试选项和终端设置依然生效。
其他相关配置
设置GRUB终端为串口输出
- 在
/etc/grub.d/40_custom或新建/etc/grub.d/09_debug,添加如下内容:serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 # 注意:在UEFI环境下,串口名可能是 serial_com0、serial_efi0、serial_efi1 等,需根据实际环境选择。 terminal_output serial_com0 # 或 terminal_output serial_efi0 # 或 terminal_output serial_efi1 - 如需同时在屏幕和串口输出,可用:
terminal_output console serial_com0 # 或 terminal_output console serial_efi0 - 保存后,更新GRUB配置并重启。
6. 注意事项
- 推荐通过
/etc/default/grub+grub.d脚本方式设置,便于维护和升级。 - 修改后务必执行
update-grub或grub2-mkconfig以使配置生效。 - 串口参数需与物理串口/远程终端工具一致(如minicom、putty等)。
- 某些UEFI/主板需在BIOS中开启串口功能。
- 若无输出,检查串口线连接、串口号、波特率设置。
- 可根据实际需求调整 debug facility 列表,避免无关调试信息干扰。
附录
A. debug facility选项的选择与提取
在实际调试中,直接使用 set debug=all 虽然可以开启所有调试信息,但会导致scripting等模块输出大量无关信息,严重干扰分析。由于GRUB当前实现不支持set debug="all,-scripting"这种排除法,无法只关闭某一类facility。
推荐做法:
- 手动列出所有你关心的facility(模块名),排除不需要的(如scripting),然后设置到debug变量。
提取facility名方法
在GRUB源码目录下用如下命令提取所有grub_dprintf的第一个参数(即facility名):
grep -roh 'grub_dprintf *([ \t]*"[^"]*"' grub-core/ | awk -F'"' '{print $2}' | sort | uniq
- 这样可以获得所有可用的debug facility名。
- 将这些名字用空格拼接,填入
set debug="...",即可开启所有你关心的调试信息。
示例
假如你想排除scripting,可以这样:
set debug="efi disk video loader net fs partition acpi usb serial ata scsi mm malloc file normal term font crypto datetime env core module mmap multiboot linux initrd boot devicetree pci bios pxe tpm lzma gcry gpt zfs btrfs ext2 fat ntfs iso9660 squashfs lvm raid luks password menu cmdline configfile search probe test trig verifiers verifier xen apple chainloader reboot halt recovery"
这样既能获得绝大多数调试信息,又不会被scripting刷屏。
B. 常见串口参数说明
--unit=0:串口号(0为COM1/ttyS0,1为COM2/ttyS1等)--speed=115200:波特率--word=8:数据位--parity=no:无校验--stop=1:停止位
C. 相关命令与技巧
save_env命令会将指定变量写入/boot/grub/grubenv或 EFI 分区的grubenv文件。- GRUB 启动时会自动加载这些变量,优先级高于
grub.cfg默认值。 - 适合保存如 root、next_entry、debug、terminal_output 等变量。
- 优点:无需修改系统配置文件,操作简单,重启后自动生效。
- 缺点:变量内容较长时(如 debug facility 很多),在 VGA/串口界面下无法复制粘贴,手动输入繁琐且易错。
- 若需批量或复杂配置,建议在 Linux 下编辑脚本或配置文件。
相关命令
- 查看已保存的变量:
list_env - 清除变量(恢复默认):
set debug= save_env debug
D. 参考资料
- 官方文档:https://www.gnu.org/software/grub/manual/grub/grub.html
- GRUB源码:https://git.savannah.gnu.org/git/grub.git
- 相关社区讨论与调试经验
更多推荐



所有评论(0)