Usando dracut e dispensando genkernel no Gentoo + LUKS + Btrfs
Introdução
Em sistemas Gentoo usando:
- LUKS
- Btrfs com subvolumes
- systemd
- gentoo-kernel-bin
É comum precisar executar manualmente:
genkernel --install --luks --btrfs initramfs
Toda vez que o kernel é atualizado.
Como mostrado neste artigo:
Isso
não é necessário.
O
dracut já é capaz de gerar um initramfs totalmente funcional para
LUKS + Btrfs, desde que o sistema esteja corretamente configurado.
Esta dica mostra como configurar o dracut para isso, deixando o processo automático, integrado ao
gentoo-kernel-bin.
Cenário utilizado
- Bootloader: GRUB
- Kernel: gentoo-kernel-bin
- Initramfs: dracut
- Root filesystem: Btrfs
- Criptografia: LUKS
- Init system: systemd
- Swap: zram (sem swap físico)
Pré-requisito obrigatório: systemd com suporte a cryptsetup
Este passo é essencial. Sem ele, o boot pode falhar com erros do tipo:
Failed to start systemd-cryptsetup@cryptroot.service
Garanta que o
systemd foi compilado com a flag
cryptsetup:
echo "sys-apps/systemd cryptsetup" > /etc/portage/package.use/systemd-cryptsetup
emerge --ask --changed-use sys-apps/systemd
Criando a configuração do dracut
Crie o arquivo de configuração do dracut:
sudo mkdir -p /etc/dracut.conf.d
sudo tee /etc/dracut.conf.d/10-gentoo-luks-btrfs.conf > /dev/null <<'EOF'
# Gentoo + dracut + LUKS + Btrfs
# Initramfs automático para gentoo-kernel-bin
# Módulos necessários no initramfs
add_dracutmodules+=" crypt btrfs "
EOF
Obs.: não defina
kernel_cmdline aqui. A linha de boot deve ficar só no GRUB, evitando duplicações.
Obtendo o UUID do LUKS e Gerando o /etc/default/grub
Identifique a partição que contém o LUKS (ajuste os comandos a seguir para sua realidade):
lsblk
Em seguida, execute, para o caso de
SATA. Exemplo com sda3:
UUID_LUKS="$(blkid -s UUID -o value /dev/sda3)"
Ou, no caso de
NVMe. Exemplo com nvme0n1p3:
UUID_LUKS="$(blkid -s UUID -o value /dev/nvme0n1p3)"
Agora gere conteúdo do
/etc/default/grub:
cat <<EOF > /etc/default/grub
GRUB_DISTRIBUTOR="Gentoo"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="rd.luks.uuid=${UUID_LUKS} rd.luks.name=${UUID_LUKS}=cryptroot root=/dev/mapper/cryptroot rootfstype=btrfs rootflags=subvol=@"
GRUB_DISABLE_LINUX_UUID=true
GRUB_DISABLE_LINUX_PARTUUID=true
EOF
Dessa forma, o UUID correto do LUKS é inserido automaticamente.
Obs.: o parâmetro
rootflags=subvol=@ assume que o subvolume root se chama
@. Caso utilize outro nome (por exemplo
@root,
root) ou não utilize subvolumes, ajuste esse parâmetro conforme sua estrutura. Para listar os subvolumes existentes, utilize:
btrfs subvolume list /
Gerando o initramfs com dracut (se estiver no Gentoo instalado)
Se quiser gerar manualmente para o kernel atual:
dracut --force --kver $(uname -r)
Ou simplesmente deixe o processo automático acontecer ao atualizar o kernel:
emerge --ask sys-kernel/gentoo-kernel-bin
O
installkernel chamará o dracut automaticamente.
Gerando o initramfs com dracut (se estiver em live com chroot)
Evite usar
$(uname -r) no chroot, pois ele pode retornar o kernel do LiveUSB.
Em vez disso, pegue a versão do kernel instalada a partir de
/lib/modules e gere o initramfs para ela:
KVER="$(ls -1 /lib/modules | sort -V | tail -n1)"
echo "Gerando initramfs para: $KVER"
dracut --force --kver "$KVER"
Obs.: esse método funciona tanto no sistema rodando quanto no chroot (desde que você tenha montado corretamente
O esperado é que apareçam entradas indicando a presença dos componentes
necessários para abrir o volume criptografado e montar o Btrfs no initramfs,
por exemplo: