명령줄에서 OsInductions efi 변수를 작성/편집/업데이트하는 방법은 무엇입니까?

명령줄에서 OsInductions efi 변수를 작성/편집/업데이트하는 방법은 무엇입니까?

UEFI 펌웨어 설정 유틸리티에 들어가야 하는 초고속 부팅을 사용할 때(POST 중에 키보드 드라이버가 로드되지 않음) "Os Inspirations" efi 변수에 쓰고 싶습니다. 내 운영 체제는 Ubuntu 14.04 커널 3.13.0-35-generic입니다.

OsIndications변수는 UINT64 비트마스크를 반환합니다.

OsIndicationsSupported변수는 UINT64 비트마스크를 반환합니다.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI펌웨어가 펌웨어 사용자 인터페이스에서 중지하라는 OS 요청을 지원하는 경우 펌웨어는 OsInductionsSupported 변수에서 이 비트를 설정할 수 있습니다. EFI_OS_INDICATIONS_BOOT_TO_FW_UI운영 체제가 다음 부팅 시 펌웨어 사용자 인터페이스에서 펌웨어를 중지하기를 원하는 경우 운영 체제는 OsIndicates 변수에서 이 비트를 설정할 수 있습니다.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001-UEFI 사양 2.3.1C 312페이지

내 펌웨어는 다음 부팅 시 펌웨어 설정 유틸리티에 들어갈 수 있습니다.

$ hexdump /sys/firmware/efi/vars/OsIndicationsSupported-8be4df61-93ca-11d2-aa0d-00e098032b8c/data
0000000 0001 0000 0000 0000
0000008

/sys/firmware/efi/efivars다음을 사용하여 새 변수를 만들 수 있습니다 .

$ printf\x07\x00\x00\x00\x00" > myvar-12345678-1234-1234-1234-123456789abc

그러나 efi 변수에 쓰면 OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c다양한 결과가 발생할 수 있습니다 write error: Invalid argument.

새로운 efivaf를 사용하세요

# printf "x00\x00\x00\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument

# printf "x00\x00\x00\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument

# printf "\x01" > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
-bash: printf: write error: Invalid argument

# cat enter-uefi-fw > /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
cat: write error: Invalid argument

이전 1024바이트 최대 sysfs-efivars 사용

# cat enter-uefi-fw > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
cat: write error: Input/output error

# cat enter-uefi-fw > /sys/firmware/efi/vars/new_var
cat: write error: Invalid argument

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
-bash: echo: write error: Invalid argument

# printf "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
-bash: printf: write error: Invalid argument

UEFI 변수 지원이 제대로 작동하려면 요구 사항을 확인하세요.

  1. EFI 런타임 서비스 지원은 커널
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y반환 에 표시되어야 합니다.CONFIG_EFI=y
  2. 코어 프로세서 비트/아키텍처와 EFI 프로세서 비트/아키텍처가 일치해야 합니까
    ?
  3. 커널은 EFI 모드에서 부팅되어야 합니다.
    펌웨어 설정 유틸리티/BIOS에서 CSM이 비활성화되어 있습니다.
  4. 커널 명령줄을 통해 커널의 EFI 런타임 서비스를 비활성화하면 안 됩니다. 즉, noefi 커널 매개 변수를 사용하면 안 됩니다.
    cat /proc/cmdline | grep EFI아무것도 반환하지 않음
  5. efivarfs 파일 시스템은 /sys/firmware/efi/efivars
    mount | grep efivarsreturn 에 마운트되어야 합니다.none on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lEFI 변수는 오류 없이 나열되어야 합니다.
    이 명령은 오류 없이 82개 라인을 나열합니다.
  7. /sys/firmware/efi/efivars/dump-* 파일이 있는지 확인하세요.
    덤프 파일이 존재하지 않습니다.

~에 따르면https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402cat enter-uefi-fw > /sys/firmware/efi/vars/new_var명령은 Fedora 17에서 작동합니다.

OsInductions를 먼저 제거해도 개선되지 않았습니다.

# rm -rv /sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c
removed '/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'
# ls -l enter-uefi-fw
-rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw
# cat enter-uefi-fw > /sys/firmware/efi/vars/new_var
cat: write error: Invalid argument

명령줄에서 Ubuntu 14.04(신뢰할 수 있음)의 기존 OsInductions efi 변수를 업데이트하는 방법은 무엇입니까?

답변1

많은 수의 펌웨어 오류로 인해 비표준 UEFI 변수를 삭제하면 시스템 펌웨어가 POST를 수행하지 못하게 됩니다. 에피와프잘 알려진 표준화 변수가 아닌 파일은 불변 파일로 생성됩니다.

https://www.kernel.org/doc/Documentation/filesystems/efivarfs.txt

이는 다음 명령으로 확인하고 변경할 수 있습니다.lsattr그리고샤텔주문하다.

예를 들어:

root@hi12:/tmp/test# hexdump -C out 
00000000  07 00 00 00 10 00 00 00                           |........|
00000008
root@hi12:/tmp/test# cp out /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
cp: cannot create regular file '/sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23': Operation not permitted
root@hi12:/tmp/test# lsattr  /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
----i-------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# chattr -i /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
root@hi12:/tmp/test# lsattr  /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
------------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# cp out /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
root@hi12:/tmp/test# chattr +i /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
root@hi12:/tmp/test# lsattr  /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23 
----i-------------- /sys/firmware/efi/efivars/BootSelectVariable-944fb13b-773f-4cbb-9c6f-326cebde4c23
root@hi12:/tmp/test# 

답변2

관련 64비트 마스크는 다음과 같습니다.

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

이는 다음을 사용하여 little-endian(Intel) 형식 문자열로 생성될 수 있습니다.

  str='\x01\x00\x00\x00\x00\x00\x00\x00'; printf "$str"

위의 출력 printf "$str"데이터 내용efivarfs 변수 파일 $var, 여기서

  var='/sys/firmware/efi/efivars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c'

그러나 각 파일은 /sys/firmware/efi/efivars다음으로 끝납니다.4바이트 헤더그런 다음 데이터 콘텐츠가 있습니다. 따라서 printf "$str"출력을 efivarfs 변수 파일에 쓰기 전에 출력 앞에 4바이트 헤더가 추가되어야 합니다 $var. 위에서 언급했듯이 $str이는 다음을 사용하여 수행할 수 있습니다. 예를 들어 다음을 사용합니다.$var

  { head -c 4 "$var"; printf "$str"; } > "$var"

답변3

echo대신 사용해 보세요 cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var

관련 정보