Unified kernel image (Português)

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