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: What do you mean "a USB"?
gollark: base64 is problematic because I and l look similar.
gollark: Yes, it was.
gollark: Oh, those are neat. I've seen one in a kilobyte or so of JS.
gollark: ```haskell#!/usr/bin/env bashsource math.shint radius = 4.5;area = radius * math.PI * math.pi ** 2;printf '%f' % area;```
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.