最近,在我对多重启动系统做了一些操作后,当我使用 启动 NixOS 时systemd-boot
,启动菜单不再显示,即使超时仍然设置为 2 秒/loader/loader.conf
(在 ESP 上):
# /loader/loader.conf on the ESP
timeout 2
default nixos-generation-380
这是我的/etc/nixos/configuration.nix
:
{ # ...
boot.loader = {
efi.canTouchEfiVariables = true;
systemd-boot.enable = true;
timeout = 2;
};
}
事实证明,要看到启动菜单,我必须在启动过程中按下某个键,就好像超时已设置为 0(而不是 2)秒一样。
我尝试systemd-bootx64.efi
从 ESP 中删除并nixos-install
使用 USB 闪存驱动器重新安装 NixOS。这恢复了systemd-bootx64.efi
但没有恢复启动菜单。
看来这个问题并不完全罕见:
Arch Linux 论坛:systemd-boot,无超时,无选择菜单 - LoaderEntryDefault
据报道,这两个问题都已得到解决。但是,我不明白第一个解决方案:
编辑3:解决了!重新安装 UEFI 就可以了。
“重新安装 UEFI”是什么意思?
至于第二个,它建议使用启动菜单中的t和Shift+t键(如果在启动过程中按下某个键,则会显示)来设置不同的超时,但我不想要只是不同的超时,我想要systemd-boot
尊重 中的设置/loader/loader.conf
。
所以,我的问题是:如何systemd-boot
再次使用设置/loader/loader.conf
?
找到解决方案后,我正在编辑这个问题,现在我要发布我的答案。
答案1
看完之后评论#6在“systemd-boot,无超时,无选择菜单 - LoaderEntryDefault”并看着“systemd-boot 设置 efivar LoaderEntryDefault,它会覆盖 /boot/loader/loader.conf 中的默认值” nixpkgs
GitHub 上的问题,我发现该问题可能是由 EFI 变量引起的,这些变量以某种方式设置并覆盖了/loader/loader.conf
.
事实上,这两个变量设置造成了麻烦:
§ cat /sys/firmware/efi/efivars/LoaderConfigTimeout-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
0
和
§ cat /sys/firmware/efi/efivars/LoaderEntryDefault-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
nixos-generation-374
(我在这里编造了值“ 374
”:重要的是它与/loader/loader.conf
我检查时的值不同。)
使用的 EFI 变量列表systemd-boot
可以在末尾找到“systemd-boot UEFI 启动管理器”页上自由桌面维基:
LoaderEntryDefault entry identifier to select as default at bootup non-volatile
LoaderConfigTimeout timeout in seconds to show the menu non-volatile
LoaderEntryOneShot entry identifier to select at the next and only the next bootup non-volatile
LoaderDeviceIdentifier list of identifiers of the volume the loader was started from volatile
LoaderDevicePartUUID partition GPT UUID of the ESP systemd-boot was executed from volatile
要删除LoaderEntryDefault-[...]
变量,只需在启动菜单中按两次键即可d:设置和取消设置新值。
要删除LoaderConfigTimeout-[...]
变量,结果足以按Shift+t足够多次将超时设置为0
,再加上一次。
这解决了我的问题。这里有一个相关的问题我在 Superuser.SE 上询问了有关安全修改 EFI 变量的一般问题。