La gestione degli snapshot in btrfs

Btrfs è un filesystem di tipo COW (Copy on Write) sviluppato inizialmente da Oracle e approdato da qualche tempo nel mondo Linux.
Seppur annunciato come il futuro sostituto di ext4, a livello prestazionale non distacca in modo significativo l’ottimo e diffusissimo ext4 (anzi in alcuni casi ext4 è più veloce), però offre alcune funzionalità aggiuntive che lo rendono davvero interessante.
A mio avviso, la funzionalità più interessante introdotta in btrfs è che permette di gestire gli snapshot, funzionalità analoga a ZFS di Solaris.

Cos’è uno snapshot?
Lo snapshot è una “copia storica” di un filesystem, una specie di backup di disaster recovery preso in un determinato istante. Giusto per spiegarlo in parole semplici anche se tecnicamente è più complesso, quando si esegue uno snapshot si ha un volume vuoto sul quale vengono scritte esclusivamente le modifiche successive all’istante in cui si è creato. Questo permette di creare uno snapshot molto velocemente e lo stesso non occuperà lo stesso spazio del volume originale, ma solo lo spazio occupato dalle modifiche. Ovviamente più modifiche vengono inserite (ipoteticamente, più è vecchio lo snapshot) più spazio su disco occuperà lo snapshot.
Per gestire il filesystem btrfs si usa il comando btrfsctl. Per creare un nuovo snapshot si usa il comando:

btrfsctl -s "path snapshot" "path filesystem"

Ad esempio, se abbiamo un volume btrfs montato in /home, possiamo creare uno snapshot con il comando:

btrfsctl -s /home/snapshot.home /home

In questo modo, compatirà una directory /home/snapshot.home contenente lo snapshot di /home.
In btrfs lo snapshot è modificabile per cui sarà possibile modificare sia il contenuto di /home, sia il contenuto di /home/snapshot.home.

I subvolume in btrfs
Esiste una seconda funzionalità di btrfs che può essere associata alla funzionalità di snapshot: i subvolume.
Come già detto, la funzionalità di snapshot si applica solo ad un volume btrfs: come possiamo fare per eseguire lo snapshot di una directory all’interno di un volume btrfs?
Ad esempio ammettiamo di avere il nostro volume btrf montato in /home e di avere all’interno le home directory degli utenti pippo, pluto e paperino… ma di voler creare uno snapshot solo della home directory di pippo.
Per fare questo ci vengono in aiuto i subvolume. Questa funzionalità permette di create dei sotto-volumi virtuali (che si presentano come directory) sui quali sarà possibile agire singolarmente con lo snapshot.
Usando l’esempio precedente, creiamo i subvolume nel volume btrfs /home con:

btrfsctl -S pippo /home
btrfsctl -S pluto /home
btrfsctl -S paperino /home

in modo da avere le tre home directory utente in /home che in realtà sono subvolumi btrfs;
Ora creiamo lo snapshot di /home/pippo con:

btrfsctl -S /home/pippo.snapshot /home/pippo

Un po’ di pulizia
Per cancellare uno snapshot o un subvolume si usa l’opzione -D di btrfsctl. Ad esempio per cancellare lo snapshot di pippo:

btrfsctl -D pippo.snapshot /home

Per cancellare il subvolume di pluto:

btrfsctl -D pluto /home