为什么我的 EFI 变量属性中设置了额外的位,以及如何在保留这些属性的同时修改这些值?

为什么我的 EFI 变量属性中设置了额外的位,以及如何在保留这些属性的同时修改这些值?

我在 2015 年的 MacBook Pro 上运行 Linux 5.10-rc2。我正在尝试修改 EFI 变量以更好地理解它们的工作原理。但是,当我尝试使用 修改它们时efivar,出现Invalid argument错误。使用strace显示如下:

openat(AT_FDCWD, "/sys/firmware/efi/efivars/SPIKeyboardNoComm-4d1ede05-38c7-4a6a-9cc6-4bcca8b38c14", O_WRONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=8, ...}) = 0
write(4, "\7\0\0\200\22\0\0\0", 8)      = -1 EINVAL (Invalid argument)

引用fs/efivarfs/file.cLinux 中,从写入返回的唯一方法-EINVAL是写入的数据长度小于属性所需的四个字节,或者属性指定的位不在EFI_VARIABLE_MASK.这里看起来像是后者。参考include/linux/efi.h,前三位表示非易失性、引导访问和运行时访问,但也设置了不在掩码中的最高位。

我编写了一个小脚本来打印这台机器上所有 EFI 变量的属性位,并且它们都设置了最高位。这是什么意思?有什么方法可以取消设置,以便像 efivar 这样的工具可以工作吗?显然某处存在错误;是与efivar工具、Linux 内核还是这台机器上的 EFI 实现有关吗?

而且,这个问题并不总是存在。我能够在重新启动之前设置上面示例中的变量(与键盘相关的 Apple 特定变量)。在遇到这个问题之前我没有检查属性是什么。

相关内容