www.fabiankeil.de/blog-surrogat/2021/03/21/simplesnap-auf-electrobsd.html

simplesnap auf ElectroBSD-Servern installiert

Auf meinem Laptop setze ich zogftw ein um Backups zu machen. Da ich es genau dafür geschrieben habe, bin ich sehr zufrieden damit.

zogftw erstellt ZFS-Snapshots und überträgt sie auf eine beliebige Anzahl von externen mit geli verschlüsselten Speichermedien.

Auf Servern, auf die man nicht oder nur umständlich physikalisch zugreifen kann, kommt der Einsatz von externen Festplatten natürlich nicht in Frage.

zogftw kann zwar auch über ggated zur Verfügung gestellten Speicher zugreifen und auch das mache ich mit meinem Laptop, dies auf einem Server zu automatisieren ist jedoch etwas umständlich.

Seit ein paar Monaten sehe ich mich daher nach einer Backup-Lösung für ElectroBSD-Server um und teste derzeit simplesnap.

Patch für ElectroBSD notwendig

Um simplesnap unter ElectroBSD nutzen zu können musste ich es patchen damit GNU head verwendet wird. Das triviale Patch-Set habe ich Ende 2020 an den simplesnap-Entwickler geschickt, aber keine Antwort erhalten.

Auf GitHub ist mir später ein Pull-Request von einem MacOS-Nutzer mit einem ähnlichen Patch aufgefallen, der bereits seit 2019 ignoriert wird ...

simplesnap-Einrichtung

simplesnap ist ein Bash-Skript, als Abhängigkeit müssen auf ElectroBSD außer der Bash noch die GNU coreutils installiert werden.

In der von mir verwendeten Konfiguration wird simplesnap auf dem System ausgeführt, wo die Backups gespeichert werden, verbindet sich über ssh mit dem zu sichernden System und ruft dort ebenfalls simplesnap auf. Dies geschieht über ein Wrapper-Skript.

simplesnap-Account statt root-Rechte

Die simplesnap-Dokumentation empfiehlt, simplesnap mit root-Rechten auszuführen. Davon halte ich nicht so viel, stattdessen nutze ich einen eigenen simplesnap-User, der über zfs allow die notwendigen Rechte erhalten hat.

Auch der simplesnap-User muss sowohl auf den Quell-Systemen als auch auf dem Backup-Speicher eingerichtet werden.

Auf den Quell-Systemen benötigt der simplesnap-Nutzer ssh-Zugang, den man über die authorized_keys-Datei einschränken kann:

[fk@elektrobier ~]$ sudo cat ~simplesnap/.ssh/authorized_keys
command="/usr/local/sbin/simplesnapwrap",from="[...]",no-port-forwarding,no-X11-forwarding,no-pty ssh-ed25519 AAAAC3[...]a simplesnap@backup

Auf dem Backup-Speicher werden die ZFS-Rechte "create,destroy,mount,receive" benötigt, auf den Quell-Systemen "create,destroy,hold,mount,send,snapshot".

simplesnap überträgt nicht alle vorhandenen Snapshots, was mir am liebsten wäre, sondern nur seit dem letzten Aufruf neu hinzugekommenen Snapshots und die aktuellen Änderungen. Beim ersten Aufruf werden nur der aktuelle Stand der Datasets ohne Snapshots gesichert.

simplesnap erzeugt selbst Snapshots, behält aber nur den zuletzt erstellen Snapshot vorrätig.

Wenn man nicht zusätzlich manuell oder durch andere Software Snapshots erstellt, hat man also auch auf dem Backup-Speicher jeweils nur den Stand des letzten Backup-Vorgangs.

Für die automatisierte Snapshot-Erstellung werde ich mir vermutlich das in der simplesnap-Dokumentation empfohlene zfsnap näher anschauen.

Momentan erstelle ich Snapshots manuell mit zogftw.

Standardmäßig sichert simplesnap alle vorhandenen Datasets, Ausnahmen können auf dem zu sichernden System durch Setzen der ZFS-Property org.complete.simplesnap:exclude mit dem Wert on markiert werden.

