EFISTUB (Portuguê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.
Inicializando EFISTUB
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.
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
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.