Jak pisać / edytować / aktualizować zmienną efI OsIndications z wiersza poleceń?


9

W związku z potrzebą wprowadzenia narzędzia do konfiguracji oprogramowania układowego UEFI podczas korzystania z ultra szybkiego rozruchu (sterowniki klawiatury nie są ładowane podczas testu POST), chcę napisać do zmiennej efi „Wskazania Os”. Mój system operacyjny to jądro Ubuntu 14.04 3.13.0-35-generic.

OsIndications zmienna zwraca maskę bitową UINT64

OsIndicationsSupported zmienna zwraca maskę bitową UINT64

EFI_OS_INDICATIONS_BOOT_TO_FW_UIBit może być ustawiony w zmiennej OsIndicationsSupported przez firmware, jeśli wnioski podpory OS firmware aby zatrzymać się na interfejsie oprogramowania. EFI_OS_INDICATIONS_BOOT_TO_FW_UIBit może być ustawiony przez system operacyjny w zmiennej OsIndications, czy pragnienia systemowe dla oprogramowania, aby zatrzymać się w interfejsie użytkownika oprogramowania na następnym rozruchu.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Strona 312 specyfikacji UEFI 2.3.1C

Moje oprogramowanie wewnętrzne ma możliwość przejścia do narzędzia konfiguracji oprogramowania przy następnym uruchomieniu:

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

Potrafię utworzyć nową zmienną przy /sys/firmware/efi/efivarsużyciu

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

Jednak zapisywanie do zmiennej efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cpowoduje różnego rodzaju write error: Invalid argument:

Korzystanie z nowych 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

Używanie starych 1024 bajtów 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

Sprawdzono wymagania dotyczące obsługi zmiennych UEFI

  1. Obsługa środowisk uruchomieniowych EFI powinna być obecna w
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yzwrotach jądraCONFIG_EFI=y
  2. Bitowość / arch procesora jądra i bitowość / arch procesora EFI powinny się zgadzać
    ?
  3. Jądro powinno zostać uruchomione w trybie EFI
    CSM jest wyłączony w narzędziu do konfiguracji oprogramowania układowego / BIOS
  4. Usługi uruchomieniowe EFI w jądrze nie powinny być wyłączane przez cmdline jądra, tzn. Nie należy używać parametru jądra noefi.
    cat /proc/cmdline | grep EFInic nie zwraca
  5. efivarfs system plików powinien być montowany w / sys / firmware / efi / efivars
    mount | grep efivarszwrotównone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lpowinien wyświetlać zmienne EFI bez błędów
    Polecenie wyświetla 82 wiersze i nie zawiera błędów.
  7. Sprawdź, czy istnieją pliki / sys / firmware / efi / efivars / dump- *.
    Nie ma tam żadnych plików zrzutu.

Według 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 komenda powinna pracować w Fedorze 17

Pierwsze usunięcie OsIndications nie poprawia się

# 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

Jak mogę zaktualizować istniejącą zmienną efI OsIndications w Ubuntu 14.04 (zaufany) z wiersza poleceń?

Odpowiedzi:


1

Z powodu obecności licznych błędów oprogramowania układowego, w których usunięcie niestandardowych zmiennych UEFI powoduje, że oprogramowanie systemowe nie może wykonać testu POST, pliki efivarfs , które nie są dobrze znanymi znormalizowanymi zmiennymi, są tworzone jako pliki niezmienne.

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

Można to zweryfikować i zmienić za pomocą poleceń lsattr i chattr .

Na przykład:

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

Odpowiednia maska ​​64-bitowa tutaj to:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Można to wygenerować jako ciąg formatu „little-endian” (Intel), używając:

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

Dane wyjściowe printf "$str"powyżej muszą przejść do zawartości danych pliku zmiennej efivarfs $var, gdzie

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

Jednak każdy plik /sys/firmware/efi/efivarszaczyna się od 4-bajtowego nagłówka, a następnie następuje jego zawartość. Dlatego wynik printf "$str"musi zostać poprzedzony 4-bajtowym nagłówkiem, zanim będziemy mogli zapisać go w pliku zmiennej efivarfs $var. Za pomocą $stri $varjak wyżej można to zrobić, np. Za pomocą:

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

0

Spróbuj użyć echozamiast cat.

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

jądro 3.13.0-35-ogólne i 3.17.0-031700rc7-ogólne wyjście:-bash: echo: write error: Invalid argument
Pro Backup

Patrząc uważniej na listę rzeczy, które próbowałeś, czy próbowałeś 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 :? zwróć uwagę na wiodące „\” w printf „\ x”, które pominęłeś, fakt, że wypełniamy całą wartość, i raw_var na końcu ścieżki.
fragmede

# 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_varwyniki w-bash: printf: write error: Invalid argument
Pro Backup

Czy pobrałeś pjones.fedorapeople.org/enter-uefi-fw przed uruchomieniem catpolecenia?
fragmede

Tak, pobrałem plik danych enter-uefi-fw i ten plik znajduje się w moim bieżącym katalogu roboczym: # ls -l enter-uefi-fwzwraca -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.