Kurze Laufzeit Dank inkrementell gesendeter Snapshots

Mehr als 70 Datasets von einem System in Amsterdam auf ein System in Frankfurt zu sichern dauert nur etwa fünf Minuten, wenn wenig Daten hinzugekommen sind:

[simplesnap@backup ~]$ time /usr/local/sbin/simplesnap --host elektrobier.fabiankeil.de --setname mainset --store dpool/simplesnap --sshcmd "ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap" --receivecmd "/sbin/zfs receive -F -u"

real    4m54.262s
user    0m2.332s
sys     0m12.025s
[simplesnap@backup ~]$ zfs list -r -H dpool/simplesnap/elektrobier.fabiankeil.de | wc -l
      74
[simplesnap@backup ~]$ time /usr/local/sbin/simplesnap --host elektrobier.fabiankeil.de --setname mainset --store dpool/simplesnap --sshcmd "ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap" --receivecmd "/sbin/zfs receive -F -u"

real    5m0.988s
user    0m7.661s
sys     0m13.694s
[simplesnap@backup ~]$ zfs list dpool/simplesnap/elektrobier.fabiankeil.de
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
dpool/simplesnap/elektrobier.fabiankeil.de  41.5G   866G    23K  /dpool/simplesnap/elektrobier.fabiankeil.de

Den Set-Namen mainset habe ich der Dokumentation entnommen betrachte ihn rückblickend als unvorteilhaft, da der Name in die von simplesnap erzeugten Snapshots eingefügt wird:

[fk@elektrobier ~]$ zfs list -r -t all dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de | tail
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-19_16:09                             169K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-19_17:29                             169K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-19_19:24                             128K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-19_19:28                             186K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-19_19:31                             128K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-20_13:36                             209K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-20_13:46                             209K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-21_13:39                             134K      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@2021-03-21_13:48                                0      -   713M  -
dpool/usr/jails/fabiankeil.de/usr/local/www/fabiankeil.de@__simplesnap_mainset_2021-03-21T14:15:55__      0      -   713M  -

Eine Referenz auf das sichernde System (backup-vm-frankfurt) wäre also praktisch, da ich mehr als ein sicherndes System einsetzen möchte.

Ich bin aber zu faul, jetzt alle Snapshots manuell umzubenennen, solange das Testsystem läuft werde ich den Namen daher voraussichtlich beibehalten.

simplesnap hat leider keine Verbose-Option, bei Fehlern rufe ich es daher über bash -x .. auf, was natürlich nicht ideal ist.

syslog-Meldungen einrichten

Grundsätzlich versucht simplesnap auch Syslog zu nutzen, in der ElectroBSD-Standard-Syslog-Konfiguration, die der von FreeBSD entspricht, landen die nicht-kritischen Log-Meldungen aber im Nichts.

Um das zu ändern muss die Syslog-Konfiguration angepasst werden:

[fk@backup ~]$ cat /etc/syslog.d/simplesnap.conf
:programname, regex, "^simplesnap*"
*.*                                          /var/log/simplesnap

simplesnap erzeugt dann Meldungen wie:

Mar 21 14:57:48 backup simplesnap[14899]: Invoked as: /usr/local/sbin/simplesnap --host elektrobier.fabiankeil.de --setname mainset --store dpool/simplesnap --sshcmd ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap --receivecmd /sbin/zfs receive -F -u
Mar 21 14:57:48 backup simplesnap[14899]: Store dpool/simplesnap is mounted at /dpool/simplesnap
Mar 21 14:57:48 backup simplesnap[14899]: Lock obtained at /dpool/simplesnap/elektrobier.fabiankeil.de/.lock with mkdir
Mar 21 14:57:48 backup simplesnap[14899]: Finding remote datasets to back up
Mar 21 14:57:48 backup simplesnap[14899]: Running ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap elektrobier.fabiankeil.de simplesnapwrap listfs
Mar 21 14:57:49 backup simplesnap[14899]: ssh exited successfully
Mar 21 14:57:49 backup simplesnap[14899]: Running ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap elektrobier.fabiankeil.de simplesnapwrap sendback mainset dpool
Mar 21 14:57:49 backup simplesnap[14899]: Running /sbin/zfs receive -F -u dpool/simplesnap/elektrobier.fabiankeil.de/dpool
Mar 21 14:57:51 backup simplesnap[14899]: ssh exited successfully
Mar 21 14:57:51 backup simplesnap[14899]: /sbin/zfs exited successfully
Mar 21 14:57:51 backup simplesnap[14899]: Received backup into dpool/simplesnap/elektrobier.fabiankeil.de/dpool
Mar 21 14:57:51 backup simplesnap[14899]: Running ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap elektrobier.fabiankeil.de simplesnapwrap reap mainset dpool
Mar 21 14:57:53 backup simplesnap[14899]: ssh exited successfully
Mar 21 14:57:53 backup simplesnap[14899]: Running /sbin/zfs list -t snapshot -r -d 1 -H -o name dpool/simplesnap/elektrobier.fabiankeil.de/dpool
Mar 21 14:57:53 backup simplesnap[14899]: /sbin/zfs exited successfully
Mar 21 14:57:53 backup simplesnap[14899]: Destroying snapshot dpool/simplesnap/elektrobier.fabiankeil.de/dpool@__simplesnap_mainset_2021-03-21T14:13:47__
Mar 21 14:57:53 backup simplesnap[14899]: Running /sbin/zfs destroy dpool/simplesnap/elektrobier.fabiankeil.de/dpool@__simplesnap_mainset_2021-03-21T14:13:47__
Mar 21 14:57:53 backup simplesnap[14899]: /sbin/zfs exited successfully
[...]
Mar 21 15:02:30 backup simplesnap[14899]: Running ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap elektrobier.fabiankeil.de simplesnapwrap sendback mainset rpool/var/tmp
Mar 21 15:02:30 backup simplesnap[14899]: Running /sbin/zfs receive -F -u dpool/simplesnap/elektrobier.fabiankeil.de/rpool/var/tmp
Mar 21 15:02:31 backup simplesnap[14899]: ssh exited successfully
Mar 21 15:02:31 backup simplesnap[14899]: /sbin/zfs exited successfully
Mar 21 15:02:31 backup simplesnap[14899]: Received backup into dpool/simplesnap/elektrobier.fabiankeil.de/rpool/var/tmp
Mar 21 15:02:31 backup simplesnap[14899]: Running ssh -p 55 -i ~/.ssh/id_ed25519_simplesnap elektrobier.fabiankeil.de simplesnapwrap reap mainset rpool/var/tmp
Mar 21 15:02:32 backup simplesnap[14899]: ssh exited successfully
Mar 21 15:02:32 backup simplesnap[14899]: Running /sbin/zfs list -t snapshot -r -d 1 -H -o name dpool/simplesnap/elektrobier.fabiankeil.de/rpool/var/tmp
Mar 21 15:02:32 backup simplesnap[14899]: /sbin/zfs exited successfully
Mar 21 15:02:32 backup simplesnap[14899]: Destroying snapshot dpool/simplesnap/elektrobier.fabiankeil.de/rpool/var/tmp@__simplesnap_mainset_2021-03-21T14:18:44__
Mar 21 15:02:32 backup simplesnap[14899]: Running /sbin/zfs destroy dpool/simplesnap/elektrobier.fabiankeil.de/rpool/var/tmp@__simplesnap_mainset_2021-03-21T14:18:44__
Mar 21 15:02:32 backup simplesnap[14899]: /sbin/zfs exited successfully
Mar 21 15:02:32 backup simplesnap[14899]: Exiting successfully.

simplesnap erfüllt zwar nicht alle meine Wünsche, aber bis ich eine bessere Lösung gefunden habe werde ich es wohl einsetzen.