¿Cómo escribir / editar / actualizar la variable efi de OsIndication desde la línea de comandos?

9

En la necesidad de ingresar a la utilidad de configuración de firmware UEFI mientras se usa el arranque ultrarrápido (los controladores de teclado no se cargan durante la POST), deseo escribir en la variable efi "Indicaciones Os". Mi sistema operativo es Ubuntu 14.04 kernel 3.13.0-35-generic.

OsIndications La variable devuelve una máscara de bits UINT64

OsIndicationsSupported La variable devuelve una máscara de bits UINT64

El EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit se puede establecer en la variable OsIndicationSupported por el firmware, si el firmware admite solicitudes del sistema operativo para detenerse en una interfaz de usuario de firmware. El EFI_OS_INDICATIONS_BOOT_TO_FW_UIsistema operativo puede establecer el bit en la variable OsIndication, si el sistema operativo desea que el firmware se detenga en una interfaz de usuario de firmware en el próximo arranque.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Página 312 de la especificación UEFI 2.3.1C

Mi firmware tiene la capacidad de ingresar a la utilidad de configuración de firmware en el próximo arranque:

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

Puedo crear una nueva variable al /sys/firmware/efi/efivarsusar

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

Sin embargo, escribir en la variable efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cda como resultado todo tipo de write error: Invalid argument:

Usando nuevos 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

Usando viejos 1024 bytes máximo 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

Se verificaron los requisitos para que el soporte de variables UEFI funcione correctamente

  1. El soporte de EFI Runtime Services debe estar presente en los
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yretornos del kernelCONFIG_EFI=y
  2. El bitness / arch del procesador del kernel y el bitness / arch del procesador EFI deben coincidir
    ?
  3. El núcleo debe iniciarse en modo EFI
    CSM está deshabilitado en la utilidad de configuración de firmware / BIOS
  4. Los servicios de tiempo de ejecución EFI en el kernel no deben deshabilitarse a través de cmdline del kernel, es decir, el parámetro noefi kernel no debe usarse.
    cat /proc/cmdline | grep EFIno devuelve nada
  5. efivarfs sistema de archivos debe montarse en / sys / firmware / efi / efivars
    mount | grep efivarsretornosnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -ldebería enumerar las variables EFI sin ningún error
    El comando enumera 82 líneas y ningún error.
  7. Verifique la existencia de archivos / sys / firmware / efi / efivars / dump- *.
    No existen archivos de volcado allí.

De acuerdo con https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402, el cat enter-uefi-fw > /sys/firmware/efi/vars/new_varcomando debería funcionar en Fedora 17)

Primero eliminar OsIndication no mejora

# 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

¿Cómo puedo actualizar la variable efi de OsIndication ya existente en Ubuntu 14.04 (confiable) desde la línea de comandos?

Pro Backup
fuente

Respuestas:

1

Debido a la presencia de numerosos errores de firmware en los que la eliminación de variables UEFI no estándar hace que el firmware del sistema falle al POST, los archivos efivarfs que no son variables estandarizadas bien conocidas se crean como archivos inmutables.

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

Esto se puede verificar y cambiar con los comandos lsattr y chattr .

Por ejemplo:

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
fuente
1

La máscara de 64 bits relevante aquí es:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Esto se puede producir como una cadena de formato little-endian (Intel) usando:

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

La salida de printf "$str"arriba necesita ir al contenido de datos del archivo variable efivarfs $var, donde

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

Sin embargo, cada archivo /sys/firmware/efi/efivarscomienza con un encabezado de 4 bytes y luego es seguido por su contenido de datos. Por lo tanto, la salida de printf "$str"debe tener como prefijo el encabezado de 4 bytes antes de poder escribirlo en el archivo variable efivarfs $var. Con $stry $varcomo anteriormente, esto se puede hacer, por ejemplo, usando:

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

Intenta usar en echolugar de cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
fragmede
fuente
kernel 3.13.0-35-generic y 3.17.0-031700rc7-generic salida:-bash: echo: write error: Invalid argument
Pro Backup
Mirando más detenidamente la lista de cosas que probaste, ¿has probado 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 :? observe el '\' inicial en printf '\ x' que omitió, el hecho de que estamos completando el valor completo y el raw_var al final de la ruta.
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_varresultados en-bash: printf: write error: Invalid argument
Pro Backup
¿ Descargó pjones.fedorapeople.org/enter-uefi-fw antes de ejecutar el catcomando?
fragmede
Sí, descargué el archivo de datos enter-uefi-fw, y ese archivo está en mi directorio de trabajo actual: # ls -l enter-uefi-fwdevoluciones -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup