Como escrever / editar / atualizar a variável efI OsIndications na linha de comando?

9

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

OsIndications A variável retorna uma máscara de bits UINT64

OsIndicationsSupported A variável retorna uma máscara de bits UINT64

O EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit pode ser definido na variável OsIndicationsSupported pelo firmware, se o firmware suportar solicitações do SO para parar em uma interface com o usuário do firmware. O EFI_OS_INDICATIONS_BOOT_TO_FW_UIbit pode ser definido pelo sistema operacional na variável OsIndications, se o sistema operacional desejar que o firmware pare em uma interface com o usuário do firmware na próxima inicialização.

EFI_OS_INDICATIONS_BOOT_TO_FW_UI= 0x0000000000000001- Página 312 da 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 /sys/firmware/efi/efivarsusando

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

No entanto, escrever para a variável efi OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8cresulta 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 sysfs-efivars máximos antigos de 1024 bytes

# 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

Verificados os requisitos para o suporte a variáveis ​​UEFI para funcionar corretamente

  1. O suporte dos EFI Runtime Services deve estar presente nos
    $ cat /boot/config-$(uname -r) | grep CONFIG_EFI=yretornos do kernelCONFIG_EFI=y
  2. A testemunha / arco do processador do kernel e a testemunha / arco do processador EFI devem corresponder
    ?
  3. O kernel deve ser inicializado no modo EFI O
    CSM está desabilitado no utilitário de configuração do firmware / BIOS
  4. Os serviços de tempo de execução EFI no kernel não devem ser desativados via cmdline do kernel, ou seja, o parâmetro noefi kernel não deve ser usado.
    cat /proc/cmdline | grep EFInão retorna nada
  5. O sistema de arquivos efivarfs deve ser montado em
    mount | grep efivarsretornos / sys / firmware / efi / efivarsnone on /sys/firmware/efi/efivars type efivarfs (rw)
  6. efivar -ldeve listar as variáveis ​​EFI sem nenhum erro
    O comando lista 82 linhas e nenhum erro.
  7. Verifique a existência de arquivos / sys / firmware / efi / efivars / dump- *.
    Não existem arquivos de despejo lá.

De acordo com https://ask.fedoraproject.org/en/question/8264/after-installing-fedora-i-cant-open-biosefi-setup/?answer=16402#post-id-16402, o cat enter-uefi-fw > /sys/firmware/efi/vars/new_varcomando deve funcionar no Fedora 17

A primeira exclusão de OsIndications 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 efi OsIndications já existente no Ubuntu 14.04 (confiável) na linha de comando?

Pro Backup
fonte

Respostas:

1

Devido à presença de vários erros de firmware nos quais a remoção de variáveis ​​UEFI não padrão faz com que o firmware do sistema falhe no POST, os arquivos efivarfs que não são variáveis ​​padronizadas conhecidas são criados como arquivos imutáveis.

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

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# 
john candlish
fonte
1

A máscara de 64 bits relevante 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 printf "$str"acima precisa ir para o conteúdo dos dados do arquivo variável efivarfs $var, em que

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

No entanto, cada arquivo /sys/firmware/efi/efivarscomeça com um cabeçalho de 4 bytes e é seguido pelo conteúdo dos dados. Portanto, a saída de printf "$str"precisa ser prefixada com o cabeçalho de 4 bytes antes que possamos gravá-la no arquivo variável efivarfs $var. Com $stre $varcomo acima, isso pode ser feito, por exemplo, usando:

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

Tente usar em echovez de cat.

# echo 'enter-uefi-fw' > /sys/firmware/efi/vars/OsIndications-8be4df61-93ca-11d2-aa0d-00e098032b8c/raw_var
fragmede
fonte
Saída do kernel 3.13.0-35-generic e 3.17.0-031700rc7-generic:-bash: echo: write error: Invalid argument
Pro Backup
Observando com mais cuidado a lista de coisas que você tentou, você tentou 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 o '\' inicial em printf '\ x' que você omitiu, o fato de estarmos preenchendo todo o valor e o raw_var no final do caminho.
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_varresulta em-bash: printf: write error: Invalid argument
Pro Backup
Você baixou pjones.fedorapeople.org/enter-uefi-fw antes de executar o catcomando?
fragmede
Sim, baixei o arquivo de dados enter-uefi-fw e esse arquivo está no meu diretório de trabalho atual: # ls -l enter-uefi-fwretorna -rw-r--r-- 1 root root 2084 Aug 25 20:23 enter-uefi-fw.
Pro Backup