Configurando um ambiente de trabalho Linux multi-distro

A saída do lsblk:

NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda            8:0    1 116.5G  0 disk 
├─sda1         8:1    1   200M  0 part 
├─sda2         8:2    1     1G  0 part /boot
├─sda3         8:3    1    79G  0 part /
└─sda4         8:4    1  36.3G  0 part /home
nvme0n1      259:0    0 238.5G  0 disk 
├─nvme0n1p1  259:1    0   256M  0 part /mnt/esp
├─nvme0n1p2  259:2    0   500M  0 part 
├─nvme0n1p3  259:3    0    50G  0 part 
├─nvme0n1p4  259:4    0   500M  0 part /mnt/boot
├─nvme0n1p5  259:5    0    50G  0 part /mnt
├─nvme0n1p6  259:6    0   500M  0 part 
├─nvme0n1p7  259:7    0    50G  0 part 
├─nvme0n1p8  259:8    0   100M  0 part 
├─nvme0n1p9  259:9    0    16M  0 part 
├─nvme0n1p10 259:10   0    86G  0 part 
└─nvme0n1p11 259:11   0   652M  0 part

sda é o cartão sd que contém o sistema atual.

nvme0n1 é o ssd nvme, que contém o sistema antigo, e onde o novo sistema será instalado.

Cartão SD

O fstab:

PARTUUID=593e40f1-9627-4bae-baff-d3058948655f / btrfs defaults,subvol=artix 0 1

PARTUUID=e377d242-54ca-4bda-a74e-b16e556c9a7f /boot vfat defaults 0 2

PARTUUID=7f3a0c5d-d8dc-4f96-bbc6-2eed83a27df0 /home btrfs defaults 0 2

tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0

sda1 é a ESP.

sdcard$ ls /mnt/esp/
EFI  limine.conf

sda2 é a partição que contém o kernel e o initramfs.

sdcard$ ls -l /mnt/boot/
total 121236
-rwxr-xr-x 1 root root 34167593 Oct 31 17:45 booster-linux-universal.img
-rwxr-xr-x 1 root root  4311362 Oct 31 17:45 booster-linux.img
drwxr-xr-x 6 root root     4096 Jul 30 17:09 grub
-rwxr-xr-x 1 root root 52040586 Oct 31 17:45 initramfs-linux-fallback.img
-rwxr-xr-x 1 root root 17092179 Oct 31 17:45 initramfs-linux.img
-rwxr-xr-x 1 root root 16519359 Oct 31 17:45 vmlinuz-linux

sda3 é a partição que contém os arquivos do sistema (binários, configuração). É um sistema btrfs que eu criei para poder ter várias distros instaladas na mesma partição, com um subvolume para cada distro instalada.

sdcard$ sudo btrfs subvolume list /
ID 257 gen 938 top level 5 path artix

Quando o sistema é montado, é necessario especificar o subvolume (artix). É isso que acontece na primeira linha do fstab.

PARTUUID=593e40f1-9627-4bae-baff-d3058948655f / btrfs defaults,subvol=artix 0 1

sda4 é a partição que contém os arquivos de usuário (apenas eu)

Antigo sistema

O antigo sistema está na partição /dev/nvme0n1p5, com kernel em /dev/nvme0n1p4.

sdcard$ ls -lha /mnt
total 37K
drwxr-xr-x 1 root root  138 Oct 31 17:44 .
drwxr-xr-x 1 root root  128 Nov  8 13:39 ..
lrwxrwxrwx 1 root root    7 Oct 14 11:48 bin -> usr/bin
drwxr-xr-x 3 root root 4.0K Dec 31  1969 boot
drwxr-xr-x 1 root root    8 Jul 30 16:17 dev
drwxr-xr-x 3 root root  512 Dec 31  1969 esp
drwxr-xr-x 1 root root 2.9K Nov 20 13:38 etc
drwxr-xr-x 1 root root   12 Jul 30 16:40 home
lrwxrwxrwx 1 root root    7 Oct 14 11:48 lib -> usr/lib
lrwxrwxrwx 1 root root    7 Oct 14 11:48 lib64 -> usr/lib
drwxr-xr-x 1 root root   28 Aug  1 06:54 media
drwxr-xr-x 1 root root    0 Nov  8 10:37 mnt
drwxr-xr-x 1 root root   36 Aug 13 15:21 opt
dr-xr-xr-x 1 root root    0 Jul 30 16:17 proc
drwxr-x--- 1 root root  266 Nov 16 21:06 root
drwxr-xr-x 1 root root   78 Jul 30 17:18 run
lrwxrwxrwx 1 root root    7 Oct 14 11:48 sbin -> usr/bin
drwxr-xr-x 1 root root   14 Jul 30 16:17 srv
dr-xr-xr-x 1 root root    0 Jul 30 16:17 sys
drwxrwxrwt 1 root root    0 Jul 30 17:05 tmp
drwxr-xr-x 1 root root   80 Oct 31 17:44 usr
drwxr-xr-x 1 root root  110 Nov  8 10:28 var

