Passare a BTRFS su Arch Linux

31/05/2021

BTRFS è un file system per Linux che nasce con lo scopo di essere particolarmente scalabile e supportare una serie di funzionalità in ambito enterprise (e non solo) che uno dei file system più utilizzati nel panorama, ext4, non supporta.

Oggi BTRFS si trova ad una versione molto stabile ed è già implementato di default su alcune distribuzioni, tra cui Fedora, che da questo punto di vista è sempre la prima ad implementare le ultime tecnologie.

Non ci soffermeremo tanto sulla struttura di BTRFS, nè tantomeno su tutte le funzionalità che esso supporta. Siamo tuttavia interessati a due caratteristiche interessanti: i sottovolumi e gli snapshot.

Sottovolumi

Un sottovolume non è altro che un volume figlio del volume madre, in questo caso la partizione del disco, che può essere montato come directory. Un sottovolume può essere montato col classico comando mount che già conosciamo. Ad esempio:

mount -o subvol=sottovolume <partizioneDisco> <percorsoMontaggio>

La partizione del disco sarà montata nel sottovolume e accessibile dal percorso di montaggio.

Snapshot

Possiamo pensare invece lo snapshot come una fotografia dello stato del file system nel momento in cui lo si effettua. Gli snapshot sono creati inizialmente consumando poco spazio, grazie al meccanismo copy-on-write, ed è possibile tornare in qualsiasi momento a tale stato. Utilissimo dunque in caso di aggiornamenti che hanno mandato in malora il sistema operativo, file cancellati erroneamente e quant’altro.

Vediamo a questo punto com’è possibile passare a BTRFS, naturalmente è possibile fare ciò:

  • Eseguendo una nuova installazione di Arch Linux
  • Convertendo l’attuale installazione di Arch Linux da ext4 a BTRFS

Noi vedremo entrambe le procedure. Naturalmente è sempre buona prassi fare un backup su un altro disco prima di procedere. Non mi assumo responsabilità nel caso in cui doveste perdere dati o foste costretti a reinstallare Arch Linux. Vi mostrerò tuttavia un modo per eseguire con un semplicissimo comando, il backup delle directory del sistema operativo nel caso di installazione esistente.

Inoltre, per entrambe le procedure vi consiglio di procedere con la live USB di Arch Linux. Per cui, basta andare sul sito, scaricarla e fare una chiavetta USB avviabile con metodi quali Etcher o il comando dd su sistemi Unix.

Caso installazione pulita

Nel caso di installazione pulita, la procedura e senza ombra di dubbio più semplice. Ammesso e concesso di aver già partizionato il disco, la partizione root va formattata in BTRFS mediante il comando:

mkfs.btrfs <percorsoPartizione>

Dopodichè, montiamo il volume con:

mount <percorsoPartizione> /mnt

Dobbiamo ora creare due sottovolumi, che chiameremo rispettivamente @ e @home, con:

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home

Il motivo per il quale vi ho fatto creare questi sottovolumi è dovuto al fatto che ci serviranno per creare gli snapshot. Il nome è una convenzione, però utilizzata da software come Timeshift, che permettono di semplificare la creazione di snapshot.

Smontiamo il percorso /mnt usando:

umount -R /mnt

Adesso, dobbiamo rimontare due volte la partizione root per nei sottovolumi @ e @home. Procediamo intanto con @ scrivendo:

mount -o subvol=@ <percorsoPartizione> /mnt

Creiamo una directory home in tal modo:

mkdir -p /mnt/home

Quindi montiamo il sottovolume @home con:

mount -o subvol=@home <percorsoPartizione> /mnt/home

Mediante il comando:

mount

Possiamo constatare che i sottovolumi @ e @home sono stati montati rispettivamente su /mnt e /mnt/home. Non dimentichiamo di montare la partizione EFI e la swap, quindi procediamo quindi con la classica installazione di Arch Linux, aggiungendo inoltre nel comando pacstrap il pacchetto btrfs-progs. Quindi sarà:

pacstrap /mnt base base-devel linux linux-firmware nano btrfs-progs grub-btrfs

Quando sarà generato l’fstab vedremo infatti la situazione del file system. Per il resto dell’installazione vi rimando alla guida realizzata da me.

Caso installazione esistente

Backup installazione precedente

È buona prassi effettuare un backup prima di procedere. Qualora aveste tutti i vostri file nel sistema operativo, prendete un altro disco, formattatelo in ext4, aprite un terminale con i permessi di root e, se non l’avete già fatto, installate il pacchetto rsync con:

pacman -S rsync

Se il nostro disco è già montato, tipicamente lo fa in automatico l’interfaccia grafica, prendiamo nota del percorso di montaggio dal comando mount, altrimenti montiamolo su una directory come /mnt, quindi digitiamo:

rsync -avx / /mnt

Questo ci permetterà di fare un copia completa del nostro sistema operativo, in modo tale che, nel caso in cui il passaggio a BTRFS, malauguratamente non dovesse andare a buon fine, basterà rifare l’rsync al contrario per ripristinare tutto quanto.

Installazione strumenti preliminari

Prima di riavviare sul live CD, installiamo da terminale come superutente i pacchetti btrfs-progs e grub-btrfs col classico comando.

pacman -S btrfs-progs grub-btrfs

Siamo a questo punto pronti per riavviare.

Conversione file system

Una volta avviata la live e caricata la tastiera italiana, verifichiamo tramite il comando:

fdisk -l

Quali sono le partizioni del nostro sistema operativo, in particolare la partizione root.

Procediamo intanto con la conversione del file system da ext4 a BTRFS, digitando:

btrfs-convert <percorsoPartizione>

Durante la conversione del file system sarà creato un sottovolume formattato in ext2 per poter ripristinare in qualsiasi momento il vecchio file system usando il comando:

btrfs-convert -r <percorsoPartizione>

Comando che ovviamente noi non useremo, poichè il nostro fine è quello di abbandonare definitivamente ext. Assieme al backup che vi ho fatto fare, può tuttavia tornare utile nel caso in cui qualcosa dovesse andare storto.

Creazione sottovolumi

Una volta completata la conversione, montiamo questa partizione con:

mount <percorsoPartizione> /mnt

Creiamo intanto il sottovolume @ per la radice del file system, digitando:

btrfs subvolume create /mnt/@

A questo punto spostiamo l’intero contenuto del file system dentro questo sottovolume, digitando:

mv /mnt/* /mnt/@

L’errore mostrato è normale, in quanto ci avvisa che non è possibile spostare il sottovolume @ dentro se stesso, ma credo che sarebbe anormale il contrario.

Adesso, creiamo il sottovolume @home con:

btrfs subvolume create /mnt/@home

Dopodichè spostiamo le directory home dentro questo sottovolume digitando:

mv /mnt/@home/* /mnt/@home

Il motivo per il quale vi ho fatto creare questi sottovolumi è il medesimo della procedura con installazione pulita: ci serviranno per creare gli snapshot. Il nome è una convenzione, però utilizzata da software come Timeshift, che permettono di semplificare la creazione di snapshot.

Fatto questo, smontiamo il percorso /mnt usando:

umount -R /mnt

Quindi procediamo col rimontare due volte la partizione root per nei sottovolumi @ e @home, in tal modo:

mount -o subvol=@ <percorsoPartizione> /mnt
mount -o subvol=@home <percorsoPartizione> /mnt/home

Montiamo la partizione EFI su /boot/efi con:

mount <percorsoPartizione> /mnt/boot/efi

Montiamo l’eventuale swap con:

swapon <percorsoPartizione>

Ed eventuali partizioni create appositamente per il sistema operativo.

Generiamo un nuovo fstab digitando:

genfstab -U -p /mnt > /mnt/etc/fstab

Ricordo che eventuali modifiche apportate in precedenza all’fstab andranno perse, per cui eventuali aggiunte manuali andranno rifatte. Se adesso proviamo a leggerlo con:

cat /mnt/etc/fstab

Noteremo che la partizione di sistema comparirà due volta, la prima per il montaggio di / nel sottovolume @, la seconda per il montaggio di /home nel sottovolume @home.

Finalizzazione

Entriamo in chroot con:

arch-chroot /mnt /bin/bash

Quindi per completezza diamo un bel:

mkinitcpio -p linux

# oppure, per il kernel lts

mkinitcpio -p linux-lts

Dopodichè, procediamo con la reinstallazione del bootloader GRUB, questo perchè alcune volte dopo la conversione GRUB potrebbe non riconoscere il file system se appunto non reinstallato. Digitiamo quindi:

grub-install

Dopodichè, entriamo nel file /etc/default/grub con:

nano /etc/default/grub

Modifichiamo il timeout di GRUB a un tempo pari almeno ad 1, questo per trovare un buon compromesso tra tempi di avvio non troppo lunghi e un tempo che ci permetta di selezionare eventuali snapshot BTRFS dal bootloader stesso, caratteristica che vedremo tra poco. Quindi salviamo e usciamo.

Generiamo il file di configurazione con:

grub-mkconfig -o /boot/grub/grub.cfg

L’errore sugli snapshot è normale, in quanto ancora non ne abbiamo creato nemmeno uno. Fatto questo, la procedura di conversione è terminata, possiamo dunque uscire e riavviare. Se tutto è andato per il verso giusto, saremo in grado di avviare Arch Linux su BTRFS.

In qualsiasi momento, possiamo eliminare il sottovolume ext2 con:

sudo btrfs subvolume delete /ext2_saved

Gestire gli snapshot con Timeshift

Gestire gli snapshot di BTRFS è un’operazione possibile da riga di comando, mediante il comando btrfs. Tuttavia, vorrei proporvi un modo più semplice per eseguire queste operazioni direttamente da un’interfaccia grafica.

Per installarlo è opportuno aver configurato l’Arch User Repository, e per questo vi rimando alla mia guida. Installiamo dunque i pacchetti cronie, timeshift-bin e timeshift-autosnap con:

paru -S cronie timeshift-bin timeshift-autosnap

Il primo ci serve per gestire i cron job su Linux, richiesto per utilizzare questo software (farà tutto lui, quindi non dovremo aggiungere nulla al crontab), il secondo è chiaramente il software, il terzo serve per creare automaticamente degli snapshot durante l’installazione degli aggiornamenti.

In seguito all’installazione eseguiamo in serie:

sudo systemctl enable cronie
sudo systemctl start cronie

Al primo avvio, dopo aver inserito la password, ci verrà chiesto dunque di configurare:

  • Il tipo di istantanea: non è per forza richiesta la presenza di BTRFS per usare Timeshift, ma il vantaggio di usare BTRFS sta nel meccanismo copy-on-write del file system;
  • La posizione, che deve essere la partizione di sistema;
  • La pianificazione, di cui raccomando quella oraria e quella all’avvio;
  • La possibilità di includere il sottovolume @home nei backup;
  • Il formato della data degli snapshot.

Configurato il software sarà sufficiente creare il primo snapshot per constatare immediatamente il funzionamento del programma.

Si può tornare a un dato snapshot semplicemente selezionandolo e cliccando Ripristina. Il sistema sarà dunque riavviato ed eventuali modifiche successive a quello snapshot annullate. Durante la procedura di ripristino, sarà possibile influenzare anche il sottovolume @home, anzichè il solo sistema. Inoltre, prima del riavvio, Timeshift creerà uno snapshot sullo stato corrente del sistema, in modo tale da poter tornare alle condizioni antecedenti allo snapshot selezionato per il ripristino.

Piccola nota, per usare Timeshift è necessario inserire, ad ogni avvio del software, la password utente o di root.

Avviare gli snapshot BTRFS da GRUB

Sul bootloader GRUB è possibile implementare il supporto agli snapshot del file system BTRFS, semplicemente installando il pacchetto grub-btrfs:

pacman -S grub-btrfs

Dopodichè dare un:

grub-mkconfig -o /boot/grub/grub.cfg

Una piccola parentesi su questo comando: sarà necessario darlo ogni volta che si creano degli snapshot, altrimenti c’è il rischio che questi non vengano visualizzati nel menù. Si potrebbe pensare di inserire il comando in un cronjob o in uno script che viene eseguito in fase di spegnimento (per esempio, su KDE è molto semplice fare ciò dalle impostazioni).

A questo punto, quando ritenuto necessario, basta recarsi nelle opzioni avanzate del bootloader GRUB e selezionare uno tra i vari snapshot creati per il sistema sotto la voce Arch Linux snapshots. Quindi selezionare l’immagine del kernel proposta.

Per concludere

In conclusione, BTRFS è un file system ormai maturo e utilizzabile tranquillamente come daily driver. Con questo non significa che ext4 sia da buttare, anzì. Se non si è interessati a questo particolare tipo di funzioni, rimane il file system di riferimento su Linux e lo sarà probabilmente per ancora almeno 5-6 anni.

Personalmente sono passato a BTRFS su tutte le macchine da tempo e non me ne sono pentito. Gli snapshot in particolare sono una cosa comodissima per quanto mi riguarda, e ormai non riesco a farne a meno.

E voi cosa ne pensate di BTRFS? Fatemi sapere.