[Dica/Tuto] Construa localmente com systemd-ukify e initramfs-tools o kernel unificado no debian

Info:

I Challenge Thee - UKI

Este processo foi feito com systemd-boot, não testei ainda com grub.

Mudar para uma Imagem de Kernel Unificado (UKI - Unified Kernel Image) no Linux vale a pena se você busca inicialização mais rápida, segurança avançada com inicialização segura (Secure Boot) ou um sistema altamente otimizado. No entanto, ela centraliza componentes essenciais e exige configuração manual, o que pode quebrar o boot se feito incorretamente. [1, 2]

A decisão de adotar essa estrutura depende dos seus objetivos:

  • Segurança Reforçada: O UKI agrupa o kernel, o initramfs, o microcódigo e a linha de comando em um único arquivo assinado criptograficamente. Isso impede que agentes maliciosos modifiquem o kernel antes da inicialização.

  • Boot mais Rápido e Limpo: Como o arquivo único é executado diretamente pelo firmware UEFI (dispensando gerenciadores de boot intermediários como GRUB), o tempo de carregamento é reduzido.

  • Simplificação: Útil em distribuições com foco em contêineres ou sistemas portáteis, facilitando a atualização atômica do sistema.

O tamanho da pastição /boot/efi tem que ser no mínimo 512M. Pois dependendo as imagens efi criadas podem ficar grandes.

Instale os pacotes

sudo apt install systemd-ukify sbsigntool

sbsigntool - é para usar com secure boot.

Crie uma pasta para guardar sua chave

mkdir -p /root/kernel-keys
cd /root/kernel-keys
Gere a chave
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform PEM -out MOK.pem  -nodes -days 3650 -subj "/CN=Minha Chave de Kernel/"

Registrar a Chave no UEFI

Para que o Secure Boot aceite seu kernel assinado, você precisa registrar a chave pública no firmware da placa-mãe: O pem foi usado, pois foi o que foi aceito pelo ukifi.

sudo mokutil --import MOK.pem
  • Reinicie o computador.
  • Durante a inicialização, a tela azul do MOK Manager (Shim) aparecerá.
  • Escolha Enroll MOK > View key 0 (para confirmar) > Continue > Yes e digite a senha que você criou no Passo 1.
  • Selecione Reboot para reiniciar novamente

4K Debian Wallpapers - Top Free 4K Debian Backgrounds - WallpaperAccess

Baixe a imagem que preferir e converta para bmp

O resolução da imagem é a resolção do seu monitor.
Instale o pacote ImageMagick

convert imagem.jpg -resize 1366x768 splash.jpg

convert splash.jpg -colorspace sRGB -type truecolor BMP3:splash.bmp

No fim copie para pasta /etc/kernel/

sudo cp splash.bmp /etc/kernel/

Crie o arquivo /etc/kernel/cmdline senão existir, e adicione os parâmetros do kernel

root=UUID=44288da0-5fca-4320-bc44-b3c17b4c9513 vga=current loglevel=3 systemd.show_status=auto rd.udev.log_level=3 systemd.gpt_auto=no fbcon=nodefer rw quiet

Crie os arquivos, para gerar os EFI usando o initramfs.
Caso não queira usar splah ao iniciar remova --splash=“/etc/kernel/splash.bmp” *

/etc/kernel/postinst.d/zz-ukify

#!/bin/bash
set -e
# Use o ukify para criar e, opcionalmente, assinar o UKI.
/usr/lib/systemd/ukify build \
    --linux="$2" \
    --initrd="/boot/initrd.img-$1" \
    --cmdline="@/etc/kernel/cmdline" \
    --splash="/etc/kernel/splash.bmp"  \
    --output="/boot/efi/EFI/Linux/linux-$1.efi"

# Adicione esta linha se desejar assinar a imagem para inicialização segura.
sbsign --key /root/kernel-keys/MOK.priv --cert /root/kernel-keys/MOK.pem  --output /boot/efi/EFI/Linux/linux-$1.efi /boot/efi/EFI/Linux/linux-$1.efi

/etc/initramfs/post-update.d/zz-ukify

#!/bin/bash
set -e

/usr/lib/systemd/ukify build \
    --linux="/boot/vmlinuz-$1" \
    --initrd="$2" \
    --cmdline="@/etc/kernel/cmdline" \
    --splash="/etc/kernel/splash.bmp"  \
    --output="/boot/efi/EFI/Linux/linux-$1.efi"

# Adicione esta linha se desejar assinar a imagem para inicialização segura.

sbsign --key /root/kernel-keys/MOK.priv --cert /root/kernel-keys/MOK.pem  --output /boot/efi/EFI/Linux/linux-$1.efi /boot/efi/EFI/Linux/linux-$1.efi

Dê permissão de execução para os arquivos

chmod +x /etc/kernel/postinst.d/zz-ukify
chmod +x /etc/initramfs/post-update.d/zz-ukify

Crie a pasta se não existir

mkdir -p /boot/efi/EFI/Linux

Atualize o initramfs se não existir do kernel que está em execução

update-initramfs -u

Reinicie e veja se funciona iniciando com a imagem efi criada

Se funcionar gere todas as imagens

sudo update-initramfs -u -k all

Caso esteja tudo funcionado , pode apagar as entradas dentro da pasta /boot/efi/loader/entries/

Se quiser montar automaticamente com uma simples configuração, segue abaixo o processo.

Certifique-se de ter as ferramentas instaladas:
sudo apt install systemd-ukify sbsigntool

Edite ou crie o arquivo /etc/kernel/install.conf e adicione:-

layout=uki
initrd_generator=initramfs-tools
uki_generator=ukify

/etc/kernel/uki.conf GNU nano 9.0 /etc/kernel/uki.conf

[UKI]
Cmdline="@/etc/kernel/cmdline"
Splash=/etc/kernel/splash.bmp
SecureBootPrivateKey=/root/kernel-keys/MOK.priv
SecureBootCertificate=/root/kernel-keys/MOK.pem

Lembre que o processo de assinatura do secure boot tem que ser feito.
O procedimento está na primeira mensagem deste tópico.