已设置grub2/update_nvram为false,但apt触发grub-install时仍未自动添加--no-nvram参数导致失败,该如何排查?
我之前在Ubuntu Focal上也遇到过类似的问题,给你分享几个排查和解决的方向:
1. 确认debconf配置是否精准生效
你用debconf-show查到的是全局的配置,但最好确认下grub-efi-amd64包本身的debconf值是否正确,避免全局和包级配置不一致的问题:
echo "get grub2/update_nvram" | debconf-communicate grub-efi-amd64
如果输出不是false,说明包级的配置没设置对,可以重新设置:
echo "set grub2/update_nvram false" | debconf-communicate grub-efi-amd64
2. 检查grub-efi-amd64的postinst脚本逻辑
apt更新时触发的grub-install是由grub-efi-amd64的postinst脚本调用的,我们可以直接查看这个脚本的逻辑是否正确读取了debconf配置:
打开脚本文件:
sudo nano /var/lib/dpkg/info/grub-efi-amd64.postinst
查找处理grub2/update_nvram的代码段,正常应该有类似这样的逻辑:
GRUB_UPDATE_NVRAM=$(debconf-get grub2/update_nvram) if [ "$GRUB_UPDATE_NVRAM" = "false" ]; then GRUB_INSTALL_OPTS="$GRUB_INSTALL_OPTS --no-nvram" fi
如果这段代码不存在,或者有语法错误(比如字符串比较没加引号、变量名写错),那就是脚本的问题。
3. 调试postinst脚本的变量传递
如果脚本逻辑看起来没问题,但还是没生效,可以临时在脚本里加调试信息,看看变量值是否正确传递:
在postinst脚本中调用grub-install的代码前,添加一行:
echo "[$(date)] GRUB_UPDATE_NVRAM: $GRUB_UPDATE_NVRAM | GRUB_INSTALL_OPTS: $GRUB_INSTALL_OPTS" >> /tmp/grub-debug.log
然后运行apt reinstall grub-efi-amd64-signed,之后查看日志:
cat /tmp/grub-debug.log
如果日志里GRUB_UPDATE_NVRAM不是false,说明debconf的值没有被正确读取到脚本里;如果是false但GRUB_INSTALL_OPTS里没有--no-nvram,那就是脚本的判断逻辑有问题。
4. 检查是否有其他配置覆盖debconf设置
系统里的/etc/default/grub或者/etc/default/grub.d/*.cfg文件可能会设置GRUB_UPDATE_NVRAM变量,覆盖debconf的配置。用下面的命令检查:
grep -r GRUB_UPDATE_NVRAM /etc/default/grub*
如果查到有设置,要么删除这个设置,要么把它改成false。
5. 临时 workaround(避免每次手动执行)
如果以上排查都没解决,或者你不想等bug修复,可以手动修改postinst脚本,强制添加--no-nvram参数:
- 先备份原脚本:
sudo cp /var/lib/dpkg/info/grub-efi-amd64.postinst /var/lib/dpkg/info/grub-efi-amd64.postinst.bak
- 编辑脚本,找到
GRUB_INSTALL_OPTS的定义行,直接添加--no-nvram:
sudo nano /var/lib/dpkg/info/grub-efi-amd64.postinst
比如改成:
GRUB_INSTALL_OPTS="--target=x86_64-efi --efi-directory=$efi_dir --bootloader-id=ubuntu --recheck --no-nvram"
- 为了避免包更新时脚本被覆盖,可以用
dpkg-divert保护修改后的脚本:
sudo dpkg-divert --local --rename --add /var/lib/dpkg/info/grub-efi-amd64.postinst
这样以后包更新时,系统会使用你修改后的版本,而不是替换掉。
6. 确认是否是bug
如果以上步骤都确认没问题,那大概率是grub-efi-amd64包在Focal版本的一个bug,你可以去Ubuntu的官方bug跟踪平台提交报告,说明你的环境、操作步骤和问题现象,帮助开发者修复。
备注:内容来源于stack exchange,提问作者Marlies

