systemd-boot (Português)

From ArchWiki

Status de tradução: Esse artigo é uma tradução de Systemd-boot. Data da última tradução: 2022-11-15. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

systemd-boot, antigamente chamado de gummiboot (Alemão para: "bote de borracha"), é um simples gerenciador de boot UEFI que executa imagens EFI configuradas. A entrada padrão é selecionada por um padrão (glob) definido ou um menu navegável na tela por meio das setas. Vêm com o systemd, que é instalado em um sistema Arch por padrão.

É simples de configurar mas pode somente iniciar executáveis EFI como o EFISTUB do kernel Linux, shell do UEFI, GRUB ou o gerenciador de boot do Windows.

Instalação

Instalando o gerenciador de boot EFI

Para instalar o gerenciador de boot EFI systemd-boot, primeiro tenha certeza que o sistema inicializou no modo UEFI e que as variáveis UEFI são acessíveis. Isto pode ser verificado ao executar o comando efivar --list ou, se efivar não está instalado, ao executar ls /sys/firmware/efi/efivars (se o diretório existe, o sistema foi inicializado no modo UEFI).

Nesta página, esp será usado para indicar o ponto de montagem ESP, ex. /efi ou /boot. Isto assume que você fez um chroot no ponto de montagem do seu sistema.

Com a partição de sistema EFI (ESP) montada em esp, use bootctl(1) para instalar systemd-boot na ESP:

# bootctl install

on a x64 architecture system /usr/lib/systemd/boot/efi/systemd-bootx64.efi will be copied to esp/EFI/systemd/systemd-bootx64.efi and esp/EFI/BOOT/BOOTX64.EFI, and systemd-boot will be set as the default EFI application.

Isto vai copiar o gerenciador de boot systemd-boot para a ESP: em um sistema com arquitetura x64 /usr/lib/systemd/boot/efi/systemd-bootx64.efi será copiado para esp/EFI/systemd/systemd-bootx64.efi and esp/EFI/BOOT/BOOTX64.EFI, e systemd-boot será definido como a aplicação EFI padrão.

Nota:
  • Ao executar bootctl install, systemd-boot tentará localizar a ESP em /efi, /boot e / boot/efi. Definir esp para um local diferente requer passar a opção --esp-path=esp. (Veja bootctl(1) § OPTIONS para detalhes.)
  • Instalar systemd-boot sobrescreverá qualquer arquivo existente em esp/EFI/BOOT/BOOTX64.EFI, por exemplo, a versão da Microsoft deste arquivo.

Para concluir a instalação, configure o systemd-boot.

Instalação usando XBOOTLDR

Uma partição /boot separada do tipo "Linux extended boot" (XBOOTLDR) pode ser criada para manter o kernel e initramfs separados da ESP. Isso é particularmente útil para fazer dual boot com Windows com uma ESP existente que é muito pequena.

Prepare uma ESP como de costume e crie outra partição para XBOOTLDR na mesma unidade física. A partição XBOOTLDR deve ter um GUID de tipo de partição de bc13c2ff-59e6-4262-a352-b275fd6f7172 [1]. O tamanho da partição XBOOTLDR deve ser grande o suficiente para acomodar todos os kernels que você vai instalar.

Nota:
  • systemd-boot não faz verificação de tipo do sistema de arquivos para a ESP. Então, é possível usar qualquer sistema de arquivos que sua implementação UEFI possa ler.
  • UEFI pode pular o carregamento de outras partições que não são a ESP quando o modo "fast boot" está habilitado. Isto pode levar ao systemd-boot falhando em encontrar entradas na partição XBOOTLDR; neste caso, desabilite o modo "fast boot";
  • A partição XBOOTLDR deve estar no mesmo disco físico que a ESP para que o systemd-boot seja reconhecido.

Durante a instalação, monte a ESP em /mnt/efi e a partição XBOOTLDR em /mnt/boot.

Uma vez no ambiente chroot, use o comando:

# bootctl --esp-path=/efi --boot-path=/boot install

