- Abraxas - https://www.effinger.org/blog -

ZFS Snapshots synchronisieren mit zettarepl auf dem Rasperry Pi

Für das NAS zuhause nutze ich FreeNAS [1] und das funktioniert wunderbar. Das dort genutzt ZFS-Dateisystem bietet die wunderbare Möglichkeit, Snapshots anzulegen und durch deren zeitsparende Synchronisierung auf einen anderen Server ein verlässliches Backup einzurichten. Unter FreeNAS kann das komfortabel über das GUI unter Tasks > Replication eingerichtet werden. Da ich allerdings auf einen Rasperry Pi mit FreeBSD als Betriebssystem sichern möchte, ist nur der Push von Backups möglich. Wie sich zeigte, kann ein speziell für das Backup errichtete Nutzerkonto nicht mit ausreichend Privilegien ausgestattet werden, um ein funktionierendes Backup einzurichten. Als root hätte ich es zwar einrichten können, dann wäre allerdings für den Fall, dass jemand Zugriff auf den NAS-Server erhält auch das komplette Backup-System kompromitiert. Somit schaute ich mich nach anderen Lösungen um. Zrep [2] war die erste Wahl und funktioniert auch sehr gut, allerdings habe ich es nicht geschafft, rekursiv zu synchronisieren (siehe Bug [3]). Mit zettarepl [4], dem Tool das auch in FreeNAS Anwendung findet, startete ich einen neuen, erfolgreichen Versuch. Dazu bin ich wie folgt vorgegangen, um zettarepl in FreeBSD einzurichten:

pkg install python py37-setuptools py37-pytz py37-yaml py37-paramiko py37-croniter py37-coloredlogs py37-jsonschema py37-isodate py37-dateutil
mkdir zettarepl
cd zettarepl
fetch https://github.com/freenas/zettarepl/archive/master.tar.gz
tar xzf master.tar.gz
cd zettarepl-master/
python setup.py install --prefix /usr/local

Dann kopieren der Konfigurationsdatei und entsprechendes Anpassen:

cp examples/pull/ssh-replication.yaml ~/zettarepl_pull_backup.yaml

Dann geht es an das Testen der Pull-Replikation von Snapshots. Dazu in der Konfigurationsdatei die Sektion schedule wie folgt anpassen:

schedule:
  minute: "*"
  hour: "*"
  day-of-month: "*"
  month: "*"
  day-of-week: "*"

Nun kann mit einem

zettarepl -l "debug" run --once ~/zettarepl_pull_backup.yaml

getestet werden, ob alles richtig funktioniert.

Leider funktionierte es irgendwie nicht und ich habe nicht herausgefunden, warum. Nun greife ich auf einen FreeNAS Replication Task zurück. Damit sichert zwar das zu sichernde System selbst auf den Backup-Server (eigentlich sollte es so sein, dass der Backup-Server sich die Daten selbst holt), aber wenigstens funktioniert es so. Dazu habe ich einen speziellen Backup-User eingerichtet (mit entsprechenden ZFS-Privilegien).

Hilfreich und eine Alternative dazu ist auch diese Vorgehensweise mit zrep [5]. Diese setze ich in Verbindung miz zrep-expire [6] ein für ein spezielles zvol.