sdcard$ ls -lha /mnt/boot
total 119M
drwxr-xr-x 3 root root 4.0K Dec 31  1969 .
drwxr-xr-x 1 root root  138 Oct 31 17:44 ..
-rwxr-xr-x 1 root root  33M Oct 31 17:45 booster-linux-universal.img
-rwxr-xr-x 1 root root 4.2M Oct 31 17:45 booster-linux.img
drwxr-xr-x 6 root root 4.0K Jul 30 17:09 grub
-rwxr-xr-x 1 root root  50M Oct 31 17:45 initramfs-linux-fallback.img
-rwxr-xr-x 1 root root  17M Oct 31 17:45 initramfs-linux.img
-rwxr-xr-x 1 root root  16M Oct 31 17:45 vmlinuz-linux

sdcard$ ls -lha /mnt/esp/
total 18K
drwxr-xr-x 3 root root 512 Dec 31  1969 .
drwxr-xr-x 1 root root 138 Oct 31 17:44 ..
drwxr-xr-x 5 root root 512 Jul 30 16:50 EFI
-rwxr-xr-x 1 root root 250 Jul 30 12:31 limine.conf
-rwxr-xr-x 1 root root 232 May 28 23:29 partitions.txt

Migração

Criei uma cópia do das configurações do antigo sistema.

As configurações de usuário foram simplismente copiadas para o cartão sd. Para as configurações de sistema, eu criei um arquivo tar.

mkdir backup

cd backup

cp -r /mnt/home/mateus/.config /home/mateus/

sudo tar -cvf "system config (etc).tar" /mnt/etc/

O caminho /usr/share também contém algumas coisas importantes, como fontes, mas eu tenho apenas duas coisas a copiar:

cp /mnt/usr/local/share/wayland-sessions/scroll.desktop ./

cp /mnt/usr/share/xdg-desktop-portal/scroll-portals.conf ./

Esses dois arquivos são arquivos de configuração do meu compositor wayland (scroll).

Novo esquema

Com os backups feitos, já é possível refatorar o particionamento com o gptfdisk.

sudo pacman -S gptfdisk
sudo gdisk /dev/nvme0n1

Então criar uma nova tabela de partições com a seguinte estrutura:

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   EF00  EFI system partition
   2          526336         2164735   800.0 MiB   8300  Linux filesystem
   3         2164736         3393535   600.0 MiB   8300  Linux filesystem
   4         3393536         4720639   648.0 MiB   8300  Linux filesystem
   5         4720640       382207999   180.0 GiB   8300  Linux filesystem
   6       382208000       500117503   56.2 GiB    8300  Linux filesystem

E formatar as partições.

A partição 1 será a ESP, e simplesmente conterá o bootloader. Daí o tamanho pequeno.

As partições 2, 3 e 4 conterão os kernels dos sistemas nas partições 5 e 6.

A partição 5 terá o sistema principal, e eventuais outros sistemas.

A partição 6 terá um sistema de recuperação, para caso algum erro ocorra na partição 5. Ou ele pode servir para outra coisa, não sei, só acho melhor manter esse espaço livre.

sudo pacman -Ss dosfstools

sudo mkfs.fat -F 32 /dev/nvme0n1p1
sudo mkfs.fat -F 32 /dev/nvme0n1p2
sudo mkfs.fat -F 32 /dev/nvme0n1p3
sudo mkfs.fat -F 32 /dev/nvme0n1p4
sudo mkfs.btrfs --checksum xxhash /dev/nvme0n1p5
sudo mkfs.btrfs --checksum xxhash /dev/nvme0n1p6

Subvolumes

sudo mount /dev/nvme0n1p5 /mnt
cd /mnt
sudo btrfs subvolume create users 
sudo btrfs subvolume create artix

Agora há um subvolume para o sistema e um subvolume para os dados dos usuários.

Criar o ponto de montagem da home dentro do subvolume do sistema e remontar os subvolumes de forma aninhada.

sudo umount /mnt

sudo mount /dev/nvme0n1p5 -o subvol=artix /mnt

Bootstrap (artix-bootstrap)

Instalar os pacotes essenciais do novo sistema a partir do sistema já existente no cartão sd, com o artix bootstrap

git clone https://github.com/gripped/artix-bootstrap.git
cd artix-bootstrap
sudo ./artix-bootstrap.sh -i dinit -r "https://mirrors.dotsrc.org/artix-linux/repos/$repo" /mnt

Preparando para chroot

Montar o sistema para:

Criar o ponto de montagem para a ESP.

sudo mkdir /mnt/esp

Revisando, os pontos de montagem (incluindo a raiz que já está montada) são:

sudo mount /dev/nvme0n1p5 -o subvol=artix /mnt
sudo mount /dev/nvme0n1p5 -o subvol=users /mnt/home
sudo mount /dev/nvme0n1p2 /mnt/boot
sudo mount /dev/nvme0n1p1 /mnt/esp
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /run /mnt/run
sudo mount -t sysfs none /mnt/sys
sudo mount -t proc none /mnt/proc

Copiar o arquivo /etc/resolv.conf para o novo sistema.

sudo cp /etc/resolv.conf /mnt/etc/

Fstab

Arquivo que mapeia partições para pontos de montagem.

Usar GUIDs (PARTUUIDs) ao invés de nome de dispositivo para identificar as partições. Os GUIDs podem ser obtidos com o comando blkid.

sdcard$ sudo blkid /dev/nvme0n1p2
/dev/nvme0n1p2: UUID="F17F-2FCC" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="Linux filesystem" PARTUUID="d81c4403-2ffb-4d1a-9f9e-c1a7b349e0d0"

/dev/nvme0n1p5: UUID="321fb076-a4c7-4498-a411-9e5210065214" UUID_SUB="9f91cdb9-9d31-468b-ae32-50354279c1f8" BLOCK_SIZE="4096" TYPE="btrfs" PARTLABEL="Linux filesystem" PARTUUID="978e36da-b161-4d4f-b2f9-c911008f9c9e"

Escrever o fstab.

sdcard$ cat /mnt/etc/fstab

# <file system> <dir> <type> <options> <dump> <pass>
PARTUUID=978e36da-b161-4d4f-b2f9-c911008f9c9e / btrfs defaults,subvol=artix 0 1
PARTUUID=978e36da-b161-4d4f-b2f9-c911008f9c9e /home btrfs defaults,subvol=users 0 2
PARTUUID=d81c4403-2ffb-4d1a-9f9e-c1a7b349e0d0 /boot vfat defaults 0 2
tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0

Dentro do chroot

Entrar no novo sistema com chroot e executar o bash.

sudo chroot /mnt /bin/bash

Popular as chaves do pacman (necessário fazer apenas uma vez).

pacman-key --init
pacman-key --populate

Realizar as primeiras instalações. Começando com o kernel.

pacman -S linux

Daí já teremos kernel e initramfs gerados em /boot

[sdcard /]# ls -lha /boot/
total 51M
drwxr-xr-x 2 root root 4.0K Jan  1  1970 .
drwxr-xr-x 1 root root  128 Nov 25 21:15 ..
-rwxr-xr-x 1 root root  31M Nov 26 16:48 booster-linux-universal.img
-rwxr-xr-x 1 root root 4.3M Nov 26 16:48 booster-linux.img
-rwxr-xr-x 1 root root  16M Nov 26 16:48 vmlinuz-linux

Escolher o booster como gerador de initramfs.

[sdcard /]# pacman -S linux
resolving dependencies...
    :: There are 3 providers available for initramfs:
    :: Repository system
       1) mkinitcpio
    :: Repository world
       2) booster  3) dracut

    Enter a number (default=1): 2

Instalar módulos. O pacote mais genérico é o linux-firmware, que inclui:

    Packages (12) linux-firmware-amdgpu-20251111-1  linux-firmware-atheros-20251111-1  linux-firmware-broadcom-20251111-1
    linux-firmware-cirrus-20251111-1  linux-firmware-intel-20251111-1  linux-firmware-mediatek-20251111-1
    linux-firmware-nvidia-20251111-1  linux-firmware-other-20251111-1  linux-firmware-radeon-20251111-1
    linux-firmware-realtek-20251111-1  linux-firmware-whence-20251111-1  linux-firmware-20251111-1

Nem sempre todos são necessários.

pacman -S linux-firmware-realtek linux-firmware-intel linux-firmware-whence linux-firmware-other linux-firmware-cirrus

Instalar um editor de texto

pacman -S nano

Instalar o bootloader e copiar para a ESP.

