EFI 启动表中的条目可能会将参数传递给它加载的存根。例如,这通常用于在使用 Linux 内核的 EFI 存根时识别系统根。
可以使用以下命令创建这样的启动项efibootmgr
:
efibootmgr --create --disk /dev/nvme2n1 --part 1 --label "gentoo (test)" --loader "\EFI\Gentoo\bzImage-test.efi" --unicode "root=PARTUUID=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709"
通常情况下,加载 GRUB 的条目会不是提供任何参数,并在 中配置 GRUB 的菜单超时/boot/grub/grub.cfg
。 GRUB 的典型条目可以在以下输出中看到,由 生成efibootmgr --unicode
:
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0002,0000,0003
...
Boot0001* gentoo HD(1,GPT,c12a7328-f81f-11d2-ba4b-00a0c93ec93b,0x800,0x100000)/File(\EFI\gentoo\grubx64.efi)
EFI 启动项是否可以向 GRUB 提供参数,并且可以使用这样的参数来覆盖超时吗?
我这样做的原因是为了方便:如果可能的话,可以在 GRUB 中配置无限超时/boot/grub/grub.cfg
并将两个条目写入 EFI 表:
- 一个没有参数的应用无限超时(或设置的任何内容
/boot/grub/grub.cfg
) - 它用非常短的超时时间覆盖它,从而实现更快的启动时间。
后者可以设置为默认启动选项,但是,如果出现问题,可以使用主板的固件从前者启动。
答案1
EFI 启动项是否可以向 GRUB 提供参数,并且可以使用这样的参数来覆盖超时吗?
不;GRUB 不会查看它们。(至少我在 grub-core/kern/efi/ 中找不到它们。)
它只关注小路它已被调用,因此理论上你可以grubx64.efi
在不同的文件夹中拥有两个副本,每个副本将使用不同的 grub.cfg(它可能设置不同的参数并提供“共享” grub.cfg),但不能直接通过加载选项字段。
后者可以设置为默认启动选项,但是,如果出现问题,可以使用主板的固件从前者启动。
您已经可以通过其他方式实现这一点;例如,GRUB 能够解析 systemd-boot 配置格式,因此您可以使用 systemd-boot 作为主加载器(超时为零)并回退到 GRUB,然后使用命令bls
导入 systemd-boot 菜单条目。
(您可以在没有 systemd-init 的情况下使用 systemd-boot,它是一个相当通用的 EFI 启动管理器。)
就此而言,您可以使用 systemd-boot 作为仅有的启动管理器,具有零超时,只要您需要在菜单中停止,只需按住空格键即可中断该过程。
(GRUB 也有类似的机制,可以通过 /etc/default/grub 激活;上次尝试时没有成功,但那是 10 多年前的事了,所以也许它在较新的固件上运行得更好。)