Datensicherung mit BorgBackup
Datensicherung wird meist als lästiges Übel empfunden, weshalb viele ihre Daten nicht regelmäßig vor Verlust schützen - bis es irgendwann zu spät ist. Um Daten zu sichern gibt es viele Wege und Möglichkeiten: vom manuellen Kopieren einiger (gefühlt) wichtiger Dateien hin bis zu regelmäßigen automatisierten Snapshots des kompletten Systems.
Ziel der hier vorgestellten Lösung ist es, beim Herunterfahren des Rechners automatisiert eine Sicherung aller Benutzerdaten auf einem zweiten Datenträger zu erstellen. Auf zusätzliche Möglichkeiten wie z.B. dem Erstellen einer verschlüsselten Sicherung oder physikalische Trennung des Sicherungsmediums wurde bewusst verzichtet, der Datenträger bleibt permanent eingesteckt, wird allerdings nur für die Dauer der Datensicherung eingebunden.
Es gibt unzählige Programme, mit deren Hilfe sich Daten sichern und die Sicherung automatisieren lässt, eines hiervon ist BorgBackup, das u.a. durch den Einsatz von Deduplizierung eine effiziente Möglichkeit zur Datensicherung bietet.
BorgBackup
BorgBackup findet sich in den Repositories der meisten Linux-Distributionen und ist schnell installiert:
$ sudo apt install borgbackup
Anschließend wird ein Verzeichnis “/mnt/backup/” erzeugt, in welches der Sicherungsdatenträger eingehängt wird. Dort wird ein Verzeichnis “borgrepo” angelegt, in dem das Repository für die Sicherung erzeugt wird:
$ sudo borg init --encryption none /mnt/backup/borgrepo/
Nach dem Ausführen von “borg init …” steht das Repository bereit und kann direkt verwendet werden.
Damit die einzelnen Parameter nicht jedesmal von Hand eingegeben werden müssen, wird unter “/root” ein Skript namens “backup.sh” angelegt, mit dessen Hilfe die Datensicherung durchgeführt wird.
#!/usr/bin/bash
# ensure the path is set
PATH=/usr/local/bin:/usr/bin:/bin
# STICK
STICK=/dev/sdb1
# MOUNTPOINT
MOUNTPOINT=/mnt/backup/
# USERNAME
USERNAME=benutzername
mount ${STICK} ${MOUNTPOINT}
if mountpoint -q ${MOUNTPOINT}; then
borg create --progress --stats --compression zstd,1 --exclude /home/${USERNAME}/.cache --exclude /home/${USERNAME}/.local/share/Trash ${MOUNTPOINT}borgrepo::'backup_{now:%Y-%m-%d_%H-%M-%S}' /home/${USERNAME}
borg prune --verbose --list ${MOUNTPOINT}borgrepo --prefix 'backup_' --keep-within=1d --keep-daily=7 --keep-weekly=4 --keep-monthly=12
sync
umount ${MOUNTPOINT}
fi
Nach dem Einhängen des Datenträgers wird überprüft, ob der Vorgang erfolgreich war und falls ja, die Datensicherung gestartet.
Die Zeile “borg create …” sichert das komplette “home”-Directory des Benutzers “benutzername”, lässt hierbei allerdings den Inhalt der Ordner “.cache” sowie “.local/share/Trash” (Papierkorb) aus. Als Archivname wird “backup_JJJJ-MM-TT_SS-MM-SS” verwendet.
Nach dem Anlegen der Sicherung wird mit “borg prune …” ein Aufräumvorgang gestartet, welcher alle Sicherungen des letzten Tages sowie die jeweils aktuellste Sicherung der letzten 7 Tage, 4 Wochen und 12 Monate aufhebt und alle anderen Sicherungen entfernt.
Als letztes wird sichergestellt, daß alle zwischengespeicherten Schreibvorgänge synchronisiert werden, bevor der Ordner wieder ausgehängt wird.
Automatisierung
Idealerweise sollte eine Datensicherung regelmäßig stattfinden und damit die Konsistenz der Daten auf Anwendungsebene gesichert ist am besten dann, wenn kein Benutzer angemeldet ist.
Eine pragmatische Lösung ist das Anstoßen der Sicherung beim Herunterfahren des Rechners, zu einem Zeitpunkt, an dem alle vom Benutzer verwendeten Dokumente und Anwendungen geschlossen sind.
Hierzu wird ein systemd-Service mit Hilfe der Datei “/etc/systemd/system/borgbackup.service” erstellt, welcher die Aufgabe übernimmt:
[Unit]
Description=Run borg backup
RequiresMountsFor=/root /home
[Service]
ExecStart=/bin/true
ExecStop=/root/backup.sh
Type=oneshot
RemainAfterExit=yes
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
Der Aufbau des Services ist recht einfach, wichtig ist die Definition von “RequiresMountsFor=”, welche dafür sorgt, daß der Service dann ausgeführt wird, wenn die entsprechenden Dateisysteme (noch) einhängt sind. Beim Start des Dienstes wird mit “/bin/true” erfolgreich nichts getan, beim Beenden des Dienstes dann das Skript zur Datensicherung angestoßen. Die Angabe von “Type=oneshot” und “RemainAfterExit=yes” sorgt dafür, daß der Dienst weiterhin als aktiv angesehen wird, auch nachdem “/bin/true” beendet wurde.
Da vor allem die initiale Sicherung je nach Menge der zu sichernden Daten länger als 90 Sekunden dauern kann, kann mit Hilfe des Parameters “TimeoutStopSec=” die maximal mögliche Laufzeit der “ExecStop"-Aufgabe auf z.B. 5 Minuten verlängert werden.
Um den Service ins System einzubinden, muß ein
$ sudo systemctl enable borgbackup
erfolgen, gegebenenfalls gefolgt von einem
$ sudo systemctl start borgbackup
da “enable” den Dienst zwar einbindet, aber nicht direkt startet.
Einen ersten manuellen Test kann man nach erfolgreichem Start mittels
$ sudo systemctl stop borgbackup
anstoßen, so daß der Dienst beendet und das Skript ausgeführt wird.
2020-05-18: Parameter “TimeoutStopSec=…” in Service-Definition hinzugefügt.