Backupsystem mit ZFS
Nach vielen verschieden Konzepten habe ich inzwischen endlich ein Konzept zur Datensicherung gefunden, mit dem ich zufrieden bin. Dabei werden die Daten von meinem Laptop über das Heimnetzwerk auf einen alten Desktop PC übertragen und durch verschiedene Mechanismen vor Verlust und oder Beschädigung geschützt.
Anforderungen
Ich habe verschiedene Anforderungen an das Backusystem.
- Der manuelle Aufwand ein Backup zu erstellen soll gering sein.
- Es soll keine Spezialhardware verwendet werden.
- Die Backupmaschine soll einfach Backups auf externe Festplatten erstellen können. (Um diese als offsite Backups anderswo abzulegen.)
- Es sollen inkrementelle Backups möglich sein. (Um Backups in kurzer Zeit erstellen zu können.)
- Alte Zustände des Dateisystems sollen wieder hergestellt werden können.
- Fehlerhafte Dateien sollen erkannt und repariert werden können.
- Hardwareausfälle sollen nicht zu Datenverlust führen.
ZFS Dateisystem
Viele dieser Anforderungen lassen sich sehr elegant durch ZFS erfüllen. Fehlerhafte Dateien (im Sinne von: Dateien die durch einen fehlerhaften Datenträger verändert wurden) können durch Checksums erkannt werden. Stehen durch ein RAID-Z mehrere Kopien der Datei zur Verfügung können die Fehler korrigiert werden. Das RAID-Z schützt auch vor Datenverlust durch den Ausfall einer Festplatte.
Durch Snapshots können Zustände des Dateisystems festgehalten werden, um diese später wieder herstellen zu können. ZFS ermöglicht die die inkrementelle Übergragung von Snapshots. (D.h. es werden nur die Daten übertragen, welche sich seit dem letzten Snapshot geändert haben.)
Sowohl auf dem Laptop als auch auf der Backupmaschine läuft ZFS on Linux. Auf dem Laptop muss es ZOL sein, da ich hier auf jeden Fall Linux als Betriebssystem verwenden will. Auf der Backupmaschine wird die gleiche Implementierung verwendet um Probleme zu vermeiden, die durch Unterschiede zwischen den Implementierungen entstehen könnten.
Hardware
Ich arbeite an einem Laptop, hier entstehen werden die zu sichernden Daten verwendet. Zu Hause steht der Laptop meistens auf einer Dockingstation und ist so über Gigabit Ethernet mit dem Heimnetz verbunden. Als Backupmaschine dient ein alter Desktoprechner (ohne Grafikkarte). Der Steht in einer Ecke mit nichts außer dem Gigabit Ethernet und dem Strom verbunden.
Die Backupmaschine hat eine Festplatte für das Betriebssystem (Debian 9) und zwei 500GB Festplatten die über Raid Z einen redundanten 500GB ZFS Pool bilden. Außerdem liegen vorne in den Erweiterungsschächten noch zwei SATA Kabel und zwei Stromstecker für zwei weitere “externe” Festplatten bereit, die dann alls Offsite Bakcup anderswo gelagert werden.
ZFS verwenden
Für die eigentliche ZFS Bedienung werden diverse Befehlen benötigt. Im täglichen Betrieb ist vor allem das anlegen von Snapshots und deren Übertragung auf die Backupmaschine von Relevanz.
ZFS anlegen
Zunächst muss ein ZFS angelegt werden. Der Aufbau sieht so aus, das ein ZFS Pool aus einer beliebigen Kombination von Festplatten besteht (grob mit einem RAID vergleichbar) und Speicherplatz zur Verfügung stellt, auf welchem dann Datasets (ganz grob mit Partitionen vergleichbar) angelegt werden können.
gespiegelten Pool anlegen
Da ich durch eine einzelne kaputte Festplatte keine Daten verlieren möchte werden zwei gespiegelte Festplatten als Pool verwendet.
# Die Device IDs rausfinden:
fdisk -l
ls /dev/disk/by-id/
# Pool anlegen:
zpool create mobilepool1 mirror /dev/disk/by-id/ata-ST3500418AS_6VM1NTV2 /dev/disk/by-id/ata-ST3500418AS_6VM1RGEG -f
# Pool überprüfen:
zpool status
Dataset anlegen
zfs create poolname/setname
Dataset vollständig kopieren
Soll ein bestehendes Dataset vollständig in ein neues kopiert werden (um ein weiteres Backup zu erzeugen) kann dies folgendermaßen passieren:
zfs send -R alter_pool/altes_set@neuester_snapshot | pv | zfs recv -F neuer_pool/neues_set
# Achtung! Durch -F wird der neue Pool überschrieben!
# -R kopiert den Snapshot rekursiv, dh. mit allen vorangegangenen Snapshots.
# pv wird verwendet um den Fortschritt zu beobachten.
Da eine vollständige Kopie einige Zeit dauern kann bietet es sich an hier das ‘screen’ Tool zu verwenden, um sich von der Sitzung zu trennen und später wieder verbinden zu können.
Anlegen eines Snapshots
zfs snapshot poolname/datasetname@snapshotname
Überprüfen ob der Snapshot angelegt wurde
Am einfachsten ist es für den Pool die Eigenschaft “listsnapshots” zu aktivieren.
# Eigenschaft überprüfen:
zpool get listsnapshots poolname
# Eigenschaft aktivieren:
zpool set listsnapshots=on poolname
Anschließend können mit
zfs list
alle Snapshots angezeigt werden.
Snapshot inkrementell übertragen
Um Zeit zu sparen wird nicht der aktuelle Stand übertragen, sondern nur die Änderungen die es seit dem letzten Snapshot gab. Dies wird durch den Parameter ‘-i’ (wie “inkrementell”) und die Angabe des letzten vorhandenen Snapshots am Ziel eingestellt:
zfs send -i alter_snapshot sendepool/sendeset@aktueller_snapshot | zfs recv zielpool/zielset
So wird allerdings nur zu einem anderen Pool auf dem gleichen Rechner kopiert. Über ssh kann auf die Backupmaschine kopiert werden:
zfs send ... | pv | ssh zielusername@zielhost zfs recv zielpool/zielset
Pool aus- und einhängen
Die “Wanderfestplatten” die für die offsite Backups verwendet werden, sollten bevor sie von der Backupmaschine getrennt werden ordentlich abgemeldet werden. Dies kann folgendermaßen getan werden:
zpool export poolname
Um einen exportierten Pool wieder zu importieren macht man einfach:
zpool import poolname
Ordentlich exportierte Pools lassen sich auch an anderen Maschinene sauber importieren. Bei Festplatten die ohne Export getrennt wurden kann es theoretisch zu Problemen kommen.