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.
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:
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.
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 /dev/sda
Layout final 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.
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.
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.
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.
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
.
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
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
.
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
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.
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:
/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
.
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: