我想获取 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"