Para concluir a instalação, configure o systemd-boot.

Atualizando o gerenciador de boot EFI

Toda vez que tiver uma nova versão do systemd-boot, o gerenciador de boot EFI pode ser opcionalmente reinstalado pelo usuário. Isto pode ser feito manualmente ou automaticamente. As duas abordagens são descritas a seguir.

Nota: O gerenciador de boot EFI é um executável EFI e qualquer versão pode ser usada para inicializar o sistema (atualizações parciais não são válidas, considerando que pacman somente instala o instalador do systemd-boot, não o systemd-boot). No entanto, novas versões podem adicionar novas funcionalidades ou consertar bugs, então é provavelmente uma boa ideia atualizar o systemd-boot de qualquer maneira.

Atualização manual

Use bootctl para atualizar o systemd-boot:

# bootctl update
Nota: Como com bootctl install, systemd-boot tentará localizar a ESP em /efi, /boot e /boot/efi. Definir esp para um local diferente requer passar a opção --esp-path=esp.

Atualização automática

Para atualizar o systemd-boot automaticamente, use um serviço do systemd ou um hook do pacman. Os dois métodos são descritos abaixo.

Serviço do systemd

A partir da versão 250, systemd vem com systemd-boot-update.service. Habilitar este serviço atualizará o bootloader na próxima inicialização.

Atenção: Se você tiver Secure Boot ativado, você precisa assinar seu bootloader após a atualização. Veja #hook do pacman abaixo para um exemplo de como fazer isso.
hook do pacman

O pacote systemd-boot-pacman-hookAUR adiciona um hook do pacman que é executado toda vez que o systemd é atualizado.

Em vez de instalar systemd-boot-pacman-hook, você pode preferir colocar manualmente o seguinte arquivo em /etc/pacman.d/hooks/:

/etc/pacman.d/hooks/95-systemd-boot.hook
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd

[Action]
Description = Gracefully upgrading systemd-boot...
When = PostTransaction
Exec = /usr/bin/systemctl restart systemd-boot-update.service

Se você tem Secure Boot habilitado, você pode querer adicionar um hook do pacman para automaticamente reassinar o kernel e o bootloader a cada atualização dos respectivos pacotes:

/etc/pacman.d/hooks/99-secureboot.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
Target = systemd

[Action]
Description = Assinar o Kernel para Secure Boot
When = PostTransaction
Exec = /usr/bin/find /boot -type f ( -name vmlinuz-* -o -name systemd* ) -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key arquivo-de-chave --cert arquivo-de-certificado --output "$1" "$1"; fi' _ {} ;
Depends = sbsigntools
Depends = findutils
Depends = grep

Certifique-se de que os parâmetros --key arquivo-de-chave --cert arquivo-de-certificado apontam para sua chave de assinatura e certificado. Para melhor compreensão deste hook, consulte sbverify(1) e sbsign(1).

Configuração

Configuração do carregador

A configuração do carregador é armazenada no arquivo esp/loader/loader.conf. Veja loader.conf(5) § OPTIONS para detalhes.

Um exemplo de configuração do carregador é mostrado abaixo:

esp/loader/loader.conf
default  arch.conf
timeout  4
console-mode max
editor   no
Dica:
  • systemd-boot não aceita tabulações como indentação, use espaços.
  • default e timeout podem ser mudados no menu de inicialização e as mudanças vão ser salvas como variáveis EFI LoaderEntryDefault e LoaderConfigTimeout, sobrescrevendo estas opções.
  • bootctl set-default "" e bootctl set-timeout "" pode ser usado para limpar as variáveis EFI sobrescrevendo as opções default e timeout, respectivamente.
  • Um arquivo de configuração básico está localizado em /usr/share/systemd/bootctl/loader.conf.

Adicionando carregadores

