我正在尝试将 Arch linux 安装到一台新的(而且非常蹩脚的)HP Pavillion 15 笔记本上。
这是一台基于 UEFI 的机器。经过几次尝试后,我已经取得了相当大的进展。系统设置中禁用了传统模式,并且我已通过 EFI 引导至我刻录的 Arch DVD,并通过两个 Arch初学者指南以及更先进的安装指南到我正在安装 grub 的地步。
在chroot
编辑时,我执行:
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
这会发出大量输出,包括:
该系统不支持 EFI 变量
当我第一次到达这一点时,我继续安装,不知道这是否是一个实际问题。事实证明,当我重新启动机器时,找不到可启动介质,并且机器拒绝启动。此时我可以进入 UEFI 设置菜单并选择要启动的 EFI 文件,Arch Linux 就会启动。
但我现在回去重新安装,试图解决上述问题。
如何才能正确安装 GRUB?
答案1
我知道,这是非常古老的线程,但也许会对某人有所帮助。大多数指南建议使用相同的解决方案在 chroot 之前挂载虚拟文件系统:
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
但现在(可能与 efivars/efivarfs 更改有关)此循环会跳过一个非常特殊的子挂载点 -/sys/firmware/efi/efivars
并且 efibootmgr/grub 失败。
因此,请改用这一行:
for i in /dev /dev/pts /proc /sys /sys/firmware/efi/efivars /run; do sudo mount -B $i /mnt$i; done
实际成功案例:Debian 4.9.0-5 (efivars) 由 Arch Linux live cd 保存(选择它只是因为可以开箱即用地启动 uefi),通过绑定安装 /sys 使用 4.14.9-1-ARCH (efivars) /固件/efi/efivars
答案2
问题很简单,就是efivarfs
内核模块没有加载。
这可以通过以下方式确认:
sh-4.2# efivar-tester
UEFI variables are not supported on this machine.
如果您chroot
进入新安装,exit
退出,然后启用efivarfs
:
exit
modprobe efivarfs
(efivarfs
过去是这样efivars
,所以如果这返回错误,请尝试modprobe efivars
)
...然后chroot
返回。就我而言,这意味着:
chroot /mnt
但你应该chroot
像以前一样。
重新进入后,再次测试:
efivar-tester
这样就不再报错了,就可以像之前一样安装grub了。
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
答案3
如果您使用旧版而不是 UEFI 方法启动,您将收到此错误。您需要确保在 BIOS 菜单中选择 UEFI 启动项,或者选择 UEFI 作为默认启动方式。
答案4
经过一番折腾,终于找到了解决办法。就我而言,我在 EFI 系统上自定义编译并安装了 preempt-rt 内核(5.6.19-rt11(已修补))。
发现的问题是 preempt-rt 内核没有激活 efi 运行时,因此出现错误。
解决方案很简单:
添加efi=runtime
到 /etc/default/grub 配置中的内核参数。
GRUB_CMDLINE_LINUX_DEFAULT="efi=runtime quiet"
别忘了sudo update-grub2
!