btrfs in debian con apt-btrfs-snapshot

btrfs Da qualche giorno mi sono (finalmente) deciso ad utilizzare btrfs come filesystem predefinito per il mio portatile.

In questo post vedremo come utilizzare il programma apt-btrfs-snapshot con Debian GNU/Linux e qualche piccolo trucchetto per btrfs.

Non potendo migrare facilmente il filesystem di root, data la mia configurazione con LVM + dm-crypt, ho deciso di installare ex-novo Debian Sid (unstable).

Utilizzare btrfs come fs di root in Debian

Al primo boot si presenta subito un fastidioso problemino.

Ovvero l’init si avvia in maintenance mode perché non riesce a trovare il binario “fsck.btrfs”. Il modo più semplice per aggirare il problema, in attesa della chiusura del bug, è impostare a 0 il sesto campo (pass) relativo al root file system nel file /etc/fstab.

Montiamo il root file system in lettura-scrittura e modifichiamo il file.

mount -o remount,rw /

file: /etc/fstab

# <file system> <mount point>   <type>  <options>    <dump>  <pass>

# root fs
/dev/sda2       /               btrfs   ssd,noatime  0       0

[...]

Installare ed abilitare apt-btrfs-snapshot

Questo programma si occupa di eseguire uno snapshot del root file system ad ogni modifica relativa alla gestione locale dei pacchetti (installazioni/aggiornamenti/rimozioni), tramite gli hook messi a disposizione da APT.

Purtroppo il pacchetto apt-btrfs-snapshot non è stato ancora incluso nei repository di debian, probabilmente perché l’installer non inizializza il pool btrfs in maniera compatibile con apt-btrfs-snapshot.

Il pacchetto in questione richiede che il root file system non sia nella root del pool btrfs ma in un sotto-volume nominato @.

Per copiare tutto il contenuto della root nel nuovo sotto-volume, creiamo semplicemente uno snapshot:

btrfs subvolume snapshot / /@

In questo modo avremo una copia di tutti i file in pochi millisecondi ;).

Una volta creato il sotto-volume @ andiamo a modificare il file fstab e la configurazione di grub, in modo da utilizzare come root file system il sotto-volume @ e non più la root del pool:

file: /etc/fstab

# <file system> <mount point>   <type>  <options>             <dump>  <pass>

# root fs
/dev/sda2       /               btrfs   subvol=@,ssd,noatime  0       0

[...]

file: /etc/default/grub

[...]
GRUB_CMDLINE_LINUX="rootflags=subvol=@"
[...]

Aggiorniamo grub2:

update-grub2

Adesso possiamo fare un bel reboot, per essere sicuri che tutto sia andato bene.

Una volta riavviato controlliamo che l’attuale root file system sia veramente il sotto-volume @, semplicemente controllando se esiste il file @ nella root.

Se non esiste, possiamo montare la root del pool e cancellare tutto tranne la directory @:

mount /dev/sda2 /mnt

rm -r `ls /mnt/* | grep -v @`

A questo punto siamo pronti ad installare ed utilizzare apt-btrfs-snapshot:

wget http://launchpadlibrarian.net/82530974/apt-btrfs-snapshot_0.2.1_all.deb
dpkg -i apt-btrfs-snapshot_0.2.1_all.deb

Controlliamo manualmente se tutto è andato bene:

# questo comando dovrebbe riportare "Supported"
apt-btrfs-snapshot supported

# creiamo uno snapshot
apt-btrfs-snapshot snapshot

# controlliamo se lo snapshot viene listato
apt-btrfs-snapshot list

Adesso esegundo il mount della root del pool dovremmo vedere lo snapshot fatto poco prima:

# montiamo la root del pool btrfs
mount /dev/sda2 /mnt/

# facciamoci listare il contenuto
ls -lah /mnt/

# dovrebbero esserci dei file tipo:
# @ e @apt-snapshot-2011-12-01_11:56:42

snapshot automatici, manuali e pulizia

Questo script ci permette di automatizzare, in modo semplice, la creazione di snapshot, in base al tempo.

Se invece vogliamo qualcosa da lanciare una volta ogni tanto, possiamo utilizzare qualcosa di simile:

Inoltre potremmo snellire la lista dei backup automatici fatti da apt-btrfs-snapshot con uno script del genere, magari mettendolo in cron anziché usando gli hook di APT.

Conclusioni

Btrfs è un file system con delle grandissimi potenzialità. Speriamo riesca presto a consolidarsi ed a raggiungere le funzionalità del suo diretto concorrente, ZFS.

Risorse utili.