Zeitgesteuerte Backups auf dem RaspberryPi
Da unser Betriebssystem in diesem Setup auf dem USB-Stick läuft, wird die SD-Karte kaum noch durch Schreibzugriffe belastet. Sie dient nur noch als ruhiger Lagerplatz für unsere rsync-Sicherungen und hält dadurch deutlich länger.
Empfehlungen aus dem Netz zum Nutzen des Repositorys Piclone für das Klonen des Betriebssystems eignen sich primär für das Kopieren auf eine externe SD-Karte. Aus diesem Grund – und auch, weil ich gerne ein inkrementelles Backup haben möchte – nutze ich das vielseitige Tool rsync. Zur besseren Verwaltung automatisieren wir das Ganze mit einem Script und den zeitgesteuerten Aufgaben in Linux: Cronjobs.
Rsync soll das Backup der wichtigsten Systemdaten in einen Ordner meines SAMBA-Servers auf der integrierten SD-Karte schreiben. Dazu erstelle ich einen neuen Ordner unter /mnt/dein_pfad und übergebe den Besitz an root, da auch das Script mit Root-Rechten ausgeführt wird. Wobei der Pfad natürlich auf die persönlichen Bedürfnisse angepasst werden sollte und hier nur beispielhaft steht.
Sicherheitstipp: In sensiblen Netzwerken empfiehlt es sich, den Backup-Ordner zu verstecken (indem man den Namen mit einem Punkt maskiert, z.B. .backup) oder den Zugriff in der Samba-Konfiguration explizit einzuschränken.
sudo mkdir /mnt/dein_pfad
sudo chown root:root /mnt/dein_pfad/
Der Befehl rsync in Kombination mit Scripts
Der Hauptbefehl mit rsync wird mit dem absoluten Pfad angegeben, um auch in minimalistischen Betriebssystemen das Tool korrekt anzusprechen. Die Flags erkläre ich hier kurz:
Details anzeigen
| Flag | Beschreibung |
|---|---|
| -a (archive) | Der wichtigste Schalter. Er sorgt dafür, dass fast alles erhalten bleibt: Unterverzeichnisse, Dateiberechtigungen, Zeitstempel und symbolische Verknüpfungen. |
| -x (one-file-system) | Dieser Parameter weist rsync an, auf dem aktuellen Dateisystem zu bleiben. Da die SD-Karte unter /mnt/ eingehängt ist, würde rsync ohne dieses Flag versuchen, die SD-Karte in sich selbst zu kopieren (Endlosschleife). |
| -H, -A, -X | sichern Hard-Links, Zugriffssteuerungslisten (ACLs) und erweiterte Dateiattribute |
| - -delete | Dieser Befehl macht das Backup zu einem echten Spiegelbild. Dateien, die auf dem USB-Stick gelöscht wurden, werden auch im Backup entfernt. |
Warum schließen wir so viel mit (–exclude) aus?
Ein laufendes Linux-System enthält Ordner, die keine echten Dateien auf der Festplatte sind, sondern virtuelle Schnittstellen zum Kernel oder zum Arbeitsspeicher (wie /dev, /proc, /sys). Würden wir diese mitkopieren, käme es zu Fehlern oder riesigen, unbrauchbaren Datenmengen. Auch unseren freigegebenen Backup-Ordner für den SAMBA-Server schließen wir folgenden Pfade aus, damit rsync nicht versucht, das Backup in einer Endlosschleife in sich selbst zu sichern.
/dev/,/proc/,/sys/,/tmp/,/run/,/mnt/,/dein_pfad/*,/lost+found
Scripte erstellen
Dies sind zwei Varianten eines simplen Scripts, welches Meldungen über Erfolg oder Misserfolg des Backups an den konfigurierten E-Mail-Account oder eine andere eingerichtete App weiterleitet. Diese Meldungen decken allerdings nur einen kleine Teil der möglichen Fehler ab. Für eine komplette Fehleranalyse des Backups muss man dem Script noch einige Prüfungen hinzufügen. Darauf verzichte ich hier der Einfachheit halber und um den Rahmen des Blog Posts nicht zu sprengen. Die Konfiguration eines für den autmomatischen E-Mail versands benötigten App-Passworts und das Einrichten des Dienstes msmtp habe ich in diesem Post übersichtlich erklärt.
Inhalt des Scripts mit E-Mail
#!/bin/bash
# Backup ausführen
/usr/bin/rsync -axHAX --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/dein_pfad/*,/lost+found} / /mnt/dein_pfad
# Prüfen ob rsync erfolgreich war (Exit Code 0)
if [ $? -eq 0 ]; then
echo "Backup vom $(date) war erfolgreich." | mail -s "Backup OK: dein_gerätename" deine-email@beispiel.de
else
echo "Backup vom $(date) ist FEHLGESCHLAGEN!" | mail -s "Backup FEHLER: dein_gerätename" deine-email@beispiel.de
fi
Hier alternativ ohne eine E-Mail Zustellung
#!/bin/bash
# Backup ausführen
/usr/bin/rsync -axHAX --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/dein_pfad/*,/lost+found} / /mnt/dein_pfad
# Prüfen ob rsync erfolgreich war (Exit Code 0)
if [ $? -eq 0 ]; then
wall "Backup vom $(date) war erfolgreich."
else
wall "Backup vom $(date) ist FEHLGESCHLAGEN!"
fi
Script ausführbar machen (X-Recht vergeben)
sudo chmod +x /usr/local/bin/pi_backup.sh
Cronjob anpassen
Die Verwaltung der zeitgesteuerten Aufträge wird in Linux über die sogenannten Cronjobs erledigt. Zuerst sollte man prüfen, ob der Dienst aktiv ist:
sudo systemctl status cron
Sollte er nicht aktiv sein, starten wir ihn mit:
sudo systemctl enable --now cron
Dann öffnen wir die Crontab-Konfigurationsdatei und tragen unseren Cronjob ein. Unbedingt darauf achten mit sudo den Crontab zu öffnen, da man ansonsten nicht die Cronjobs des angemeldeten Nutzers bearbeitet und dieser hat nicht die nötigen Rechte, um unser Script auszuführen:
sudo crontab -e
Eintrag in der Crontab-Konfigurationsdatei. Hier eingestellt ist ein Backup der Daten an jedem Sonntag um 3:00 Uhr:
0 3 * * 0 /usr/local/bin/pi_backup.sh
Die interaktive Web-Anwendung namens Crontab-Guru eignet sich hier gut zum Visualisieren und besseren Verständnis sowie dem Planen der Parameter.
Funktionstest
Nun bleibt noch ein kurzer Test des Installationsscripts. Dazu kann rsync im Dry-Run-Modus ausgeführt werden mit dem -n Flag. Zusätzlich setzen wir noch das Flag -v für verbose, um eine detaillierte Ausgabe der durchgeführten Aktionen im Terminal zu erhalten, ohne dabei schon tatsächlich Daten zu schreiben.
sudo rsync -anvxHAX --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/dein_pfad/*,/lost+found} / /mnt/dein_pfad
Dies sollte eine lange Ausgabe auf dem Terminal produzieren und am Ende KEINEN Fehler auswerfen. Dann ist die Konfiguration gelungen.
Ab jetzt wird jeden Sonntag um 3:00 Uhr nachts automatisch ein Backup vom USB-Stick auf die interne SD-Karte des Raspberry Pi erstellt. Falls du auch eine SAMBA-Server auf dem Server eingerichtet hast, kannst du nun von überall im Netzwerk auf deine Sicherungen zugreifen.
Dank der effizienten Funktionsweise von rsync werden ab dem zweiten Backup nur noch die Daten kopiert, die sich tatsächlich verändert haben. Das spart massiv Speicherplatz und schont die Ressourcen des Systems.