Wie schreibe / bearbeite / aktualisiere ich die Variable OsIndications efi über die Kommandozeile?

9

Um das UEFI-Firmware-Setup-Dienstprogramm während des ultraschnellen Starts aufrufen zu können (Tastaturtreiber werden während des POST nicht geladen), möchte ich in die efi-Variable "Os Indications" schreiben. Mein Betriebssystem ist Ubuntu 14.04 Kernel 3.13.0-35-generic.

OsIndications Variable gibt eine UINT64-Bitmaske zurück

OsIndicationsSupported Variable gibt eine UINT64-Bitmaske zurück

Das EFI_OS_INDICATIONS_BOOT_TO_FW_UIBit kann von der Firmware in der Variablen OsIndicationsSupported gesetzt werden, wenn die Firmware Betriebssystemanforderungen zum Anhalten an einer Firmware-Benutzeroberfläche unterstützt. Das EFI_OS_INDICATIONS_BOOT_TO_FW_UIBit kann vom Betriebssystem in der Variablen OsIndications gesetzt werden, wenn das Betriebssystem möchte, dass die Firmware beim nächsten Start an einer Firmware-Benutzeroberfläche stoppt.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Seite 312 der UEFI-Spezifikation 2.3.1C

Meine Firmware kann beim nächsten Start das Firmware-Setup-Dienstprogramm aufrufen:

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

Ich kann bei /sys/firmware/efi/efivarsVerwendung eine neue Variable erstellen

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

Das Schreiben in die efi-Variable OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cführt jedoch zu allen möglichen Ergebnissen write error: Invalid argument:

Neue Efivarfs verwenden

# 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

Verwenden Sie alte sysfs-efivars mit maximal 1024 Byte

# 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

Überprüft, ob die Anforderungen für die Unterstützung von UEFI-Variablen ordnungsgemäß funktionieren

  1. EFI Runtime Services-Unterstützung sollte in den Kernel-
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yRetouren vorhanden seinCONFIG_EFI=y
  2. Kernel Prozessor Bitness / Arch und EFI Prozessor Bitness / Arch sollten übereinstimmen
    ?
  3. Der Kernel sollte im EFI-Modus gestartet werden.
    CSM ist im Firmware-Setup-Dienstprogramm / BIOS deaktiviert
  4. EFI-Laufzeitdienste im Kernel sollten nicht über die Kernel-Cmdline deaktiviert werden, dh der Noefi-Kernel-Parameter sollte nicht verwendet werden.
    cat /proc/cmdline | grep EFIgibt nichts zurück
  5. Das Dateisystem von efivarfs sollte unter / sys / firmware / efi / efivars
    mount | grep efivarszurückgegeben werdennone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -lsollte die EFI-Variablen ohne Fehler
    auflisten Der Befehl listet 82 Zeilen und keine Fehler auf.
  7. Überprüfen Sie, ob / sys / firmware / efi / efivars / dump- * Dateien vorhanden sind.
    Dort existieren keine Dump-Dateien.

Laut https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 sollte der cat enter-uefi-fw > /sys/firmware/efi/vars/new_varBefehl in Fedora funktionieren 17.

Das erste Löschen von OsIndications verbessert sich nicht

# 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

Wie kann ich die bereits vorhandene OsIndications efi-Variable in Ubuntu 14.04 (vertrauenswürdig) über die Befehlszeile aktualisieren?

Pro Backup
quelle

Antworten:

1

Aufgrund des Vorhandenseins zahlreicher Firmware-Fehler, bei denen das Entfernen von nicht standardmäßigen UEFI-Variablen dazu führt, dass die System-Firmware nicht POST- fähig ist , werden efivarfs- Dateien, bei denen es sich nicht um bekannte standardisierte Variablen handelt, als unveränderliche Dateien erstellt.

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

Dies kann mit den Befehlen lsattr und chattr überprüft und geändert werden.

Zum Beispiel:

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# 
John Candlish
quelle
1

Die relevante 64-Bit-Maske lautet hier:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Dies kann als Zeichenfolge im Little-Endian-Format (Intel) erstellt werden, indem Folgendes verwendet wird:

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

Die Ausgabe von printf "$str"oben muss in den Dateninhalt der Variablendatei von efivarfs gehen $var, wobei

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

Jede Datei /sys/firmware/efi/efivarsbeginnt jedoch mit einem 4-Byte-Header und wird dann von ihrem Dateninhalt gefolgt. Daher muss der Ausgabe von printf "$str"der 4-Byte-Header vorangestellt werden, bevor wir ihn in die Variablendatei von efivarfs schreiben können $var. Mit $strund $varwie oben kann dies erfolgen, z. B.:

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

Versuchen Sie es mit echoanstelle von cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
fragmede
quelle
Kernel 3.13.0-35-generic und 3.17.0-031700rc7-generic Ausgabe:-bash: echo: write error: Invalid argument
Pro Backup
Haben Sie sich die Liste der Dinge, die Sie ausprobiert haben, genauer angesehen : 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 ? Beachten Sie das führende '\' in printf '\ x', das Sie weggelassen haben, die Tatsache, dass wir den gesamten Wert eingeben, und die raw_var am Ende des Pfads.
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_varErgebnisse in-bash: printf: write error: Invalid argument
Pro Backup
Haben Sie pjones.fedorapeople.org/enter-uefi-fw heruntergeladen, bevor Sie den catBefehl ausgeführt haben?
Fragmede
Ja, ich habe die Datei enter-uefi-fw heruntergeladen, und diese Datei befindet sich in meinem aktuellen Arbeitsverzeichnis: # ls -l enter-uefi-fwreturn -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup