Unified kernel image (Portuguê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.

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.

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:

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

mkinitpcio

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 para a qual você deseja adicionar uma imagem inicial.

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

Este segundo exemplo cria uma imagem padrão para 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"

Finalmente, gere novamente o initramfs.

dracut

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

sbctl

Instale o pacote . Armazene a linha de comando do kernel em /etc/kernel/cmdline. Use o comando com o parâmetro 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 e , veja . Os binários EFI podem ser gerados novamente a qualquer momento com .

Manualmente

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

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 .

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 por imagens de kernel unificadas e não há necessidade de configuração adicional. Veja

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 , por padrão localizado em:

Se a imagem estiver na raiz da ESP, o rEFInd requer apenas seu nome, como segue: . Lembre-se de que nenhum parâmetro do kernel de 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 para uma explicação das opções.

Veja também

gollark: Except the nearest person to you.
gollark: It's a fun and healthy activity we can all enjoy!
gollark: Hmm, yes, if you *know* that then it's kind of similar to coercion.
gollark: > i shouldn't need to deal with people who live in the time of the old testament properly if they're not willing to catch up to the centuries of science which have undermined their very base belief about the earthYes, and you can ignore them/block them/etc.
gollark: You can blame it on your upbringing and environment and genes or the initial conditions of the universe and the rules for updating it or something like that, but I'm a compatibilist.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.