Seit Jahr und Tag rauscht bei mir zu Hause nun schon so ein QNAP-NAS, das mal als Backup-Device gedacht war. Nun ist Backup aber so gar nicht meins, wenn ich selbst daran denken muss. Ergo: Es muss automatisiert werden. Das schreit förmlich nach dem Pinguin-Alleskönner rsync. Doch irgendwie ist das gar nicht so einfach wie gedacht …
Ich habe ein QNAP TS-212 – nicht mehr das neueste NAS, aber es macht seinen Job. Immer wieder einmal habe ich mich daran versucht, mehr aus Ding heraus zu holen. So war es schon ein Mailserver, ein Hausautomatisierungsserver, ein Wiki, … am Ende war es kaputt-konfiguriert. Am Besten ist so ein NAS eben doch als NAS einzusetzen. Also habe ich beherzt den Resetknopf gedrückt und die Standardkonfiguration wiederhergestellt.
Im QNAP Web-Interface kann man nun die schickesten Einstellungen tätigen. So gibt es zum Beispiel im Beta-Bereich die App „Hybrid Backup Sync“, die so schön bunt ausschaut, wie im Screenshot gezeigt. Hier habe ich einen Backup-Job angelegt, der ein manuell angelegtes Verzeichnis jede Stunde lokal in den Backup-Bereich synchronisiert. Dabei archiviert das NAS „intelligent“: Es hebt je eine Version aus den letzten 12 Monaten, je eine aus den letzten 8 Wochen, je eine aus den letzten 7 Tagen und letztendlich je eine aus den vergangenen 24 Stunden auf. Auch wenn die Wiederherstellungsaufträge es nicht vermuten lassen: Das funktioniert. Man sieht es gut in der Shell. Nach einigem Hin und Her habe ich für mich selbst beschlossen, dass mir buntes Backup und shell-basiertes Restore wohl genügen werden.
Spannender ist die Frage, wie Daten auf das NAS drauf kommen. Für Windows und Mac gibt es hierfür Tools, aber ich nutze ja Ubuntu und Debian. Also heißt mein Mittel der Wahl Rsync. Hier muss man allerdings das Eine oder Andere beachten.
Am effizientesten ist Rsync, wenn man auch die rsync-Methode benutzt. Dazu gibt man als Ziel einen Pfad wie „rsync://NAS/Pfad“ an. Auf der Gegenseite, auf dem NAS, muss dazu ein Rsync-Server laufen. Das tut er wohl, aber man muss sich daran authentifizieren. In der oben genannten Hybrid Backup Sync – App findet sich unter Backupserver -> Rsync-Server eine anzuhakende Option „Standard Rsync benutzen“, die im aktiven Zustand nach Benutzername und Kennwort fragt. Die Daten, die man hier eingibt, werden dann von rsync auf dem Debain-System benötigt.
Nun wäre es zu einfach, eine Option für die Übergabe des Kennwortes in Rsync zu haben. Diese gibt es nicht. Rsync wertet allerdings die Umgebungsvariable RSYNC_PASSWORD aus, wenn diese gesetzt ist. Eine Synchronisation lässt sich also wie folgt starten:
export RSYNC_PASSWORD=KENNWORT
rsync -a –delete QUELLE rsync://BENUTZER@NAS/ZIEL
Der Parameter -a impliziert die Parameter -rlptgoD. Diese bedeuten:
-r = rekursiv, Unterverzeichnisse auch synchronisieren
-l = Links werden auch als Links kopiert
-p = Zugriffsrechte
-t = Änderungszeiten werden synchronisiert
-g = Gruppe
-o = Besitzer
-D = Besondere Dateien (Devices, …) werden als solche übernommen
Die fett gedruckten Optionen übertragen Verweise auf Systembenutzer und Zugriffsrechte, die auf dem Zielsystem nicht nur nicht genauso wie auf dem Quellsystem sein müssen, im Falle von QNAP auch definitiv nicht so sind. Der Einfachheit halber lasse ich die also weg. Dafür füge ich noch -u hinzu, damit neuere Daten auf dem Zielsystem nicht überschrieben werden. Und ein -v gibt etwas detaillierter Auskünfte über das Geschehen.
Insbesondere wenn Windows mit Samba im Spiel ist, zeigt mir nun aufgrund des Parameters -u die Ausgabe von -v immer öfter an, dass die Datei auf dem Zielsystem neuer sei als auf dem Quellsystem. Grund dafür ist ein Übertragungsfehler bei der Änderungszeit. Abhilfe schafft der Parameter
–modify-window=1
der hier eine gewissen „Unschärfe“ zulässt.
Mein QNAP lässt sich partout nicht abgewöhnen, zumindest von Bildern kleine Vorschauen (Thumbnails) zu speichern. Diese Dateien werden dann von Rsync ebenfalls beachtet. Im Besten Fall nervt das einfach. Der Parameter
–exclude ‚.@__thumb‘
schafft hier Abhilfe indem er diese Dateien ignoriert.
Damit ergibt sich der relativ einfache ;-), folgende Ausdruck, um Daten auf das NAS zu synchronisieren:
export RSYNC_PASSWORD=KENNWORT
rsync -rltDvu –modify-window=1 –delete –exclude ‚.@__thumb‘ QUELLE rsync://BENUTZER@NAS/ZIEL
Ganz soooo einfach ist es dann aber doch nicht. Schließlich möchte man die Synchronisation ja automatisch, zum Beispiel jede Stunde, laufen lassen. Das übernimmt crontab, klar. Hier stört es dann aber doch, die umfangreichen Ausgaben von -v zu haben und/oder nicht zu wissen, ob jetzt alles gut ging oder nicht.
Der Lesbarkeit halber bezeichne ich den obigen Rsync-Befehl einfach als RSYNC, denn dieser bleibt so wie er ist. Seine Ausgabe wird jedoch auf eine temporäre Logdatei umgeleitet. Gleichzeitig werte ich den Rückgabewert von Rsync aus. Dieser ist nämlich nur im Erfolgsfalle ‚1‘. Das könnte dann so aussehen:
RSYNC > /tmp/log && echo Erfolg || echo kein Erfolg
Anstelle des echo-Befehls soll natürlich etwas wiederfindbares in die Systemlogs geschrieben werden. Das übernimmt der Befehl „logger“. Dessen Parameter -t übernimmt einen Log-Typ, der dann in der Log-Datei /var/log/syslog gleich nach dem Hostname erscheint. Der Parameter -f schreibt den Inhalt einer Datei ins Log, folgender Text wird so wie er ist übernommen. Smit sieht die Zeile letztendlich wie folgt aus:
RSYNC > /tmp/log \
&& logger -t RSYNC_TO_QNAP success \
|| logger -t RSYNC_TO_QNAP -f /tmp/log
Über den Befehl „grep RSYNC_TO_QNAP /var/log/syslog“ kann man nun alle entsprechenden Stati sehen.
Nun habe ich aufgrund meines Foto-Hobbies gern mal mit großen Datenmengen zu tun. Dabei gilt es zu vermeiden, einen neuen Rsync-Prozess zu starten, wenn der vorherige noch nicht beendet ist. Etwas hemdsärmlich löse ich das mit dem Befehl „ps„, der alle laufenden Prozesse auflistet, und dem bewährten „grep„, das nach meinem rsync sucht:
ps -ef | grep -v grep | grep „rsync“ > /dev/null || RSYNC
Hier verhindert „grep -v grep“, dass ich den grep-Befehl mit rsync im Parameter finde. Bleibt bei diesem am Ende noch eine gefundene Zeile stehen, so läuft rsync bereits. In jedem anderen Fall wird es gestartet.
Letztendlich habe ich folgenden Eintrag in meiner Crontab stehen:
ps -ef | grep -v grep | grep „rsync“ > /dev/null\
|| /bin/bash -c ‚export RSYNC_PASSWORD=KENNWORT;\
rsync -rltDvu –modify-window=1 –delete –exclude ‚.@__thumb‘ QUELLE/ rsync://BENUTZER@NAS/ZIEL > /tmp/rsync.log\
&& logger -t RSYNC_TO_QNAP success\
|| logger -t RSYNC_TO_QNAP -f /tmp/rsync.log ;\
rm /tmp/rsync.log‘
… und soweit ich sehe funktioniert das auch ;-).