“此系统不支持 EFI 变量”

Joh*_*ing 34 uefi

我正在尝试将 Arch linux 安装到新的(非常糟糕的)HP Pavillion 15 笔记本电脑上。

这是一台基于 UEFI 的机器。经过几次摆动后,我已经走得很远了。传统模式在系统设置中被禁用,我已经通过 EFI 引导到我刻录的 Arch DVD,并通过 Arch初学者指南和更高级的安装指南进行到我安装 grub 的地步。

chrooted 时,我执行:

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub --recheck --debug
Run Code Online (Sandbox Code Playgroud)

这会发出大量输出,包括:

此系统不支持 EFI 变量

我第一次到这一步时,我继续安装,不知道这是否是一个实际问题。原来是这样,因为当我重新启动机器时,找不到可启动的媒体,机器拒绝启动。那时我可以进入 UEFI 设置菜单并选择要启动的 EFI 文件,然后 Arch Linux 就会启动。

但我现在要回去重新安装,试图解决上述问题。

如何让 GRUB 正确安装?

Joh*_*ing 32

问题只是efivarfs没有加载内核模块。

这可以通过以下方式确认:

sh-4.2# efivar-tester
UEFI variables are not supported on this machine.
Run Code Online (Sandbox Code Playgroud)

如果您chroot进入新安装,exit退出,然后启用efivarfs

exit
modprobe efivarfs
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • efivars 模块现在已被“efivarfs”取代 (https://wiki.debian.org/UEFI#efibootmgr_and_efivar)。 (9认同)
  • 遗憾的是,`modprobe efivars` 给出了 `modprobe: FATAL: Module efivars not found in directory /lib/modules/4.16.3-301.fc28.x86_64`(新安装的 live usb) (8认同)
  • 但是在不支持 UEFI 的系统上呢?如果我的工作计算机不支持 UEFI,我到底如何在我的 U 盘上安装支持 UEFI 的 GRUB 以在新的 UEFI 计算机上安装 Arch?一定有办法做到的! (7认同)
  • 虽然 `modprobe efivarfs` 可以工作,但 OP 描述的问题仍然存在。也许这个答案需要更新?我完全没有想法了。 (4认同)

小智 20

如果您使用旧版而不是 UEFI 方法启动,您将收到此错误。您需要确保在 BIOS 菜单中选择 UEFI 引导项,或选择 UEFI 作为默认引导方法。

  • 我发现在我的启动菜单中,我的 USB 密钥有两个条目,我选择了底部的一个。上面说的是 UEFI:USB Key Gentoo。那修复了它。 (5认同)
  • +1,这就是问题所在。在技​​嘉 Aorus Master 上,我必须按 F12 并选择 EFI Arch 才能启动。 (2认同)

小智 17

我知道,这是非常古老的线程,但也许会对某人有所帮助。大多数指南都建议在 chroot 之前安装虚拟文件系统的相同解决方案:

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
Run Code Online (Sandbox Code Playgroud)

但是现在(可能与 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
Run Code Online (Sandbox Code Playgroud)

实际成功案例:带有 4.9.0-5(efivars)的 Debian 由 Arch Linux live cd(选择只是因为可以启动 uefi 开箱即用)和 4.14.9-1-ARCH(efivarfs)仅通过绑定安装 /sys /固件/efi/efivars

  • `mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars` 在 chroot 之前成功了!谢谢! (3认同)
  • 经过长时间的搜索,这为我解决了!谢谢你! (3认同)
  • `'/sys/firmware/efi': 没有这样的文件或目录` (2认同)

use*_*414 8

运行 Fedora 27,我需要安装efivarfs. 我在 chrootfs 中执行了此操作,但这仍然不起作用,因为启动条目显示为efibootmgr- 但重新启动后,它既没有启动,也没有在回到实时操作系统中显示。

最终起作用的是,从实时介质中使用 grub,进入 shell,然后输入 linuxefi /vmlinuz-<version> root=/dev/mapper/luks-<uuid> ro initrdefi /initramfs-<version>.img boot 从正常启动的操作系统,我可以grub2-install在没有 的情况下运行chroot,并且有效。

我不确定这是否只是我的 BIOS 的问题,或者还有更普遍的错误,但这就是运行时grub2-install没有报告任何错误的原因。

# Open encrypted root partion cryptsetup luksOpen /dev/sda4 a4 mount /dev/mapper/a4 /mnt mount /dev/sda2 /mnt/boot mount -t proc proc /mnt/proc mount -t sysfs sys /mnt/sys mount -o bind /dev /mnt/dev mount -t devpts pts /mnt/dev/pts/ mount -o bind /etc/resolv.conf /mnt/etc/resolv.conf chroot /mnt # run inside the chroot: mount /dev/sda1 /boot/efi mount -t efivarfs efivarfs /sys/firmware/efi/efivars grub2-install


小智 6

经过一番折腾,终于找到了解决办法。就我而言,我在 EFI 系统上自定义编译并安装了 preempt-rt 内核(5.6.19-rt11(已修补))。

发现的问题是 preempt-rt 内核没有激活 efi 运行时,因此出现错误。

解决方案很简单:

添加efi=runtime到 /etc/default/grub 配置中的内核参数。

GRUB_CMDLINE_LINUX_DEFAULT="efi=runtime quiet"
Run Code Online (Sandbox Code Playgroud)

别忘了sudo update-grub2