Comment écrire / éditer / mettre à jour la variable efi OsIndications à partir de la ligne de commande?

9

Dans le besoin d'entrer dans l'utilitaire de configuration du firmware UEFI lors de l'utilisation d'un démarrage ultra rapide (les pilotes de clavier ne sont pas chargés pendant le POST), je souhaite écrire dans la variable efi "Os Indications". Mon système d'exploitation est un noyau Ubuntu 14.04 3.13.0-35-générique.

OsIndications La variable renvoie un masque de bits UINT64

OsIndicationsSupported La variable renvoie un masque de bits UINT64

Le EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit peut être défini dans la variable OsIndicationsSupported par le micrologiciel, si le micrologiciel prend en charge les demandes du système d'exploitation de s'arrêter à une interface utilisateur du micrologiciel. Le EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit peut être défini par l'OS dans la variable OsIndications, si l'OS souhaite que le firmware s'arrête à une interface utilisateur du firmware au prochain démarrage.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Page 312 de la spécification UEFI 2.3.1C

Mon firmware a la possibilité d'accéder à l'utilitaire de configuration du firmware au prochain démarrage:

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

Je peux créer une nouvelle variable en /sys/firmware/efi/efivarsutilisant

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

Cependant, l'écriture dans la variable efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8centraîne toutes sortes de write error: Invalid argument:

Utiliser de nouveaux 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

Utilisation d'anciens sysfs-efivars maximum de 1024 octets

# 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

Vérifié la configuration requise pour la prise en charge des variables UEFI

  1. La prise en charge des services d'exécution EFI doit être présente dans les
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yretours du noyauCONFIG_EFI=y
  2. Le nombre / arc du processeur du noyau et le nombre / arc du processeur EFI doivent correspondre
    ?
  3. Le noyau doit être démarré en mode EFI
    CSM est désactivé dans l'utilitaire de configuration du micrologiciel / BIOS
  4. Les services d'exécution EFI dans le noyau ne doivent pas être désactivés via la cmdline du noyau, c'est-à-dire que le paramètre du noyau noefi ne doit pas être utilisé.
    cat /proc/cmdline | grep EFIne renvoie rien
  5. Le système de fichiers efivarfs doit être monté dans / sys / firmware / efi / efivars
    mount | grep efivarsrenvoienone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -ldevrait répertorier les variables EFI sans aucune erreur
    La commande répertorie 82 lignes et aucune erreur.
  7. Vérifiez l'existence des fichiers / sys / firmware / efi / efivars / dump- *.
    Il n'y a aucun fichier de vidage là-bas.

Selon https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402, la cat enter-uefi-fw > /sys/firmware/efi/vars/new_varcommande devrait fonctionner dans Fedora 17.

La première suppression d'OsIndications ne s'améliore pas

# 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

Comment puis-je mettre à jour la variable efi OsIndications déjà existante dans Ubuntu 14.04 (trusty) à partir de la ligne de commande?

Pro Backup
la source

Réponses:

1

En raison de la présence de nombreux bogues de micrologiciel où la suppression de variables UEFI non standard entraîne l'échec du micrologiciel système au POST, les fichiers efivarfs qui ne sont pas des variables standardisées bien connues sont créés en tant que fichiers immuables.

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

Cela peut être vérifié et modifié avec les commandes lsattr et chattr .

Par exemple:

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
la source
1

Le masque 64 bits pertinent est le suivant:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Cela peut être produit sous forme de chaîne au format little-endian (Intel) en utilisant:

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

La sortie de printf "$str"ci - dessus doit aller dans le contenu des données du fichier variable efivarfs $var, où

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

Cependant, chaque fichier dans /sys/firmware/efi/efivarscommence par un en -tête de 4 octets et est ensuite suivi de son contenu de données. Par conséquent, la sortie de printf "$str"doit être préfixée avec l'en-tête de 4 octets avant de pouvoir l'écrire dans le fichier variable efivarfs $var. Avec $stret $varcomme ci-dessus, cela peut être fait, par exemple, en utilisant:

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

Essayez d'utiliser echoau lieu de cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
fragmede
la source
sortie du noyau 3.13.0-35-générique et 3.17.0-031700rc7-générique:-bash: echo: write error: Invalid argument
Pro Backup
En examinant plus attentivement la liste des choses que vous avez essayées, avez-vous essayé 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 :? notez le "\" dans printf "\ x" que vous avez omis, le fait que nous remplissons la valeur entière et le raw_var à la fin du chemin.
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_varrésultats-bash: printf: write error: Invalid argument
Pro Backup
Avez-vous téléchargé pjones.fedorapeople.org/enter-uefi-fw avant d'exécuter la catcommande?
fragmede
Oui, j'ai téléchargé le fichier de données enter-uefi-fw, et ce fichier se trouve dans mon répertoire de travail actuel: # ls -l enter-uefi-fwretours -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup du