Come scrivere / modificare / aggiornare la variabile efi di OsIndications dalla riga di comando?


9

Nella necessità di accedere all'utility di configurazione del firmware UEFI durante l'utilizzo dell'avvio ultra rapido (i driver della tastiera non vengono caricati durante il POST), desidero scrivere nella variabile efi "Os Indications". Il mio sistema operativo è il kernel Ubuntu 14.04 3.13.0-35-generico.

OsIndications La variabile restituisce una maschera di bit UINT64

OsIndicationsSupported La variabile restituisce una maschera di bit UINT64

Il EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit può essere impostato nella variabile OsIndicationsSupported dal firmware, se il firmware supporta le richieste del sistema operativo di interrompere un'interfaccia utente del firmware. Il EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit può essere impostato dal sistema operativo nella variabile OsIndications, se il sistema operativo desidera che il firmware si arresti all'interfaccia utente del firmware al successivo avvio.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Pagina 312 della specifica UEFI 2.3.1C

Il mio firmware ha la possibilità di accedere all'utility di configurazione del firmware al prossimo avvio:

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

Posso creare una nuova variabile /sys/firmware/efi/efivarsusando

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

Tuttavia, la scrittura nella variabile efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8ccomporta tutti i tipi di write error: Invalid argument:

Utilizzando nuovi 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

Utilizzando vecchi sysfs-efivar da 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

Controllato i requisiti per il supporto delle variabili UEFI per funzionare correttamente

  1. Il supporto di EFI Runtime Services dovrebbe essere presente nei
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yritorni del kernelCONFIG_EFI=y
  2. Il testimone / arco del processore del kernel e il testimone / arco del processore EFI devono corrispondere
    ?
  3. Il kernel dovrebbe essere avviato in modalità EFI
    CSM è disabilitato nell'utility di configurazione del firmware / BIOS
  4. I servizi di runtime EFI nel kernel non devono essere disabilitati tramite cmdline del kernel, ovvero non si devono utilizzare i parametri del kernel noefi.
    cat /proc/cmdline | grep EFInon restituisce nulla
  5. Il filesystem efivarfs dovrebbe essere montato su
    mount | grep efivarsritorni / sys / firmware / efi / efivarsnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -ldovrebbe elencare le variabili EFI senza errori
    Il comando elenca 82 righe e nessun errore.
  7. Verificare l'esistenza di file / sys / firmware / efi / efivars / dump- *.
    Non esistono file di dump lì.

Secondo https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402 il cat enter-uefi-fw > /sys/firmware/efi/vars/new_varcomando dovrebbe funzionare in Fedora 17.

La prima eliminazione di OsIndications non migliora

# 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

Come posso aggiornare la variabile efi OsIndications già esistente in Ubuntu 14.04 (fidato) dalla riga di comando?

Risposte:


1

A causa della presenza di numerosi bug del firmware in cui la rimozione di variabili UEFI non standard causa la mancata esecuzione del POST del firmware di sistema, i file efivarfs che non sono variabili standardizzate ben note vengono creati come file immutabili.

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

Questo può essere verificato e modificato con i comandi lsattr e chattr .

Per esempio:

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

La maschera a 64 bit pertinente qui è:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Questo può essere prodotto come una stringa in formato little-endian (Intel) usando:

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

L'output di cui printf "$str"sopra deve andare nel contenuto dei dati del file variabile efivarfs $var, dove

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

Tuttavia, ogni file /sys/firmware/efi/efivarsinizia con un'intestazione di 4 byte e viene quindi seguito dal suo contenuto di dati. Pertanto, l'output di printf "$str"deve essere preceduto dall'intestazione a 4 byte prima di poterlo scrivere sul file della variabile efivarfs $var. Con $stre $varcome sopra, questo può essere fatto, ad esempio, usando:

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

0

Prova a utilizzare echoinvece di cat.

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

kernel 3.13.0-35-generico e 3.17.0-031700rc7-generico:-bash: echo: write error: Invalid argument
Pro Backup

Guardando più attentamente l'elenco delle cose che hai provato, hai provato 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 :? nota il principale '\' in printf '\ x' che hai omesso, il fatto che stiamo compilando l'intero valore e il raw_var alla fine del percorso.
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_varrisultati in-bash: printf: write error: Invalid argument
Pro Backup

Hai scaricato pjones.fedorapeople.org/enter-uefi-fw prima di eseguire il catcomando?
Fragmede,

Sì, ho scaricato il file di dati enter-uefi-fw e quel file si trova nella mia directory di lavoro corrente: # ls -l enter-uefi-fwrestituisce -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.