systemd-boot buscará pelos itens do menu de inicialização em esp/loader/entries/*.conf e adicionalmente em boot/loader/entries/*.conf se usar XBOOTLDR. Observe que as entradas em esp só podem usar arquivos (por exemplo, kernels, initramfs, imagens, etc.) dentro de esp. Da mesma forma, entradas em boot só podem usar arquivos em boot.

As opções possíveis são:

  • title – nome do sistema operacional. necessário.
  • version – versão do kernel, mostrado somente quando múltiplas entradas com o mesmo título existe. Opcional.
  • machine-id – identificador da máquina em /etc/machine-id, mostrado somente quando múltiplas entradas com o mesmo título e versão existem. Opcional.
  • efi – aplicação EFI a iniciar, relativo ao seu ESP (esp); ex. /vmlinuz-linux. Este parâmetro ou linux (veja abaixo) é necessário.
  • options – opções da linha de comando separadas por vírgula para passar para o programa EFI ou parâmetros do kernel. Opcional, mas você precisará no mínimo root=dev se inicializar o Linux. Este parâmetro pode ser omitido se a partição raiz é atribuída ao tipo Root Partition GUID correto como definido na Discoverable Partitions Specification e se o hook do mkinitcpio do systemd está presente.

Para inicializar o Linux, você pode também usar linux ao invês de efi. Ou initrd em adição a options. A sintaxe é:

  • linux ou initrd seguido por um caminho relativo dos arquivos correspondentes na ESP (p. ex., /vmlinuz-linux); isto vai ser automaticamente traduzido em efi caminho e options initrd=caminho – esta sintaxe é somente suportada por conveniência e não há diferenças em função.
Nota: Se options está presente na entrada de boot e Secure Boot está desabilitado, o valor de options vai sobrescrever qualquer linha .cmdline inserida na imagem EFI que está especificada pelo efi ou linux (veja Imagem de kernel unificada#Preparando uma imagem de kernel unificada). Com Secure Boot, no entanto, options (e quaisquer modificações feitas a linha de comando do kernel na interface do gerenciador de boot) serão ignoradas, e somente as .cmdline serão usadas.

Um exemplo de arquivos de carregador iniciando o Arch a partir de um volume rotulado arch_os e carregando o microcódigo da CPU da Intel é:

esp/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root="LABEL=arch_os" rw
esp/loader/entries/arch-fallback.conf
title   Arch Linux (fallback initramfs)
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux-fallback.img
options root="LABEL=arch_os" rw

systemd-boot vai automaticamente verificar no tempo de inicialização pelo Gerenciador de Boot do Windows na localização /EFI/Microsoft/Boot/Bootmgfw.efi, shell do UEFI /shellx64.efi e EFI Default Loader (carregador padrão EFI) /EFI/BOOT/bootx64.efi, como também arquivos do kernel especialmente preparados em /EFI/Linux. Quando detectado, as entradas correspondentes com títulos auto-windows, auto-efi-shell e auto-efi-default, respectivamente, serão geradas. Estas entradas não precisam de configuração manual. No entanto, outras aplicações EFI não são detectadas automaticamente (diferente do rEFInd), então para inicializar o kernel Linux, entradas de boot devem ser criadas manualmente.

Dica:
  • As entradas de boot disponíveis que foram configuradas podem ser listadas com o comando bootctl list.
  • Um exemplo de arquivo de entrada está localizado em /usr/share/systemd/bootctl/arch.conf.
  • Os parâmetros do kernel para cenários como LVM, LUKS ou dm-crypt pode ser encontrado nas páginas relevantes.

Shells EFI ou outras aplicações EFI

No caso você ter instalado shells EFI com o pacote edk2-shell, systemd-boot vai detectar automaticamente e cirar uma nova entrada se o arquivo EFI for colocado em esp/shellx64.efi. Para fazer isso e para exemplo de comando após instalar o pacote seria:

# cp /usr/share/edk2-shell/x64/Shell.efi /boot/shellx64.efi

Por outro lado, caso você tenha instalado outros aplicativos EFI na ESP, você pode usar os seguintes trechos.

Nota: O parâmetro do caminho do arquivo para a linha efi é relativo ao ponto de montagem da sua esp. Se você montou em /boot e seus binários EFI estão em /boot/EFI/xx.efi e /boot/yy.efi, então você deve especificar os parâmetros como efi /EFI/xx.efi e efi /yy.efi respectivamente.
esp/loader/entries/fwupd.conf
title  Firmware updator
efi     /EFI/tools/fwupdx64.efi
esp/loader/entries/gdisk.conf
title  GPT fdisk (gdisk)
efi     /EFI/tools/gdisk_x64.efi

Inicializar a partir de outro disco

systemd-boot não pode iniciar binários de partições que não sejam a partição ESP ou XBOOTLDR, mas pode executar um script externo para fazê-lo.

Primeiro precisamos instalar o edk2-shell (será o interpretador a ser usado) e usando o shell EFI (como explicado acima) podemos usar o comando map para anotar o FS alias (ex: HD0a66666a2) e o caminho completo do arquivo EFI de destino (ex: EFI\Microsoft\Boot\Bootmgfw.efi).

Em seguida, usando o comando exit, podemos inicializar novamente no Linux, onde podemos criar a nova entrada. Para isso precisamos primeiro criar na raiz do ponto de montagem esp um nome de arquivo .nsh com o alias FS, dois pontos e o caminho EFI, aqui um exemplo:

esp/windows.nsh
HD0a66666a2:EFI\Microsoft\Boot\Bootmgfw.efi

Uma vez que criamos este arquivo, podemos continuar criando a entrada do carregador para executar o script:

esp/loader/entries/windows.conf
title  Windows
efi     /shellx64.efi
options -nointerrupt -noconsolein -noconsoleout windows.nsh

É importante que o caminho efi corresponda onde o edk2-shell foi copiado na partição esp, e o último argumento das opções corresponda ao nome do arquivo .nsh na raiz da partição esp. Observe também que o arquivo EFI edk2-shell pode ser movido para evitar a criação automática de entrada de systemd-boot.

Inicializando para a configuração de Firmware EFI

systemd-boot adicionará automaticamente uma entrada para inicializar na configuração do firmware UEFI se o firmware do seu dispositivo suportar a reinicialização na configuração do sistema operacional.

Suporte a hibernação

Veja Suspensão e hibernação.

Editor de parâmetros do kernel protegido por senha

Alternativamente você pode instalar systemd-boot-passwordAUR que suporta configuração básica da opção password. Use sbpctl generate para gerar um valor para esta opção.

Instale systemd-boot-password com o seguinte comando:

# sbpctl install esp

Com o editor habilitado, vai ser solicitado sua senha antes que você possa editar os parâmetros do kernel.

Dicas e truques

Teclas dentro do menu de inicialização

Veja systemd-boot(7) § KEY BINDINGS para as associações de teclas disponíveis dentro do menu de inicialização.

Escolhendo a próxima inicialização

O gerenciador de boot é integrado com o comando systemctl, permitindo escolher que opção você quer inicializar depois de reiniciar. Por exemplo, suponha que você tenha compilado um kernel customizado e criou um arquivo de entrada esp/loader/entries/arch-custom.conf para inicializar ele, você pode executar

$ systemctl reboot --boot-loader-entry=arch-custom.conf

e seu sistema irá reiniciar nesta entrada mantendo a opção padrão intacta para inicializações subsequentes. Para ver uma lista de entradas possíveis use a opção --boot-loader-entry=help.

Se você quer inicializar no firmware da sua placa-mãe diretamente, você pode usar esse comando:

$ systemctl reboot --firmware-setup

Imagens de kernel unificadas

Imagens de kernel unificadas em esp/EFI/Linux/ são originadas automaticamente pelo systemd-boot e não precisam de uma entrada em esp/loader/entries. (Observe que as imagens de kernel unificadas devem ter uma extensão .efi para serem identificadas por systemd-boot.)

Dica: Arquivos em esp/loader/entries serão inicializados primeiro se nenhum default estiver definido em esp/loader/loader.conf. Remova essas entradas ou defina o padrão com o nome completo do arquivo, ou seja, default archlinux-linux.efi

Grml na ESP

Nota: As seguintes instruções não são exclusivas para Grml. Com leves ajustes, instalar outro software (p. ex., SystemRescueCD) é possível.
Dica: Um PKGBUILD está disponível: grml-systemd-bootAUR.

Grml é um pequeno sistema live com uma coleção de software para administração e recuperação do sistema.

Para instalar Grml na ESP, precisamos somente copiar o kernel vmlinuz, o initramfs initrd.img, e a squashed image (Imagem compactada com sistema de arquivos somente leitura) grml64-small.squashfs do arquivo iso para a ESP. Para fazer isso, primeiro baixe a grml64-small.iso e monte o arquivo (o ponto de montagem desse exemplo é mnt); o kernel e initramfs estão localizados em mnt/boot/grml64small/, e a squashed image reside em mnt/live/grml64-small/.

Depois, crie um diretório para Grml na sua ESP,

# mkdir -p esp/grml

e copie os arquivos mencionados acima para lá:

# cp mnt/boot/grml64small/vmlinuz esp/grml
# cp mnt/boot/grml64small/initrd.img esp/grml
# cp mnt/live/grml64-small/grml64-small.squashfs esp/grml

no último passo, crie uma entrada para o carregador do systemd-boot: em esp/loader/entries crie um arquivo grml.conf com o seguinte conteúdo:

esp/loader/entries/grml.conf
title   Grml Live Linux
linux   /grml/vmlinuz
initrd  /grml/initrd.img
options apm=power-off boot=live live-media-path=/grml/ nomce net.ifnames=0

Para uma visão geral das opções de boot disponíveis, consulte cheatcode for Grml.

systemd-boot em sistemas BIOS

Se você precisa de um gerenciador de boot para sistemas BIOS que segue a Boot Loader Specification, o systemd-boot pode funcionar. O gerenciador de boot Clover suporta inicializar de sistemas BIOS e oferece um ambiente EFI simulado.

Resolução de problemas

Instalando depois de inicializar no modo BIOS

Nota: Isto não é recomendado.

Se inicializou no modo BIOS, você ainda pode instalar o systemd-boot, no entanto este processo precisa que você fale ao firmware para lançar o arquivo EFI do systemd-boot na inicialização, normalmente por meio de duas maneiras:

  • você tem um Shell EFI funcionando em algum outro lugar.
  • sua interface de firmware oferece uma maneira de apropriadamente definir o arquivo EFI que precisa ser carregado na inicialização.

Se você pode fazer isto, a instalação é mais fácil: vai para seu Shell EFI ou a interface de configuração do firmware e mude o arquivo EFI padrão da sua máquina para esp/EFI/systemd/systemd-bootx64.efi.

Nota: A interface do firmware das máquinas Dell da linha Latitude oferece tudo que você precisa para configurar a inicialização EFI mas o Shell EFI não poderá escrever para a ROM do computador.

Entrada manual usando efibootmgr

Se o comando bootctl install falhou, você pode criar uma entrada de boot EFI manualmente usando efibootmgr:

# efibootmgr --create --disk /dev/sdX --part Y --loader "\EFI\systemd\systemd-bootx64.efi" --label "Gerenciador de Boot do Linux" --unicode

Onde /dev/sdXY é a partição de sistema EFI.

Nota: O caminho para a imagem EFI deve usar a barra invertida (\) como o separador

Entrada manual usando bcdedit do Windows

Se por alguma razão você precisa criar uma entrada de boot EFI pelo Windows, você pode usar os seguintes comandos em um prompt de administrador:

> bcdedit /copy {bootmgr} /d "Gerenciador de Boot do Linux"
> bcdedit /set {guid} path \EFI\systemd\systemd-bootx64.efi

Mude guid para o id retornado pelo primeiro comando. Você pode também defini-lo como a entrada padrão usando

> bcdedit /default {guid}

Menu não aparece depois de atualização do Windows

Veja UEFI#Windows changes boot order.

Veja também