编译安装的GRUB 2.12默认加载grub.cfg路径配置问题
编译安装的GRUB 2.12默认加载grub.cfg路径配置问题
我来帮你梳理下GRUB默认加载grub.cfg的逻辑,以及怎么调整它指向你加密boot目录里的配置文件:
GRUB默认找grub.cfg的优先级逻辑
GRUB的EFI二进制文件(比如你提到的grubx64-signed.efi)默认会按以下顺序寻找grub.cfg:
- 第一优先级是和EFI文件在同一目录下的grub.cfg——这本来应该是你期望的情况,但没生效的话,大概率是你复制文件时没同步更新GRUB内部的路径配置,或者最初编译安装时的参数不对。
- 如果同目录找不到,会 fallback 到EFI系统分区下的
/EFI/BOOT/grub.cfg,或者根据编译安装时嵌入的默认prefix路径去查找。
grub-install如何配置默认的grub.cfg路径
当你用grub-install安装GRUB时,它会把一个默认的prefix路径嵌入到生成的EFI二进制文件里,GRUB默认会加载$prefix/grub.cfg这个文件。
针对你的场景(Ubuntu 22.04,加密boot,GRUB 2.12源码编译),你需要重新执行grub-install,明确指定参数让它把prefix指向你加密boot的目录/boot/efi/EFI/ubuntu1/。假设你的EFI分区挂载在/boot/efi(通常是这样),可以用这条命令:
sudo grub-install --efi-directory=/boot/efi --boot-directory=/boot/efi/EFI/ubuntu1 --target=x86_64-efi --modules="cryptodisk luks" --bootloader-id=ubuntu1
这里的几个关键参数:
--boot-directory指定GRUB相关文件(包括grub.cfg)的存放目录--bootloader-id会在EFI分区下创建对应的标识目录,同时把正确的prefix嵌入到EFI二进制中--modules提前加载加密磁盘相关模块,确保GRUB能识别加密boot分区
执行完这个命令后,再重新生成该目录下的grub.cfg,确保配置是针对加密boot的:
sudo grub-mkconfig -o /boot/efi/EFI/ubuntu1/grub.cfg
为什么当前会加载普通boot的grub.cfg?
因为你最初是在普通boot环境下执行的grub-install,这时候生成的EFI二进制里嵌入的prefix是指向普通boot的路径。后来你只是复制了文件,但没有更新EFI二进制内部的prefix配置,所以启动时GRUB还是会按照原来的旧路径去寻找普通boot里的grub.cfg。
验证方法
你可以在GRUB启动时按c进入命令行,执行echo $prefix,看看当前默认的prefix是什么——如果显示的是普通boot的路径,就说明之前的猜测是对的,重新执行上面的grub-install命令就能解决问题。
备注:内容来源于stack exchange,提问作者mr.anand
相关产品推荐
相关产品推荐

