如何在 UEFI 中列出 grub2 菜单项

如何在 UEFI 中列出 grub2 菜单项

我想获取 linux (centos 8 / fedora 32) 的 grub2 菜单项列表UEFI开机,使用grub2-set-default

我可以在非 uefi 环境中使用此命令获取菜单列表

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

我知道 grub.cfg 与 uefi 位于不同的路径中:

#non uefi cfg
/etc/grub2.cfg -> /boot/grub2/grub.cfg
#uefi cfg
/etc/grub2-efi.cfg  -> ../boot/efi/EFI/centos/grub.cfg

但如果我无法在 /etc/grub2-efi.cfg 非 uefi 环境中获取所有菜单项。

[root@vm-centos centos]# grep ^menuentry /etc/grub2-efi.cfg
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {

我该怎么办?

答案1

在 RHEL/CentOS 8 中,GRUB 使用新blscfg模块,该模块从/boot/loader/entries/..conf每个条目应该有一个文件。

欲了解更多信息,请参阅 https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault

这与 UEFI 无关,但也被基于 MBR 的经典 GRUB 使用。事实上,该/boot/loader/entries/目录及其文件也将存在于根本不使用 GRUB 的体系结构上,例如 s390x 或 aarch64。

/boot/loader/entries/*.conf引导条目不是通过数字来标识的,而是通过名称来标识的,这些名称本质上是不带路径和后缀的各个文件的名称.conf

awk以下内容可能与 RHEL/Centos 8 的一行内容非常相似:

for i in /boot/loader/entries/*.conf
do 
    entryname=$(basename $i .conf)
    entrytitle=$(grep title $i | cut -f 2-)
    echo "$entryname : $entrytitle"
done

默认条目由(在传统 BIOS/MBR 系统中)或(在 UEFI 系统中)saved_entry=中的设置标识。在默认安装中,这两个文件将在 BIOS/MBR 和 UEFI 可引导系统中以相同的内容存在,但如果在引导时选择非默认条目,则只有其中一个会被 GRUB 修改。/boot/grub2/grubenv/boot/efi/EFI/redhat/grubenv

此代码片段可用于识别当前选择的引导条目:

if [ -d /sys/firmware/efi ]
then
    envfile=/boot/efi/EFI/redhat/grubenv
else
    envfile=/boot/grub2/grubenv
fi
bootdefault=$(awk -F '=' '/^saved_entry/{print $2;}' $envfile)
echo "Default boot entry name: $bootdefault"

相关内容