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


9

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

OsIndications 변수는 UINT64 비트 마스크를 반환

OsIndicationsSupported 변수는 UINT64 비트 마스크를 반환

EFI_OS_INDICATIONS_BOOT_TO_FW_UI펌웨어 지원을 요청 OS 펌웨어 사용자 인터페이스에서 멈출 경우, 비트는 펌웨어로 OsIndicationsSupported 변수를 설정할 수있다. EFI_OS_INDICATIONS_BOOT_TO_FW_UI펌웨어에 대한 OS의 욕망이 다음 부팅에 대한 펌웨어 사용자 인터페이스에서 중지하는 경우 비트는 OsIndications 변수의 OS에 의해 설정 될 수있다.

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.

새로운 efivarfs 사용

# 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. 커널
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y리턴 에 EFI 런타임 서비스 지원이 있어야 합니다.CONFIG_EFI=y
  2. 커널 프로세서 비트 / 아치 및 EFI 프로세서 비트 / 아치가
    ?
  3. EFI 모드에서 커널을 부팅해야합니다
    펌웨어 설정 유틸리티 / BIOS에서 CSM이 비활성화되어 있습니다.
  4. 커널의 EFI 런타임 서비스는 커널 cmdline을 통해 비활성화해서는 안됩니다. 즉 noefi 커널 매개 변수를 사용하면 안됩니다.
    cat /proc/cmdline | grep EFI아무것도 반환하지 않습니다
  5. efivarfs 파일 시스템은 / sys / firmware / efi / efivars에 마운트해야
    mount | grep efivars합니다.none on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -l오류없이 EFI 변수를 나열해야합니다
    . 명령은 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-16402 에 따르면 이 cat enter-uefi-fw > /sys/firmware/efi/vars/new_var명령은 Fedora에서 작동합니다 17.

OsIndications를 먼저 삭제해도 개선되지 않습니다

# 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 (trusty)의 기존 OsIndications efi 변수를 어떻게 업데이트 할 수 있습니까?

답변:


1

비표준 UEFI 변수를 제거하면 시스템 펌웨어가 POST에 실패하는 수많은 펌웨어 버그가 있기 때문에 잘 알려진 표준화 변수가 아닌 efivarfs 파일은 변경 불가능한 파일로 생성됩니다.

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

lsattrchattr 명령으로 이를 확인하고 변경할 수 있습니다 .

예를 들면 다음과 같습니다.

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# 

1

여기에 관련된 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"

0

echo대신에 사용해보십시오 cat.

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

커널 3.13.0-35- 일반 및 3.17.0-031700rc7- 일반 출력 :-bash: echo: write error: Invalid argument
Pro Backup

당신이 시도한 것들의 목록을 더주의 깊게보고, 당신은 시도 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 했습니까? printf '\ x'에서 앞의 '\'는 생략했지만, 전체 값을 채우고 있다는 사실과 경로 끝의 raw_var에 유의하십시오.
fragmede 2009 년

# 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
Pro Backup

명령을 실행하기 전에 pjones.fedorapeople.org/enter-uefi-fw 를 다운로드 했습니까 cat?
fragmede

예, enter-uefi-fw 데이터 파일을 다운로드했으며 해당 파일이 현재 작업중인 디렉토리에 있습니다 : # ls -l enter-uefi-fwreturns -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup 21
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.