EFISTUB (Português)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Status de tradução: Esse artigo é uma tradução de EFISTUB. Data da última tradução: 2019-09-18. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

O kernel Linux suporta a inicialização EFISTUB, que permite que o firmware EFI carregue o kernel como um executável EFI. A opção é ativada por padrão nos kernels do Arch Linux ou, se você estiver compilando o kernel, pode ativá-lo, definindo CONFIG_EFI_STUB=y na configuração do Kernel. Veja The EFI Boot Stub para mais informações.

Com EFISTUB, um kernel pode ser inicializado diretamente por uma placa-mãe UEFI ou indiretamente usando um gerenciador de boot. Recomenda-se o uso de um gerenciador de boot se você tiver vários pares kernel/initramfs e o menu de inicialização UEFI da sua placa-mãe não for fácil de usar.

Preparando para EFISTUB

Primeiro, você deve criar uma partição de sistema EFI e escolher como ela é montada. Consulte Partição de sistema EFI#Montar a partição para todas as opções de montagem ESP disponíveis.

Dica:
  • O pacman vai atualizar diretamente o kernel que o firmware EFI vai ler se você montar a ESP para /boot.
  • Você pode manter o kernel e o initramfs fora da ESP se você usar um gerenciador de inicialização que tenha um driver do sistema de arquivos para a partição onde eles residem, por exemplo, rEFInd.

Inicializando EFISTUB

Nota: O caminho do initramfs do Linux Kernel EFISTUB deve ser relativo à raiz da Partição do Sistema EFI e deve usar barras invertidas (de acordo com os padrões EFI). Por exemplo, se o initramfs estiver localizado em esp/EFI/arch/initramfs-linux.img, a linha formatada com UEFI correspondente deverá ser initrd=\EFI\arch\initramfs-linux.img. Nos exemplos a seguir, vamos assumir que tudo está sob esp/.

Usando um gerenciador de boot

Existem vários gerenciadores de boot UEFI que podem fornecer opções adicionais ou simplificar o processo de inicialização via UEFI - especialmente se você tiver vários kernels/sistemas operacionais. Veja Processo de inicialização do Arch#Gerenciador de boot para mais informações.

Usando UEFI Shell

É possível iniciar um kernel EFISTUB a partir do UEFI Shell como se fosse um aplicativo UEFI normal. Neste caso, os parâmetros do kernel são passados como parâmetros normais para o arquivo de kernel EFISTUB lançado.

> fs0:
> \vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=\initramfs-linux.img

Para evitar a necessidade de lembrar de todos os seus parâmetros do kernel, você pode salvar o comando executável em um script de shell como archlinux.nsh na sua partição de sistema UEFI e executá-lo com:

> fs0:
> archlinux

Usando UEFI diretamente

O UEFI foi projetado para remover a necessidade de um bootloader intermediário, como o GRUB. Se a sua placa-mãe tiver uma boa implementação de UEFI, é possível embutir os parâmetros do kernel dentro de uma entrada de boot UEFI e para a placa-mãe inicializar o Arch diretamente. Você pode usar o efibootmgr ou o UEFI Shell v2 para modificar as entradas de inicialização da sua placa-mãe.

efibootmgr

Para criar uma entrada de inicialização que carregue o kernel usando o efibootmgr, execute um comando similar a este:

# efibootmgr --disk /dev/sdX --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose

sendo /dev/sdX e Y a unidade e o número da partição onde a ESP está localizada. Altere o parâmetro root= para refletir sua partição raiz do Linux, consulte os parâmetros do kernel para formatos de nome de dispositivo suportados e nomeação persistente de dispositivo de bloco para obter o valor correspondente.

Note que o argumento -u/--unicode entre aspas é apenas a lista de parâmetros do kernel, então você pode precisar adicionar parâmetros adicionais (por exemplo, para suspender para o disco ou microcódigo).

Após adicionar a entrada de inicialização, você pode verificar que a entrada foi adiciona corretamente com:

# efibootmgr --verbose

Para definir a ordem de inicialização, execute:

# efibootmgr --bootorder XXXX,XXXX --verbose

sendo XXXX o número que aparece na saída do comando efibootmgr para cada entrada.

Dica: É conveniente salvar o comando para criar a entrada de inicialização em um script de shell, o que facilita a modificação, por exemplo, ao alterar os parâmetros do kernel.
Dica: A publicação de fórum com título The linux kernel with build in bootloader? também pode ser de seu interesse.

efibootmgr com arquivo .efi

