GRUB 本身并没有一个单一的 --dry-run 参数,但我们可以通过一套组合拳来实现从“语法检查”到“沙盒模拟”的完整验证流程。
以下是排查和诊断 GRUB 设置更新的标准化流程:
1. 语法检查 (Syntax Validation)
当你修改了 /etc/default/grub 或 /etc/grub.d/ 下的脚本,并执行了 grub-mkconfig 之后,第一步是检查生成的配置文件是否存在 Shell 语法错误(如漏掉括号、引号未闭合等)。
GRUB 提供了一个内置的语法检查工具:
grub-script-check /boot/grub/grub.cfg
- 如何判断: 这个命令没有任何输出就是最好的消息。如果直接返回到提示符(通过
echo $?查看返回值为 0),说明语法完全合法。如果有错误,它会精确报错到具体的行数。
2. 差异化“空跑” (The Diff Dry-Run)
这是最推荐的日常修改习惯。 不要直接覆盖现有的配置文件。你可以让 GRUB 把生成的新配置输出到一个临时文件里,然后通过 diff 来审查到底改了什么。
# 1. 将新配置生成到 /tmp 目录
sudo grub-mkconfig -o /tmp/grub.cfg.test
# 2. 对比当前生效的配置和新配置
diff -u /boot/grub/grub.cfg /tmp/grub.cfg.test
通过对比,你可以清晰地看到你添加的内核参数(比如 quiet、net.ifnames=0 或特定的 UUID 变更)是否正确注入到了对应的 linux 启动行中,且没有破坏其他启动项。确认无误后,再将临时文件覆盖回原处,或直接执行常规的 update-grub。
3. 沙盒模拟器 (GRUB Emulator)
如果你想亲眼看看更新后的菜单长什么样、默认倒计时是否正确、默认高亮的条目对不对,而又不想真的重启,你可以使用 GRUB 模拟器。
它会在用户空间的终端里(基于 ncurses)或图形界面下启动一个虚拟的 GRUB 环境,读取你的真实配置文件,模拟出完整的引导菜单交互。
# 在 Debian 系统中安装模拟器
sudo apt install grub-emu
# 运行模拟器
sudo grub-emu
在模拟器里,你可以像真机一样用上下键选择,按 e 查看启动参数。按 c 进入 GRUB 命令行测试命令。无论你怎么折腾,它都不会真的去引导内核,按 Ctrl+C 即可安全退出。
进阶:远程 VPS 的“不死鸟”防砖策略
即使上述的 Dry-run 全都通过,也不能 100% 保证新配置或新内核能成功点亮硬件。对于远程机器,推荐配置一个故障回退(Fallback)机制作为最后的保险。
如果你是在测试一个新的内核参数或新内核版本,建议在 /etc/default/grub 中的 GRUB_CMDLINE_LINUX_DEFAULT 里加上:
panic=30
这代表如果内核启动时发生严重恐慌(Kernel Panic,比如找不到根文件系统),系统会在 30 秒后自动硬重启。
配合 GRUB 的单次启动指令:
# 告诉 GRUB 下一次重启临时使用特定的启动项(比如菜单里的第 2 项)
sudo grub-reboot "1>2"
sudo reboot
这样如果测试的启动项炸了,由于 panic=30 的存在,服务器会自动重启。而 grub-reboot 是一次性的,再次重启时,服务器就会乖乖回到你原先默认的、稳定的启动项,完美自救。