map[]

ZFS-Snapshots für die Datensicherung mit FreeBSD

Das Thema Datensicherung (Backup) ist ein großes und jeder, der sich ernsthafter mit Computertechnik beschäftigt, sollte damit Berührung gehabt haben. Im Guten wie im Schlechten. ;-)

In dieser kleinen Anleitung möchte ich kurz beschreiben wie man mit wenig Aufwand in die Lage versetzt wird die Snapshots von ZFS zu nutzen, um verschlüsselte Sicherungen auf eine externe Festplatte zu ziehen.

Voraussetzungen

Diese Anleitung bezieht sich ausdrücklich auf die Nutzung von FreeBSD! Theoretisch dürfte das aber auch alles mit Linux funktionieren.

Das verwendete Dateisystem muß ZFS und via GELI verschlüsselt sein. Der Installer von FreeBSD bietet diese Option an, es ist also kein “Hexenwerk” ein solches System zu haben.

Einrichtung der externen Festplatte

Die externe Festplatte sollte ausreichend groß sein und eine entsprechend schnelle Schnittstelle haben (USB 3.0). Da im weiteren Verlauf die Sicherungen inkrementell durchgeführt werden, ist Geschwindigkeit nicht mehr ganz so wichtig, wenn der erste Datensatz erstmal gesichert ist und die Abstände zwischen den Sicherungen nicht zu groß sind.

Partitionierung

Für die folgenden Befehle gehe ich davon aus, daß die externe Platte als Gerät /dev/da4 erkannt wurde. Es werden alle etwaigen Daten auf der Platte gelöscht.

Zunächst legen wir ein GTP Partitionierungsschema auf der Platte an und erstellen eine Partition für ein FreeBSD-ZFS.

# gpart create -s GPT /dev/da4
# gpart add -t freebsd-zfs -l backup-vol da4
# gpart show

Der letzte Befehl gpart show sollte die Partitionierungsinformationen ausgeben.

Verschlüsselung

Der folgenden Befehl initialisert die angelegte Partition mit der Standardverschlüsselung von GELI bei einer Schlüssellänge von 256 Bit.

# geli init -l 256 /dev/gpt/backup-vol

Bitte verwendet ein gutes Paßwort und verliert es nicht! Es gibt noch alternative Methoden (Schlüsseldatei), die man in der Anleitung von GELI nachlesen kann.

ZFS einrichten

Jetzt muß die Partition eingebunden und ZFS entsprechend eingerichtet werden:

# geli attach /dev/gpt/backup-vol
# zpool create backup /dev/gpt/backup-vol.eli
# zfs create -o compress=lz4 backup/home

Diese Befehle entschlüsseln die Partition, erstellen einen Pool für ZFS darauf und einen ZFS-Datensatz, den wir später für die Sicherung von Snapshots verwenden.

Initialen Snapshot erstellen und sichern

Damit die zukünftigen Sicherungen inkrementell erfolgen können, muß erst ein initialer Datensatz angelegt werden.

Einen solchen erstellt man mittels des folgenden Befehls für den Datensatz /usr/home:

# zfs snapshot "zroot/user/home@2018-12-21"

Der Teil hinter dem Klammeraffen (@) ist der Name des Snapshots, hier ein Datum in ISO-Notation.

Anschließend muß der Snapshot auf die externe Platte überspielt werden, was eine Weile dauern kann und mittels des folgenden Befehls geschieht:

# zfs send "zroot/usr/home@2018-12-21" | zfs receive -F "backup/home@2018-12-21"

Vorhandene Snapshots kann man sich mit dem Befehl zfs list -t snapshot anzeigen lassen.

Skript für die regelmäßige Sicherung

Das folgende Skript kann regelmäßig ausgeführt werden, um Daten zu sichern. Vorher muß jedoch der ZFS-Pool der externen Platte eingebunden werden.

#!/bin/sh

BACKUP_POOL="backup"

zpool get -Hp -o value free ${BACKUP_POOL} >/dev/null 2>&1 || {
  echo "ZFS backup pool (${BACKUP_POOL}) not found!"
  exit 1
}

if [ $# == 1 ]; then
  SNAPSHOT=$(date +"%F")
  echo "Going to start incremental snapshot backup from ${1} to ${SNAPSHOT} in 15 seconds."
  echo "If unsure, press Ctrl+C now..."
  sleep 15
  sudo zfs snapshot "zroot/usr/home@${SNAPSHOT}"
  sudo zfs send -i ${1} "zroot/usr/home@${SNAPSHOT}" | sudo zfs receive -F "${BACKUP_POOL}/home@$SNAPSHOT"
  echo "Operation complete. Please remember to also backup important system files."
  echo "Directories like /boot /etc /usr/local/etc and likely /bootpool."
  echo "Remember to export the zpool and detach the geli device before unplugging!"
else
  echo "Usage  : $0 last-backup-date"
  echo "Example: $0 2001-01-01"
  echo "If you don't have a last backup please create one using the following commands:"
  echo '# SNAPSHOT=$(date +"%F")'
  echo '# sudo zfs snapshot "zroot/usr/home@${SNAPSHOT}"'
  echo "# sudo zfs send \"zroot/usr/home@\${SNAPSHOT}\" | sudo zfs receive -F \"${BACKUP_POOL}/home@\${SNAPSHOT}\""
fi

Aus- und wiedereinhängen der Platte und des ZFS-Pools

Nach erfolgter Datensicherung kann der Pool von ZFS exportiert, GELI ausgehängt und anschließend die Festplatte abgezogen werden.

Für die ersten beiden Punkte sind folgende Befehle zuständig:

# zpool export backup
# geli detach /dev/gpt/backup-vol.eli

Für das wiedereinhängen gehen wir in folgendermaßen vor:

# geli attach /dev/gpt/backup-vol
# zpool import backup
Jens Grassel Written by:

Solving problems and burning chrome for fun and profit.