Instale seu Debian com BTRFS e systemd-boot

 Por Ciro Mota |  29, Setembro 2023 |  Tempo de leitura aproximadamente 10 minutos.
 Edições: Adição de Snapper Em 17, Novembro 2023.

Olá pessoal, como vocês estão? Espero que todos vocês estejam muito bem.

Se você já conseguiu dar os primeiros passos nas distros Linux então é natural que busque novos desafios, como a instalação do Arch Linux por exemplo. Hoje até mesmo o próprio Arch possui scripts automatizados, não é como um instalador gráfico da maioria das distros mas dá conta do recado diminuindo a complexidade da instalação desta distro.

Inegável a importância do Debian para o mundo Linux e algumas pessoas podem até torcer o nariz e não utilizar a distro devido ao aspecto “conservador”, mal sabendo que até mesmo o Debian tem para todos os gostos e até mesmo lá nós podemos copiar o modo Arch Linux de ser e realizar uma instalação super mínima e bem modular dessa distro.

Esse processo leva um pouco de dificuldade e é realmente semelhante a uma instalação modo antigo do Arch Linux, logo não é recomendado para a galera muito iniciante. Mais abaixo veremos como podemos executar tudo isso passo a passo.

Por que usar BTRFS? Dentre as muitas características do btrfs que é um sistema de arquivos moderno e já adotado na atualidade por distros como o Fedora, é a possibilidade de snapshots que são as cópias de segurança assim como a restauração do sistema presente do lado Microsoft. Debian por padrão em suas instalações utiliza o ext4 mas claro que também podemos utilizar o btrfs e com subvolumes para implementação desses snapshots.

Continua após a publicidade

Por que usar systemd-boot? O fato de ser um bootloader, seguro, mais simples e menor o transforma em um bootloader muito rápido para inicialização em dispositivos do tipo SSD. Já é adotado também na atualidade pelo Pop!_OS, o Debian por padrão em suas instalações utiliza o GRUB e é claro que também podemos utilizar nas nossas instalações.

Isso posto vamos definitivamente ao que interessa. O conteúdo do artigo está originalmente disponibilizado no meu GitHub caso precise de uma versão reduzida deste post. Tanto este artigo quanto o repo ainda não estão completo e caso notem algum problema me enviem uma Issue que tentarei ajudar. Ou testem em máquinas virtuais primeiro antes de irem para produção. Caso queiram conhecer o repo é só clicar no badge abaixo:

GitHub do meu projeto

Com a ajuda do debootstrap será possível replicar quase que totalmente uma instalação parecida com o Arch Linux a exceção do systemd-boot que poderá ser instalado posteriormente após o primeiro boot e contará com sistema de arquivos btrfs e subvolumes.

Você deverá utilizar um liveCD de qualquer distro para iniciar o procedimento, recomendo que seja Linux Mint devido ao instalador não iniciar automaticamente e gerar erros ou você pode tentar distribuições base .deb. Caso seu terminal não esteja reconhecendo caracteres em pt_BR execute o comando abaixo.

Outro ponto é que, apesar de ser suportado nativamente pelo Debian o systemd-boot não é, então você deverá desabilitar o Secure Boot para continuar. Se este recurso é importante para você, não execute este procedimento.

setxkbmap -layout br

É feita uma varredura do repositório da mídia de instalação no uso do apt e o comando abaixo irá desabilitar a busca no CD e manter apenas os repositórios online. Recomendo que execute-o.

sed -e '/deb/ s/^#*/#/' -i /etc/apt/sources.list

Particionamento:

Para o meu caso segue o exemplo do particionamento de um NVME com duas partições (o / e o /boot) e um disco secundário para a partição /home. Utilizei o cfdisk por mera preferência. Você deverá adaptar para seu cenário.

Continua após a publicidade

Se não tiver certeza dos nomes dos discos use o comando fdisk -l para listá-los.

Inicie uma nova tabela de partições escolhendo o formato gpt.

Defina o layout de partições como desejar, sendo uma partição de 512MB ou 1GB para o /boot/efi.

cfdisk /dev/nvme0n1

Defina o tipo da partição /boot de 512MB como EFI System.

cfdisk mostrando tipos de partições disponíveis e escolha de tipo EFI System

cfdisk /dev/sda

Layout final das minhas partições:

Comando fdisk -l mostrando o layout das minhas partições

Formatação:

Para melhor aproveitamento com unidades flash e os snapshots vamos utilizar o sistema de arquivos em brtfs para o / e para meu /home. A primeira partição será formatada em FAT32 necessário para o setor de inicialização.