pacman -S limine
mkdir -p /esp/EFI/BOOT
cp /usr/share/limine/BOOTX64.EFI /esp/EFI/BOOT/

Configurar o bootloader. Dica: usar o fstab como cola para copiar e colar os GUIDs.

[sdcard /]# cat /esp/limine.conf
timeout: 5

/Artix
    protocol: linux
    path: guid(d81c4403-2ffb-4d1a-9f9e-c1a7b349e0d0):/vmlinuz-linux
    cmdline: root=PARTUUID=978e36da-b161-4d4f-b2f9-c911008f9c9e rw rootdelay=5 rootflags=subvol=artix
    module_path: guid(d81c4403-2ffb-4d1a-9f9e-c1a7b349e0d0):/booster-linux.img

Isso já é suficiente para fazer o sistema ser bootável.

Criar um usuário.

useradd -m -G wheel mateus

Definiar as senhas dos usuários

passwd root
passwd mateus

Mudar o hostname

[sdcard /]# cat /etc/hostname 
lenovo

Instalar um banco de manual (mandoc).

[sdcard /]# pacman -S man
:: There are 2 providers available for man:
:: Repository system
   1) man-db
:: Repository world
   2) mandoc

Enter a number (default=1): 2

Instalar o doas ao invés do sudo.

pacman -S doas
echo "permit persist :wheel" > /etc/doas.conf

Instalar programas para conexão de rede e wifi.

pacman -S dhcpcd dhcpcd-dinit wpa_supplicant wpa_supplicant-dinit
dinitctl --offline enable dhcpcd
dinitctl --offline enable wpa_supplicant

O seatd está sendo usado ao invés do elogind. Ao ser instalado, um grupo é criado.

pacman -S seatd
Creating group 'seat' with GID 977.

Colocar usuário nesse grupo para terem acesso ao seatd.

usermod -a -G seat mateus

Instalar os serviços do seatd. O seatd entra em conflito com o elogind. Desinstalar o elogind.

[sdcard /]# pacman -S seatd-dinit
resolving dependencies...
looking for conflicting packages...
:: seatd-dinit-20230412-3 and elogind-dinit-20240527-1 are in conflict (init-logind). Remove elogind-dinit? [y/N] y

Habilitar o seatd com dinitctl (usar --offline pois estamos em um chroot)

dinitctl --offline enable seatd

Habilitar o dbus (já vem instalado)

dinitctl --offline enable dbus

Instalar o pipewire.

pacman -S pipewire pipewire-pulse

O comando instala também o wireplumber.

Instalar o sound open firmware (nem sempre necessário).

pacman -S sof-firmware

Instalar a mesa.

pacman -S mesa vulkan-mesa-layers

Instalar drivers intel.

pacman -S intel-media-driver vulkan-intel

Instalar utilitários de compilação e o git.

pacman -S clang pkgconf make cmake meson ninja autoconf automake bison diffutils fakeroot flex groff m4 patch which xxhash git

Instalar o yay (excelente para momentos de pressa)

su -l mateus
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

Instalar o wpa_cute.

yay wpa-cute

Instalar o scroll:

curl -Lo scroll-1.12.tar.gz "https://github.com/dawsers/scroll/archive/refs/tags/1.12.tar.gz"
gunzip scroll-1.12.tar.gz
tar -xvf scroll-1.12.tar
cd scroll-1.12
meson setup build/
ninja -C build/
sudo ninja -C build/ install

Instalar os portais xdg.

pacman -S xdg-desktop-portal xdg-desktop-portal-wlr xdg-desktop-portal-gtk

Instalar outros utilitários

pacman -S foot fuzzel

Últimas preparações (fora do chroot)

sudo cp /etc/wpa_supplicant/* /mnt/etc/wpa_supplicant/
sudo cp /usr/local/share/xdg-desktop-portal/scroll-portals.conf /mnt/usr/local/share/xdg-desktop-portal/
sudo cp /usr/local/share/wayland-sessions/scroll.desktop /mnt/usr/local/share/wayland-sessions/
cp -r /home/.config/* /mnt/home/.config/

sdcard$ cat /usr/share/wayland-sessions/scroll.desktop
[Desktop Entry]
Name=Scroll
Comment=An i3-compatible Wayland compositor
Exec=scroll
Type=Application
DesktopNames=scroll;wlroots

sdcard$ cat /usr/share/xdg-desktop-portal/scroll-portals.conf
[preferred]
default=gtk
org.freedesktop.impl.portal.ScreenCast=wlr
org.freedesktop.impl.portal.Screenshot=wlr.
org.freedesktop.impl.portal.Inhibit=none