Ein regelmäßiges Backup ist immer dann von großer Bedeutung, wenn man es konkret braucht. Mit Hilfe von rsync kann man ein Backup relativ einfach sowohl am gleichen Rechner als auch auf oder von einem entfernten Rechner erstellen.

Mit dem Befehl

rsync -av Quellverzeichnis Zielverzeichnis

werden alle Dateien aus dem Quellverzeichnis in das Zielverzeichnis kopiert. Der Paramter -a steht für Archiv und übernimmt sämtliche Berechtigungen, Zeitstempel und Gerätedaten aus der Quelle. -v steht für verbose und gibt ein paar zusätzliche Statusinformationen.

Wird der Aufruf um den Parameter „–delete“ ergänzt, erhält man eine 1:1 Kopie. Datein, die sich nicht in der Quelle befinden, jedoch im Zielverzeichnis vorhanden sind, werden dort gelöscht. Natürlich kann man vom Kopiervorgang auch bestimmte Dateien ausnehmen. Dazu steht der Parameter –exclude bzw. –exclude-from für eine längere Liste als Datei zur Verfügung.

Das ganze lässt sich leicht so erweitern, dass die Sicherung auf einem entfernten Rechner stattfindet

rsync -a Quellverzeichnis benutzer@backup_server:/Pfad/zum/backup

Damit wird das Quellverzeichnis zum Zielverzeichnis auf einem anderen Rechner kopiert. Das schöne an rsync ist, dass dies auch umgekehrt möglich ist. Das heißt ich kann mir die Daten eines anderen Rechners auf den BackupServer holen.

rsync -a benutzer@server_to_backup:/Pfad Zielverzeichnis

Wenn rsync automatisert in einem Skript verwendet werden soll, kann die Authentifizierung etwa über einen SSH Key durchgeführt werden.

rsync -av --delete -e "ssh -i /home/user/.ssh/sshkey" root@linux-bildung.at:/data/ /backup/linux-bildung.at.mirror/

Dies hat jedoch den Nachteil, dass der root Zugang für ssh erlaubt sein muss. Als Lösung für dieses Problem verwende ich gerne SSH und eine Portweiterleitung, sowie den rsync-daemon.

rsync-daemon

Der rsync-Daemon ist eine Alternative zu SSH für Remote-Backups. … Die Verwendung von SSH zum Erstellen eines Remote-Backups eines gesamten Systems erfordert beispielsweise, dass der SSH-Daemon die Root-Anmeldung zulässt, was als Sicherheitsrisiko angesehen wird. Die Verwendung des rsync-Daemon ermöglicht es, die Root-Anmeldung über SSH zu deaktivieren.

Das hat zwei Vorteile:

  • Der rsync-daemon ist nur lokal und nicht remote erreichbar.
  • Ein Root-Zugang per SSH ist nicht notwendig.

Ein Beispiel rsyncd.conf könnte so aussehen.

[webfolder]
uid = www-data
gid = www-data
path = /var/www
transfer logging = no
read only = yes
hosts allow = 127.0.0.1
secrets file = /etc/rsyncd.passwd

Der Pfad der gesichert wird liegt unter „/var/www“ und heißt webfolder. Zugriff hat nur localhost und das auch nur lesend. Die notwendig Passwortdatei heißt /etc/rsyncd.passwd. Es sollte selbstverständlich sein, dass rsyncd.passwd nur von root gelesenw werden kann.

Den daemon kann man mit folgendem Befehl starten.

rsync --daemon

Dabei erwartet er eine rsyncd.conf im Verzeichnis /etc/

Der SSH-Aufruf sieht wie folgt aus:

ssh -f -o ExitOnForwardFailure=yes -L5000:127.0.0.1:873 -i /home/user/key_rsa backup@www.linux-bildung.at sleep 10

Anschließend kann man rsync wie folgt aufrufen:

rsync -av --delete --port 5000 localhost::webfolder/ /data/backup/linux-bildung.at/www 

Wenn man beide Zeilen in ein Shell-Skript verpackt, kann man den Aufruf gut als Cronjob ausführen

#!/bin/bash
ssh -f -o ExitOnForwardFailure=yes -L5000:127.0.0.1:873 -i /home/user/key_rsa backup@www.linux-bildung.at sleep 10

rsync -av --delete --port 5000 localhost::webfolder/ /data/backup/linux-bildung.at/www 

Tägliche Snapshots, aber platzsparend

Wird obiges Skript täglich ausgeführt, hat man das Problem, dass man zwar eine Sicherung der Daten hat, aber immer nur den letzten Stand. Will oder muss man ein paar Tage zurück, klappt das mit dem genannten Skript nicht. Mit dem Parameter –link-dest erstellt rsync nur Hardlinks von den bereits vorhandenen Dateien. Dadurch wird sehr viel Platz gespart, weil jede Datei physisch am Laufwerk nur einmal existieren muss und trotzdem hat man eine tägliche Sicherung, aus der man ganz einfach Dateien kopieren kann. Hier das Skript leicht verändert

#!/bin/bash
# Unser heutiges Datum
TODAY="$(date +%d.%m.%Y)"
# Unser gestriges Datum
YESTERDAY="$(date -d yesterday +%d.%m.%Y)/"

rsync -av --delete --port 5000 localhost::webfolder/ --link-dest /data/backup/linux-bildung.at/www/$YESTERDAY /data/backup/linux-bildung.at/www/$TODAY 

Mit dieser kleinen Änderung landet ein Backup z.B. im Ordner /data/backup/linux-bildung.at/www/28.06.2021. Es werden aber nur neue Dateien in den Ordner kopiert. Dateien, die bereis im Ordner /data/backup/linux-bildung.at/www/27.06.2021 liegen und auch im neuen Backup vorhanden sind, werden nur als Hardlink abgebildet und verbrauchen somit quasi keinen Plattenplatz.

Genau genommen wird im Inode einer Datei die aktuelle Anzahl der harten Links gespeichert. Erst wenn der letzte Link zu einer Datei gelöscht ist, der Zähler im Inode also den Wert Null hat, wird die Datei selbst (Inode und Datencluster) zur Wiederbeschreibung freigegeben und damit logisch gelöscht. Das gilt natürlich auch umgekehrt. Wird die Datei ein weiteres Mal in einem neuen Backup verwendet, wird der Zähler im Inode um eins erhöht.

Weitere Links:

https://www.linux-magazin.de/ausgaben/2005/05/sicherer-hafen/
https://www.ionos.at/digitalguide/server/tools/server-backup-mit-rsync-erstellen/

https://linuxize.com/post/how-to-use-rsync-for-local-and-remote-data-transfer-and-synchronization/

Image by fernando zhiminaicela from Pixabay


1 Kommentar

Robert · 28.06.2021 um 20:31

Wer lieber mit grafischem User-Interface arbeitet, dem empfehle ich „Back in Time“: https://en.wikipedia.org/wiki/Back_in_Time_%28Linux_software%29 . Das arbeitet intern mit rsync.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.