Continua após a publicidade
mkfs.vfat -F32 /dev/nvme0n1p1
mkfs.btrfs -L ROOT /dev/nvme0n1p2
mkfs.btrfs /dev/sda1

Pontos de montagem:

Aqui iremos começar de fato a construção do sistema começando pelos pontos de montagem. Vamos montar inicialmente a segunda partição, criar nela um subvolume e por fim desmontá-la. O subvolume é necessário e essencial para os snapshots. Você pode inclusive criar vários para melhor controle porém no meu caso optei por somente criar apenas um para toda a partição / e deixei meu /home de fora. Porém antes de iniciar precisamos criar uma pasta específica para armazenagem dos arquivos de instalação e que eu nomeei como debian.

mkdir /debian

Montagem da partição na pasta /debian.

mount /dev/nvme0n1p2 /debian

Criação do subvolume @ para a partição /.

btrfs su cr /debian/@

Desmontar a partição.

umount /debian

Realizamos novamente a montagem da partição principal porém dessa vez com a montagem do subvolume.

Continua após a publicidade
mount -o rw,relatime,ssd,subvol=@ /dev/nvme0n1p2 /debian

Instalação do sistema base:

Aqui vamos instalar, no liveCD mesmo, alguns pacotes que serão necessários para a instalação do Debian.

apt update && apt install debootstrap arch-install-scripts

Deste ponto em diante é o debootstrap que entrará em ação e fará a instalação do sistema base. Você poderá trocar o sid pelo testing ou stable, dependendo de qual versão do sistema você deseje instalar. Deverá ser informada a pasta que criamos para realizar o ponto de montagem e o endereço do repositório do Debian.

debootstrap sid /debian http://deb.debian.org/debian

Aqui devemos montar/ligar os diretórios do sistema do liveCD ao sistema que será “enjaulado” para a instalação do Debian.

Continua após a publicidade
mount --bind /dev /debian/dev
mount --bind /proc /debian/proc
mount --bind /sys /debian/sys

Finalmente executar o chroot (que é semelhante ao arch-chroot).

chroot /debian

Após entrar no chroot vamos adicionar os repositórios non-free e em seguida execute o comando apt update:

sed -i 's/main/main contrib non-free non-free-firmware/g' /etc/apt/sources.list

Vamos montar a segunda partição no diretório /home.

mount /dev/sda1 /home

Agora devemos preparar o sistema para inicialização. Para isso devemos criar o diretório efi dentro de /boot.

mkdir -p /boot/efi

E por fim montar a partição efi nesse diretório.

Continua após a publicidade
mount /dev/nvme0n1p1 /boot/efi

Agora vamos finalmente instalar o sistema base.

apt install btrfs-progs dosfstools firmware-linux-free firmware-linux-nonfree grub-efi-amd64 linux-image-amd64 linux-headers-amd64 locales network-manager pipewire python3 sudo

Configurando parâmetros:

Ao executar os passos acima o sistema já estará parcialmente construído necessitando apenas alguns ajustes para a primeira inicialização.

Abaixo a criação do seu usuário e senha, adapte ao seu cenário:

adduser ciromota

Adição ao grupo sudo:

usermod -aG sudo ciromota

Configuração de idiomas:

dpkg-reconfigure locales

Localize pt_BR.UTF-8 UTF-8.

Execução do comando dpkg-reconfigure locales e a lista de idiomas disponíveis Execução do comando dpkg-reconfigure locales com a definição do idioma pt_BR.UTF-8

O comando abaixo irá definir o nome do PC, adapte-o.

echo "k6-2-500" > /etc/hostname

Instalando do GRUB para primeira inicialização.

grub-install /dev/nvme0n1
update-grub
Continua após a publicidade

Caso você receba a mensagem de erro:

grub-install: warning: EFI variables cannot be set on this system.
grub-install: warning: You will have to complete the GRUB setup manually.

Basta usar o ponto de montagem do efivars abaixo:

mount -t efivarfs none /sys/firmware/efi/efivars

Ativando serviço de rede:

systemctl enable NetworkManager

Saindo do chroot/instalação:

exit

Geração do arquivo fstab:

genfstab -U /debian > /debian/etc/fstab

Finalização:

umount -R /debian
reboot

Após reiniciar você já terá um Debian mínimo instalado assim como seria a instalação com a mídia debian-<versão>-amd64-netinst. A partir daqui você é livre para terminar a construção do seu sistema, executando o pacote tasksel para definir a inferface gráfica e demais apps que por ventura você use.

Instalando o systemd-boot

Ao contrário do Arch Linux no Debian é necessário alguns passos a mais para instalação e ativação do systemd-boot (eu segui este guia e o adaptei) e esse processo deverá ser feito após a primeira inicialização. Recomendo que o processo seja executado como root.

