Como gravar / editar / atualizar a variável do OsIndications efi a partir da linha de comando?

9

Na necessidade de entrar no utilitário de configuração de firmware da UEFI durante a inicialização ultra-rápida (drivers de teclado não são carregados durante o POST), desejo gravar a variável efi "Os Indications". Meu sistema operacional é o kernel do Ubuntu 14.04 3.13.0-35-genérico.

OsIndications variable returns a UINT64 bitmask

OsIndicationsSupported variable returns a UINT64 bitmask

The EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit can be set in the OsIndicationsSupported variable by the firmware, if the firmware supports OS requests to stop at a firmware user interface. The EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit can be set by the OS in the OsIndications variable, if the OS desires for the firmware to stop at a firmware user interface on the next boot.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI=0x0000000000000001 - Page 312 of UEFI spec 2.3.1C

Meu firmware tem a capacidade de entrar no utilitário de configuração de firmware na próxima inicialização:

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

Eu posso criar uma nova variável em /sys/firmware/efi/efivars usando

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

No entanto, gravar na variável efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c resulta em todos os tipos de write error: Invalid argument :

Usando novos 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 o antigo sysfs-efivars de 1024 bytes no máximo

# 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

Verificou os requisitos para que o suporte a variáveis UEFI funcione corretamente

  1. O suporte do EFI Runtime Services deve estar presente no kernel
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=y returns CONFIG_EFI=y
  2. Bitness / arch do processador de kernel e bitness / arch do processador EFI devem corresponder ao ?
  3. O kernel deve ser inicializado no modo EFI
    O CSM está desativado no utilitário de configuração de firmware / BIOS
  4. Os serviços de tempo de execução EFI no kernel não devem ser desativados através do cmdline do kernel, ou seja, o parâmetro do kernel noefi não deve ser usado.
    cat /proc/cmdline | grep EFI não retorna nada
  5. O sistema de arquivos efivarfs deve ser montado em / sys / firmware / efi / efivars em mount | grep efivars returns none on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -l deve listar as variáveis EFI sem erro algum  O comando lista 82 linhas e nenhum erro.
  7. Verifique a existência de arquivos / sys / firmware / efi / efivars / dump- *.
    Nenhum arquivo de despejo existe lá.

De acordo com link o comando cat enter-uefi-fw > /sys/firmware/efi/vars/new_var deve funcionar no Fedora 17.

A primeira exclusão de OsIndicações não melhora

# 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

Como posso atualizar a variável do efi OsIndications já existente no Ubuntu 14.04 (trusty) a partir da linha de comando?

    
por Pro Backup 26.08.2014 / 00:03

3 respostas

1

Devido à presença de vários bugs de firmware em que a remoção variáveis UEFI não padrão fazem com que o firmware do sistema falhe no POST, arquivos efivarfs que não são variáveis padronizadas bem conhecidas criado como arquivos imutáveis.

link

Isso pode ser verificado e alterado com os comandos lsattr e chattr .

Por exemplo:

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# 
    
por 18.09.2017 / 17:04
1

A máscara relevante de 64 bits aqui é:

  #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001

Isso pode ser produzido como uma string de formato little-endian (Intel) usando:

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

A saída de printf "$str" acima precisa ir para o conteúdo de dados do arquivo de variável efivarfs $var , onde

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

No entanto, cada arquivo em /sys/firmware/efi/efivars começa com um cabeçalho de 4 bytes e é seguido por seu conteúdo de dados. Portanto, a saída de printf "$str" precisa ser prefixada com o cabeçalho de 4 bytes antes de podermos gravá-lo no arquivo de variável $var do efivarfs. Com $str e $var como acima, isso pode ser feito, por exemplo, usando:

  { head -c 4 "$var"; printf "$str"; } > "$var"
    
por 26.09.2016 / 09:15
0

Tente usar echo em vez de cat .

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