Jump to content

# Unified kernel image (Português)

From ArchWiki
Status de tradução: Esse artigo é uma tradução de Unified kernel image. 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.

Uma imagem de kernel unificada (em inglês, unified kernel image – UKI) é um único executável que pode ser inicializado diretamente do firmware UEFI, ou automaticamente originado por gerenciador de boot com pouca ou nenhuma configuração.

Embora os próprios kernels suportados pelo Arch podem ser carregados pelo firmware UEFI, uma imagem unificada permite incorporar todos ou um subconjunto dos seguintes:

- um carregador de stub UEFI como systemd-stub(7),
- a linha de comando do kernel,
- microcódigo,
- uma imagem initramfs,
- a imagem do kernel,
- uma tela inicial.

O executável resultante e, portanto, todos esses elementos podem ser facilmente assinado para uso com Secure Boot.

Nota Em todo o artigo, `esp` denota o ponto de montagem da partição de sistema EFI.

## Preparando uma imagem de kernel unificada

### mkinitcpio

Pode-se testar o recurso executando como exemplo

    # mkdir -p esp/EFI/Linux
    # mkinitcpio -p linux -- --uefi esp/EFI/Linux/test-systemd.efi

Isso produziria uma imagem do kernel para a predefinição linux.

#### Linha de comando do kernel

Primeiro, crie `/etc/kernel/cmdline` com seus parâmetros do kernel, tomando cuidado para remover entradas apontando para microcódigo e initramfs, por exemplo:

    /etc/kernel/cmdline

    rw quiet bgrt_disable

Dica O parâmetro `bgrt_disable` diz ao Linux para não exibir o logotipo OEM após carregar as tabelas ACPI.

#### Arquivo .preset

Em seguida, modifique `/etc/mkinitcpio.d/linux.preset`, ou a predefinição que você está usando, como segue, com o ponto de montagem apropriado da partição de sistema EFI :

- Se o seu sistema requer microcódigo, adicione `ALL_microcode=(/boot/*-ucode.img)`,
- Adicione um parâmetro `PRESET_uki=` para cada item em `PRESETS=`,
- Opcionalmente, anexe um parâmetro `--splash` a cada linha `PRESET_options=` para a qual você deseja adicionar uma imagem inicial.

Aqui está um exemplo funcional de `linux.preset` para o kernel linux e a tela inicial do Arch.

    /etc/mkinitcpio.d/linux.preset

    # mkinitcpio preset file for the 'linux' package

    ALL_config="/etc/mkinitcpio.conf"
    ALL_kver="/boot/vmlinuz-linux"
    ALL_microcode="/boot/*-ucode.img"

    PRESETS=('default' 'fallback')

    default_image="/boot/initramfs-linux.img"
    default_uki="esp/EFI/Linux/archlinux-linux.efi"
    default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"

    fallback_image="/boot/initramfs-linux-fallback.img"
    fallback_uki="esp/EFI/Linux/archlinux-linux-fallback.efi"
    fallback_options="-S autodetect"

Este segundo exemplo cria uma imagem padrão para linux e uma imagem fallback para linux-lts:

    /etc/mkinitcpio.d/linux.preset

    ALL_config="/etc/mkinitcpio.conf"
    ALL_microcode="/boot/*-ucode.img"

    PRESETS=('default' 'fallback')

    default_kver="/boot/vmlinuz-linux"
    default_image="/boot/initramfs-linux.img"
    default_uki="esp/EFI/Linux/archlinux-linux.efi"
    default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"

    fallback_kver="/boot/vmlinuz-linux-lts"
    fallback_image="/boot/initramfs-linux-lts-fallback.img"
    fallback_uki="esp/EFI/Linux/archlinux-linux-lts-fallback.efi"
    fallback_options="-S autodetect"

Dica

- Se a ESP estiver montada em `/boot`, certifique-se de que tenha espaço suficiente, pois mkinitcpio atualmente compila tanto o `initramfs-*.img` quanto o `*.efi` executáveis, dobrando assim o espaço usado (consulte [1]).
- Se tudo o que você quer fazer é inicializar a partir das imagens de kernel unificadas, você pode EFI system partition (Português)#Pontos de montagem comuns

Finalmente, gere novamente o initramfs.

### dracut

Veja dracut#Unified kernel image e dracut#Generate a new initramfs on kernel upgrade.

### sbctl

Instale o pacote sbctl. Armazene a linha de comando do kernel em `/etc/kernel/cmdline`. Use o comando `sbctl bundle` com o parâmetro `--save` para criar um bundle e regerá-lo com um hook do pacman em momentos apropriados:

    # sbctl bundle --save esp/archlinux.efi

Para criar mais binários EFI para outros kernels e imagens initramfs, repita o comando acima com os parâmetros `--kernel-img` e `--initramfs`, veja sbctl(8) § EFI BINARY COMMANDS. Os binários EFI podem ser gerados novamente a qualquer momento com `sbctl generate-bundles`.

### Manualmente

Coloque a linha de comando do kernel que você deseja usar em um arquivo e crie o arquivo de pacote usando objcopy(1).

Para microcódigo, primeiro concatene o arquivo de microcódigo e seu initrd, da seguinte forma:

    $ cat esp/fabricante_cpu-ucode.img esp/initramfs-linux.img > /tmp/combined_initrd.img

Ao construir a imagem unificada do kernel, passe `/tmp/combined_initrd.img` como o initrd. Este arquivo pode ser removido posteriormente.

    $ stub_line=$(objdump -h "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" | tail -2 | head -1)
    $ stub_size=0x$(echo "$stub_line" | awk '{print $3}')
    $ stub_offs=0x$(echo "$stub_line" | awk '{print $4}')
    $ osrel_offs=$((stub_size + stub_offs))
    $ cmdline_offs=$((osrel_offs + $(stat -c%s "/usr/lib/os-release")))
    $ splash_offs=$((cmdline_offs + $(stat -c%s "/etc/kernel/cmdline")))
    $ linux_offs=$((splash_offs + $(stat -c%s "/usr/share/systemd/bootctl/splash-arch.bmp")))
    $ initrd_offs=$((linux_offs + $(stat -c%s "arquivo-vmlinuz")))
    $ objcopy \
        --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=$(printf 0x%x $osrel_offs) \
        --add-section .cmdline="/etc/kernel/cmdline" \
        --change-section-vma .cmdline=$(printf 0x%x $cmdline_offs) \
        --add-section .splash="/usr/share/systemd/bootctl/splash-arch.bmp" \
        --change-section-vma .splash=$(printf 0x%x $splash_offs) \
        --add-section .linux="arquivo-vmlinuz" \
        --change-section-vma .linux=$(printf 0x%x $linux_offs) \
        --add-section .initrd="arquivo-initrd" \
        --change-section-vma .initrd=$(printf 0x%x $initrd_offs) \
        "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "linux.efi"

Os "offsets" são simplesmente calculados para que nenhuma seção se sobreponha, conforme recomendado em [2].

Depois de criar a imagem, copie-a para a partição do sistema EFI:

    # cp linux.efi esp/EFI/Linux/

## Inicialização

### systemd-boot

systemd-boot pesquisa em `esp/EFI/Linux/` por imagens de kernel unificadas e não há necessidade de configuração adicional. Veja sd-boot(7) § FILES

### rEFInd

rEFInd detectará automaticamente imagens de kernel unificadas na partição do sistema EFI e será capaz de carregá-las. Eles também podem ser especificados manualmente em `refind.conf`, por padrão localizado em:

    /boot/EFI/refind/refind.conf

    menuentry Linux {
        loader esp/EFI/Linux/archlinux-linux.efi
    }

Se a imagem estiver na raiz da ESP, o rEFInd requer apenas seu nome, como segue: `loader archlinux-linux.efi`. Lembre-se de que nenhum parâmetro do kernel de `esp/EFI/refind_linux.conf` será passado ao inicializar desta forma.

### Diretamente do UEFI

efibootmgr pode ser usado para criar uma entrada de inicialização UEFI para o arquivo .efi:

    # efibootmgr --create --disk /dev/sdX --part número_da_partição --label "rótulo" --loader 'EFI\Linux\arquivo.efi' --unicode

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

Nota Se `options` estiver presente em uma entrada de inicialização e Secure Boot estiver desabilitado, o valor de `options` substituirá qualquer string `.cmdline` incorporado na imagem EFI especificada por `efi` ou `linux` (consulte #Preparando uma imagem de kernel unificada). Com o Secure Boot, no entanto, `options` (e quaisquer edições feitas na linha de comando do kernel na interface do gerenciador de boot) serão ignorados e apenas o `.cmdline` incorporado será usado.

## Veja também

- Especificação de imagem de kernel unificada (inglês)
- mkinitcpio v31 and UEFI stubs

Category:

- Boot loaders (Português)

Unified kernel image (Português)
Add topic