Continua após a publicidade

Primeiramente devemos editar o arquivo fstab para alterar algumas permissões. Para a partição de inicialização /boot/efi vfat altere as permissões de fmask e dmask para fmask=0137,dmask=0027.

Agora devemos instalar instale o pacote systemd-boot:

apt install systemd-boot

Agora devermos gerar as entradas de inicialização:

cat <<EOF >> /boot/efi/loader/loader.conf
default debian
editor no
EOF

Necessário criar o diretório que conterá os arquivos de configuração das imagens do kernel instaladas.

mkdir -p /boot/efi/loader/entries

Em seguida realizaremos a instalação do o systemd-boot (em si ao instalar o systemd-boot o script de instalação já executa este procedimento porém vejo necessidade de repetir após a inserção das entradas acima):

bootctl --path=/boot/efi install

Os scripts abaixo farão os ganchos de adição e remoção dos novos kernels após as atualizações à estrutura do systemd-boot:

cat <<EOF > /etc/kernel/postinst.d/zz-update-systemd-boot
#!/bin/sh
set -e

/usr/bin/kernel-install add "$1" "$2"

exit 0
EOF
cat <<EOF > /etc/kernel/postrm.d/zz-update-systemd-boot
#!/bin/sh
set -e

/usr/bin/kernel-install remove "$1"

exit 0
EOF
Continua após a publicidade

O seguinte script irá verificar a existência no diretório /boot/efi um arquivo com o mesmo conteúdo do arquivo /etc/machine-id e caso não haja esse diretório irá criá-lo.

#!/usr/bin/env bash

machineid="$(cat /etc/machine-id)"

if [ -d /boot/efi/"$machineid" ]
then
  echo -e "Pasta já existe.\n"
else
  mkdir $(echo "$machineid")
fi

Por fim o comando abaixo realizará a cópia do kernel para a estrutura do systemd-boot.

kernel-install add `uname -r` /boot/vmlinuz-`uname -r`

Se tudo deu certo ao reiniciar você já poderá inicializar através do systemd-boot ao invés do GRUB. Após isso você já poderá remover o pacote grub-efi-amd64.

Instalando plymouth

É possível utilizar o Plymouth com o systemd-boot porém alguns passos a mais são necessários se comparado com o Arch.

Continua após a publicidade

Instale os pacotes abaixo:

apt install plymouth plymouth-themes

O script de instalação no Debian usa como base o conteúdo de /proc/cmdline e este diretório é somente leitura. Precisamos aqui usar um ponto de montagem para mascarar essa restrição. Crie o arquivo cmdline dentro do diretório /root:

cat /proc/cmdline > /root/cmdline

Edite o arquivo e mantenha somente como conteúdo deste arquivo a identificação a partir de root. Adicione também o parâmetro splash à linha. Exemplo:

root=UUID=<id-da-sua-partição> ro rootflags=subvol=@ quiet splash systemd.machine_id=<id-da-sua-máquina>

Agora devemos montar esse diretório:

mount -n --bind -o ro /root/cmdline /proc/cmdline

Aplique o tema padrão do Plymouth do Debian:

Continua após a publicidade
/usr/sbin/plymouth-set-default-theme emerald --rebuild-initrd

Feito isso ao iniciar o sistema já contará com um tema de Plymouth.

Snapshots com o Snapper

Como construímos nossa instalação com subvolumes @ e com isso nós podemos utilizar o Snapper para criação de snapshots automáticos. Precisamos apenas de algumas configurações:

Instale o Snapper:

sudo apt install snapper

Crie a configuração inicial:

sudo snapper -c root create-config /

Assim como no Arch Linux nós também podemos definir o gatilho para que os snapshots sejam criados durante o processo de operação do apt, contudo não de forma nativa. Com a ajuda deste projeto isso é possível e funciona adequadamente.

Baixe os arquivos 80snapper e apt-btrfs-snapper.

Mova o arquivo 80snapper para a pasta /etc/apt/apt.conf.d.

Mova o arquivo apt-btrfs-snapper para a pasta /usr/local/bin.

Aplique permissão de execução no arquivo apt-btrfs-snapper.

sudo chmod +x /usr/local/bin/apt-btrfs-snapper

Feito isso seus snapshots já estarão funcionando ao utilizar o apt.

Comando apt install atestando funcionando da criação do snapshot com a Snapper

E ai, foi ou não foi um método de instalação como a do Arch? Já conhecia a deboostrap? Pretende testar ou até mesmo usar uma instalação deste modo? Me deixe saber logo abaixo nos comentários.

Espero que este artigo de ajude a desbravar um pouco mais o mundo Linux.

Até mais! :blush: