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은 작성된 데이터의 길이가 속성에서 요구하는 4바이트보다 작거나 속성에서 지정한 비트가 없는 경우입니다 EFI_VARIABLE_MASK. 여기서는 후자처럼 보입니다. 참고로 include/linux/efi.h처음 3비트는 비휘발성, 부팅 액세스, 런타임 액세스를 나타내지만 마스크에 없는 최상위 비트도 설정됩니다.

나는 이 컴퓨터에 있는 모든 EFI 변수의 속성 비트를 인쇄하는 작은 스크립트를 작성했는데, 모두 가장 높은 비트가 설정되어 있습니다. 무슨 뜻이에요? efivar와 같은 도구가 작동할 수 있도록 설정을 해제할 수 있는 방법이 있습니까? 분명히 어딘가에 버그가 있습니다. efivar이 시스템의 도구, Linux 커널 또는 EFI 구현과 관련되어 있습니까?

게다가 이 문제가 항상 존재하는 것은 아닙니다. 다시 시작하기 전에 위의 예에서 변수(키보드 관련 Apple 특정 변수)를 설정할 수 있었습니다. 이 문제가 발생하기 전에 속성이 무엇인지 확인하지 않았습니다.

관련 정보