Se estiver usando cryptbootAUR e sbupdate-gitAUR para gerar suas próprias chaves para Secure Boot e assinar o initramfs e o kernel para, então, criar uma imagem .efi inicializável, o efibootmgr pode ser usado diretamente para inicializar o arquivo .efi:

# efibootmgr --create --disk /dev/sdX --part número_partição --label "rótulo" --loader "EFI\pasta\arquivo.efi" --verbose

Consulte efibootmgr(8) para uma explicação das opções.

UEFI Shell

Algumas implementações de UEFI dificultam a modificação do NVRAM usando o efibootmgr. Se o efibootmgr não conseguir criar uma entrada com êxito, você poderá usar o comando bcfg no UEFI Shell v2 (isto é, a partir da iso live do Arch Linux).

Primeiro, descubra o número do dispositivo onde sua ESP reside usando:

Shell> map

Neste exemplo, 1 é usado como o número do dispositivo. Para listar o conteúdo da ESP:

Shell> ls fs1:

Para ver as entradas de inicialização atuais:

Shell> bcfg boot dump

Para adicionar uma entrada para o seu kernel, use:

Shell> bcfg boot add N fs1:\vmlinuz-linux "Arch Linux"

sendo N o local onde a entrada será adicionada no menu de inicialização. 0 é o primeiro item de menu. Os itens de menu já existentes serão deslocados no menu sem serem descartados.

Para adicionar as opções de kernel necessárias, primeiro crie um arquivo na sua ESP:

Shell> edit fs1:\options.txt

No arquivo, adicione a linha de inicialização. Por exemplo:

root=/dev/sda2 ro initrd=\initramfs-linux.img
Nota: Adicione espaços extras no início da linha no arquivo. Existe uma marca de ordem de byte no início da linha que irá esmagar qualquer caractere próximo a ele, o que causará um erro ao inicializar.

Pressione F2 para salvar e, então, F3 para sair.

Para adicionar essas opções à sua entrada anterior, faça:

Shell> bcfg boot -opt N fs1:\options.txt

Repita este processo para quaisquer entradas adicionais.

Para remover um item adicionado anteriormente, faça:

Shell> bcfg boot rm N

Mais ferramentas

Algumas das ferramentas acima, e mais, são brevemente discutidas em rEFInd#Tools.

Usando um script startup.nsh

Algumas implementações de UEFI não mantêm variáveis EFI entre inicializações "a frio" (por exemplo, VirtualBox) e qualquer coisa definida pela interface de firmware UEFI é perdida no desligamento.

O UEFI Shell Specification 2.0 estabelece que um script chamado startup.nsh na raiz da partição ESP sempre ser interpretado e pode conter instruções arbitrárias; entre aquelas que você pode definir uma linha de inicialização. Certifique-se de montar a partição ESP em /boot e crie um script startup.nsh que contenha uma linha de inicialização do kernel. Por exemplo:

vmlinuz-linux rw root=/dev/sdX [rootfs=meufs] [rootflags=minhasopçõesraiz] \
 [kernel.flag=foo] [meumódulo.flag=bar] \
 [initrd=\intel-ucode.img] initrd=\initramfs-linux.img

Este método funcionará com quase todas as versões de firmware UEFI que você pode encontrar em hardware real, você pode usá-lo como último recurso. O script deve ser uma única linha longa. As seções entre colchetes são opcionais e são fornecidas apenas como um guia. As quebras de linha estilo shell são apenas para esclarecimento visual. Os sistemas de arquivos FAT usam a barra invertida como separador de caminho e, nesse caso, a barra invertida declara que o initramfs está localizado na raiz da partição ESP. Apenas o microcódigo da Intel é carregado na linha de parâmetros de inicialização; O microcódigo da AMD é lido do disco posteriormente durante o processo de inicialização; isso é feito automaticamente pelo kernel.

Solução de problemas

Não foi possível criar uma entrada de inicialização com efibootmgr

Algumas combinações de versões do kernel e do efibootmgr podem se recusar a criar novas entradas de inicialização. Isso pode ser devido à falta de espaço livre na NVRAM. Você pode tentar excluir quaisquer arquivos de despejo EFI:

# rm /sys/firmware/efi/efivars/dump-*

Ou, como último recurso, inicialize com o parâmetro do kernel efi_no_storage_paranoia. Você também pode tentar fazer downgrade de sua instalação do efibootmgr para a versão 0.11.0. Esta versão funciona com o Linux versão 4.0.6. Veja a discussão no relatório de erro FS#34641, em particular o comentário final, para mais informações.

Veja também