Einleitung
Vor einiger Zeit habe ich ja über das ZFS-Dateisystem referiert. Das funktioniert so weit sehr gut, aber es gibt einen Nachteil: Wenn an sich das System zerschossen hat, ist das nicht schlimm, denn man hat ja ein Backup von gestern auf dem ZFS-Raid, nicht wahr?
Ja, aber leider war man (d.h.: ich) nicht vorausblickend genug, um ein entsprechende Rettungssystem zusammenzustellen. Das ist immer noch nicht schlimm, man kann Linux ja jederzeit von einem für praktisch alle Distributionen erhältlichen Live-System von Stick oder CD booten.
Tja, der kleine Nachteil ist: Diese Live-Systeme enthalten idR keine ZFS-Treiber. Das heisst, man muss zuerst aus dem Live-System ein Arbeitssystem installieren, dort ZFS installieren, dann die Backup_Disks mounten und schliesslich das Backup herüberkopieren. Vermutlich gibt es auch einen einfacheren Weg, aber den habe ich nicht gefunden.
Andererseits existiert ja Btrfs, dessen grösste Nachteile (1) der sperrige Name und (2) der ewige Beta-Status sind. Btrfs (ob Sie es lieber “Butter-eff-ess”, “Better-eff-ess” oder “Beh Teh Err Eff Ess” aussprechen wollen, sei Ihnen überlassen), ist ganz offensichtlich von ZFS inspiriert. Sein Hautpvorteil ist: Ungeachtet des ewigen Beta-Status ist es inzwischen bei praktisch allen Distributionen Teil des Kernsystems und damit auch der Live-Medien. Man kann auf Btrs-Disks also sofort nach dem Booten des Systems zugreifen.
Installation
Wie gesagt, bei den meisten Systemen sind die Treiber an Bord. Man kann Btrfs Disks ganz normal mit “mount” einbinden. Was nicht bei allen Systemen an Bord ist, sind die Userspace-Tools (Im Wesentlichen das Utility-Programm btrfs
). Wenn nötig, installiert man sie mit sudo pacman -S btrfs-progs
bzw. sudo apt-get install btrfs-tools
.
Konzept
Wie ZFS ist auch Btrfs gleichzeitig ein Festplattenverwaltungstool und ein Dateisystem. Man kann ein Btrfs Dateisystem entweder auf einer Partition eines anderweitig partitionierten Datenträgers installieren, oder auf einem ganzen Datenträger. So oder so kann man das Filesystem später dynamisch erweitern. Eebnfalls ganz ähnlich wie bei ZFS kann man mehrere Datenträger zu Raid0, Raid1 oder Raid5 -Verbänden zusammenschliessen. Bei Btrfs kann man allerdings for Daten und Metadaten getrennt angeben, in welcher Form man sie verwalten wird.
In medias res
Ein neues Btrfs-Dateisystem erstellt man zum Beispiel so:
makefs.btrfs -m raid1 -d raid1 -f /dev/sdc /dev/sdd
Hier haben wir jetzt also zwei ganze Platten, sdc und sdd (welche gleich gross sein sollten) verknpftm, um darauf ein btrfs-Dateisystem zu erstellen, bei welchem sowohl die Daten (-d), als auch die Metadaten (-m) als Raid1 organisiert sind, also auf beide Platten gespiegelt werden. Wenn wir nur einzelne Partitionen verwenden wollten, hätten wir auch diese angeben können:
makefs.btrfs -m raid1 -d raid0 -f /dev/sdc1 /dev/sde8
Das -f bewirkt, dass Btrfs die Aufgabe auch dann erledigt, wenn bereits ein Dateisystem oder eine Partitionierung auf dem Ziel vorhanden ist. Aber damit tut es das wirklich sofort, also bitte dreimal kontrollieren, ob wirklich die richtigen Medien formatiert werden…
Snapshots
Die sind auf den ersten Blick ein wenig umständlicher, als bei zfs. Sie basieren auf “Subvolumes”, und werden darum in den üblichen Btrfs-Dokumentationen erst nach den Subvolumes erwähnt, und wenn man vom schwer verständlichen Subvolume-Konzept schon so ermüdet ist, dass man gar nicht mehr folgen kann, wenn die Rede dann auf Snapshots kommt.
Dabei ist es eigentlich nicht so arg schwierig: Subvolumes sind von aussen gesehen einfach Verzeichnisse innerhalb des Btrfs-Dateisystems. Das Besondere daran ist, dass man sie unabhängig mounten kann. Man erstellt ein Subvolume mit btrfs subvolume create /path/to/btrfs/subvolume
oder, einfacher: btrfs sub create ...
(Man kann alle Btrfs-Befehle so weit abkürzen, dass sie noch eindeutig sind). Und wenn man so weit ist, kann man nach Herzenslust Snapshots erstellen.
Ein Snapshot ist ein exaktes Abbild eines Subvolumes, dessen Erstellung nur Sekunden dauert, egal wieviele Daten darin sind.
Daher an dieser Stelle ein etwas längeres Beispiel eines Backup-Konzeptes:
sudo mount /dev/sdc /mnt/raid
sudo btrf sub create /mnt/raid/backups
sudo btrfs sub create /mnt/raid/backups/full
sudo mkdir /mnt/raid/backups/snapshots
Dann kann man ein Backup-Skript wie folgt erstellen:
today=`date '+%Y-%m-%d'`
dest=/mnt/raid/backups
rsync -aAXHSv --exclude-from=whatToExclude.txt / ${dest}/full
btrfs sub snap -r ${dest}/full ${dest}/snapshots/full-$today
Nach jedem Lauf dieses Skripts hat man ein aktuelles Backup in /mnt/raid/backups/full, und alle früheren Backups in /mnt/raid/backups/snapshots
Ähnlich wie bei ZFS kann man Snapshots auch auf weitere Laufwerke oder an andere Btrfs-Instanzen senden. Der Befehl dazu lautet
btrfs send -f destfile /path/to/snapshot
. Wenn man nur eine Differenz zu einem früheren Snapshot senden möchte, macht man:
btrfs send -p /path/to/older/snapshot -f destfile /path/to/new/snapshot