ubuntuusers.de

rsnapshot

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Wiki/Icons/terminal.png Mit rsnapshot 🇬🇧 ist es möglich, sogenannte "Snapshot"-Ordner zur Datensicherung auf z.B. einer externen USB-Festplatte zu erstellen. In diesen Ordnern liegt eine Kopie der zu sichernden Verzeichnis-Struktur und der Dateien. Sie können aus diesen Ordnern heraus direkt gelesen/restauriert werden. rsnapshot überprüft dabei selbstständig, welche Dateien neu hinzu gekommen sind oder entfernt wurden.

Ein Vorteil von rsnapshot, das wiederum auf rsync basiert, ist, dass die unveränderten Dateien und Verzeichnisse nur einmal gesichert werden. In allen weiteren Snapshots wird lediglich ein Hardlink auf die vorhandene Datei gesetzt. Das kostet fast keinen Speicherplatz und erlaubt viele Sicherungen ohne entsprechenden Platzverbrauch. Auch wenn viele Snapshot-Ordner erstellt wurden, belegt jede Datei, solange sie nicht geändert wurde, nur einmal Plattenplatz.

rsnapshot ist nur mit Einschränkungen für sich häufig ändernde Dateien geeignet. Diese werden bei jedem Sicherungslauf neu gesichert und erhöhen den Platzbedarf beträchtlich. Ein Beispiel sind Mailboxen, Datenbanken oder Logfiles. Für diese ist eher rdiff in Kombination mit regelmäßigen Dumps zu empfehlen. Alternativ bzw. ergänzend kann ein getrennter rsnapshot-Job für diese aufgesetzt werden, der größere Intervalle aufweist.

Eine Alternative mit grafischer Konfiguration und Bedienung ist Back In Time. Allgemeine Hinweise zum Thema Datensicherung und zu weiterenProgrammen finden sich im entsprechenden Artikel Datensicherung.

Installation

rsnapshot befindet sich in den offiziellen Paketquellen [1]:

  • rsnapshot (universe)

Paketliste zum Kopieren:

sudo apt-get install rsnapshot 

Oder mit apturl installieren, Link: apt://rsnapshot

Dateisystem des Zielmediums

rsnapshot macht ein inkrementelles Backup und verwendet hierfür sogenannte Hardlinks. Dadurch muss jede unveränderte Datei nur einmal gesichert werden. Ab diesem Zeitpunkt wird sie nur verlinkt. Diese Tatsache macht es allerdings notwendig, auf dem Zielmedium, also z.B. einer externen USB-Festplatte, ein Hardlink-fähiges Dateisystem zu haben. Die gängigen Linux-Dateisysteme, z. B. ext3, ext4, unterstützen solche Links. Inzwischen ist es auch möglich, von Linux aus auf NTFS-Partitionen Hardlinks zu erzeugen. Die FAT..-Dateisysteme hingegen scheiden für rsnapshot aus.

Konfiguration

Die Konfiguration von rsnapshot erfolgt über die Datei /etc/rsnapshot.conf. Diese Datei wird bei der Installation automatisch angelegt und kann mit einem Texteditor mit Root-Rechten [2] angepasst werden. Folgend werden nun die wichtigsten Konfigurationen kurz angesprochen. Für eine ausführliche Erklärung zu allen Parameter sei auf die Kommentare in der Datei bzw. die Projektseite 🇬🇧 verwiesen.

Die Reihenfolge der Parameter in diesem Artikel entspricht der in der Konfigurationsdatei. Daher scheinen die einzelnen Konfigurationsschritte hier in einer nicht besonders logischen Reihenfolge zu sein.

Hinweis:

Verzeichnisse müssen mit / enden. Daher muss man z. B. /home/user/ statt /home/user benutzen. Nach dem letzten / darf kein Leerzeichen mehr stehen.

Das Trennungszeichen zwischen Schlüssel und Wert ist Tab ⇆ . Werden Schlüssel und Wert mit Leerzeichen getrennt, ist die Datei nicht valide.

Backup-Zielverzeichnis

snapshot_root ist das Zielverzeichnis, in dem die Backups abgelegt werden. Unterhalb dieses Verzeichnisses werden noch weitere Ordner angelegt, dazu aber unten mehr.

snapshot_root	/var/cache/rsnapshot/

Es ist natürlich auch möglich, die Backups auf z.B. einer externen USB-Festplatte abzulegen. Für diesen Fall sollte das Medium während/nach dem Start des Systems automatisch gemountet werden. Weitere Informationen zu diesem Thema finden sich in den Artikeln mount und fstab.

Zielverzeichnis nicht automatisch erzeugen

Wenn das Backup auf einem externen Medium, z.B. einer USB-Platte, gespeichert werden soll, dann darf rsnapshot natürlich nur dann speichern, wenn die Platte auch tatsächlich am Rechner angeschlossen und eingeschaltet ist. Andernfalls würde rsnapshot die Sicherungen auf der lokalen Platte z.B. unter /media/usb... ablegen. Um dies zu verhindern, muss das # vor dem folgenden Parameter entfernt und der Wert auf 1 gesetzt werden.

no_create_root	1

Aufbewahrungszeiträume

Mittels des Schlüssels retain (früher interval) wird die Aufbewahrungsdauer der verschiedenen Backups definiert.

#retain		hourly  6
retain		daily   7
retain		weekly  4
retain		monthly 6

In diesem Beispiel werden keine stündlichen Backups erstellt (zu erkennen an dem Kommentierungszeichen #). Von den täglichen Backups werden 7 gespeichert, was also bei einem System, das wirklich jeden Tag ein Backup macht, genau einer Woche entspricht. Von den wöchentlichen Backups werden 4 und von den monatlichen 6 gespeichert. Das neuste zur Verfügung stehende Backup ist daher von heute bzw. gestern, das älteste von vor einem halben Jahr.

Es werden immer erst die definierten Sicherungen ausgeführt, bevor die nächste Stufe initiiert wird. Das bedeutet, dass der Versuch rsnapshot mit rsnapshot monthly aufzurufen, so lange scheitert, solange nicht alle definierten und nicht auskommentierten Vorabsicherungen mindestens einmal durchlaufen wurden.

Da rsnapshot ein inkrementelles Backup mit platzsparenden Hardlinks macht, können, je nach Menge der veränderten Daten, sehr viele Backups aufgehoben werden.

Logausgaben und -datei

Die Standardeinstellungen für das Logverhalten von rsnapshot sind für bereits laufende Systeme optimiert. In der Konsole werden nur Fehler ausgegeben, eine Logdatei wird gar nicht erzeugt. Diese Einstellungen sind allerdings gerade beim Einrichten eines Backups sehr hinderlich, da man keine Informationen bekommt, ob rsnapshot gerade etwas tut und vor allem was es tut. Für die ersten Testläufe sind die folgenden Einstellungen sinnvoll, diese können bei Bedarf nach den ersten erfolgreichen Backups wieder auf den Originalzustand zurückgesetzt werden.

verbose		4
loglevel	4
logfile		/var/log/rsnapshot

Verzeichnisse/Dateien ein- und ausschließen

Je nachdem, welche Verzeichnisse gesichert werden sollen, empfehlen sich die folgenden excludes (Achtung: die Leerzeichen hinter "exclude" müssen TABs sein!):

exclude Recycled/
exclude Trash/
exclude lost+found/
exclude .gvfs/          ## nur bis Ubuntu 12.04 erforderlich

Der Papierkorb (Recycled/ bzw. Trash/) sollte auf jeden Fall ausgenommen werden.

Achtung!

Das Verzeichnis ~/.gfvs muss zwingend ausgenommen werden, wenn man das Homeverzeichnis sichern will. Da das von rsnapshot verwendete rsync nicht die notwendigen Rechte hat, um in diesem Verzeichnis zu löschen, wird der Sicherungsvorgang sofort abgebrochen und die folgende Fehlermeldung ausgegeben.

rsync: readlink_stat("/home/user/.gvfs") failed: Permission denied (13)
IO error encountered -- skipping file deletion
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1057) [sender=3.0.6]

Weitere Informationen zu diesem Problem finden sich in diesem Beitrag im Forum.

Hinweis:

Die oben angegebenen Exclude-Parameter sind als Default-Parameter für alle definierten Backupvorgänge zu verstehen. Es können auch zu jedem einzelnen Backup-Eintrag Exclude-Parameter angegeben werden. Dies kann z.B. sinnvoll sein, wenn externe Systeme mit gleicher Verzeichnisstruktur gesichert, aber unterschiedliche Verzeicnisse vom Backup ausgeschlossen werden sollen. In diesem Fall sind die Default-Exclude-Angaben für dieses Backup nicht gültig.

Zu sichernde Verzeichnisse

In /etc/rsnapshot.conf wird in den Zeilen, die mit backup beginnen, angegeben, welche Verzeichnisse zu sichern sind. Seit Version 1.2 gilt dabei folgende Syntax:

backup   /home/        localhost/
backup   /etc/         localhost/
backup   /usr/local/   localhost/

Der zweite Parameter in jeder Zeile localhost/ stellt das Zielverzeichnis relativ zum Backup-Verzeichnis (snapshot_root) dar. Möchte man eine Datei aus einem Backup vor einer Woche wieder herstellen findet man diese entsprechend dem hier gezeigten Konfigurationsbeispiel unter: /var/cache/rsnapshot/weekly.1/localhost/.

Externen Server sichern

Zum Sichern externer ("remote") Verzeichnisse bietet sich der Zugang über SSH ohne Passphrase und mit einem dedizierten Backupnutzer an, der nur über beschränkte Rechte verfügt.

In einer Basiskonfiguration geht das auch direkt mit dem Rootuser, falls dieser nicht freigegeben ist [wie unter Ubuntu üblich], müssen dem Backupuser in der Sudoers-Datei sudo/Konfiguration die entsprechenden Befehle freigegeben werden.

Die Syntax innerhalb rsnapshot.conf lautet:

backup   backupuser@remotehost:/home/        remotehost/        exclude=/home/dir/to/exclude1,exclude=/home/dir/to/exclude2

Die optionalen Parameter "exclude" überschreiben die oben erwähnten globalen Exclude-Parameter.

Für den Betrieb über SSH muss noch die rsnapshot.conf angepasst werden. Zunächst muss die Unterstützung für SSH aktiviert werden.

Dazu muss man die entsprechende Zeile auskommentieren:

# Uncomment this to enable remote ssh backups over rsync.
#
cmd_ssh        /usr/bin/ssh

Außerdem muss noch der richtige öffentliche Schlüssel angegeben werden:

ssh_args        -o BatchMode=yes -i /home/backupuser/.ssh/id_dsa

In diesem Beispiel hat der backupuser ein eigenes Homeverzeichnis. Sicherer ist es, dem Benutzer keine eigenes Homeverzeichnis zuzuweisen, sondern ein Verzeichnis unter /var/.ssh/ einzurichten, in dem die Schlüssel gespeichert werden. Auf dieses wird dann in der rsnapshot.conf verwiesen.

Hinweis:

Falls zu dem Server noch nie zuvor eine SSH-Verbindung aufgebaut wurde, wird das zunächst ohne Fehlermeldung fehlschlagen, da dem Server nicht vertraut wird und die entsprechende Eingabeaufforderung durch BatchMode=yes unterdrückt wird.

Man kann aber einfach den ersten Sicherungslauf ohne diese Option starten, oder sich mit dem selben Benutzer, der danach für das Backup verwendet wird, manuell via SSH anmelden und die Identität des Servers bestätigen.

Wenn man mehrere Server sichern möchte - jeden in ein eigenes Unterverzeichnis - dann kann es sinnvoll sein, dedizierte rsnapshot.conf-Dateien aufzusetzen, die dann getrennt per Cron aufgerufen werden.

Dafür müssen die Konfigurationsdateien an rsnapshot mit der folgenden Syntax übergeben werden:

rsnapshot -c /PFAD/ZUR/KONFIGURATION/rsnapshot_conf1.conf  

Zum einen können die Jobs dann getrennt aufgerufen werden, zum anderen kann dann auch der Backup über verschiedene "mountpoints" verteilt werden, da man pro rsnapshot.conf den Parameter snapshot_root unterschiedlich belegen kann.

Beispiele:

  • snapshot_root   /mnt/backup_SvrGrp1/

  • snapshot_root   /mnt/backup_SvrGrp2/

Fortschritt im Überblick behalten

Wenn man sich auf den Server, auf dem rsnapshot läuft, nur über SSH einloggt und trotzdem den Fortschritt im Auge behalten möchte, belastet das Öffnen mehrerer SSH-Verbindungen den Server unnötig. Außerdem ist das Terminal nach Schließen der SSH-Verbindung natürlich nicht mehr vorhanden. Eine Alternative ist die Nutzung von Screen, was es ermöglicht, das Fenster in den Hintergrund zu legen oder bei Bedarf auch zu "detachen", so dass die Verbindung geschlossen werden kann und bei einem späteren Wiederaufruf der SSH-Verbindung das Ausgabefenster wieder aufgerufen werden kann.

Die Steuerung des Outputs ist über den Verbose-Parameter von rsnapshot.conf unproblematisch möglich.

Nach Konfigurationsänderungen

Nach der Anpassung der Konfigurationsdatei sollte geprüft werden, ob diese noch valide ist. Das erledigt der Befehl

rsnapshot configtest 

Um einen Durchlauf von rsnapshot zu simulieren, ohne wirklich Daten zu sichern, wird rsnapshot mit dem Parameter -t ausgeführt, z.B.

rsnapshot -t daily 

Ausführung

Von Hand

Aufgerufen wird rsnapshot dann im Terminal [3] mittels

sudo rsnapshot hourly 

oder eben daily bzw. wie man es wünscht.

cron (für Server)

Wenn man einen Server mittels rsnapshot sichern möchte, so empfiehlt sich die Verwendung eines Cronjobs. Dieser läuft in den gewünschten Intervallen immer zu einem festen Zeitpunkt und stößt somit das inkrementelle Backup an. Um rsnapshot mittels Cron zu starten, muss z. B. die Datei /etc/crontab erweitert werden.

0 2 * * * root /usr/bin/rsnapshot daily
0 5 * * 1 root /usr/bin/rsnapshot weekly
0 7 1 * * root /usr/bin/rsnapshot monthly

anacron (für Desktops)

Das Cronjob-System ist auf Desktop-Systemen, also auf Rechnern, die nicht ununterbrochen laufen, nicht zu empfehlen, da Cronjobs immer zu festen Zeitpunkten ausgeführt werden. Ist der Zeitpunkt verstrichen und der Rechner war nicht eingeschaltet, wird die entsprechende Sicherung nicht durchgeführt. Daher sollte man für Desktop-Systeme auf Anacron zurückgreifen. Das garantiert, dass beispielsweise Jobs, die einmal täglich ausgeführt werden sollen, auch ausgeführt werden, wenn der Rechner zu der in der crontab angegeben Zeit nicht läuft.

Anacron-Jobs werden, im Gegensatz zu Cron, nicht in eine Datei eingetragen, sondern die Befehle werden in Dateien geschrieben und in entsprechenden Verzeichnissen abgelegt. Auf diese Weise wird zum Beispiel die Aktualisierungsverwaltung von Ubuntu gestartet.

Wenn man rsnapshot täglich von anacron aufrufen lassen will, in der Standardkonfiguration immer 5 Minuten nach dem Systemstart, erzeugt man in einem Editor mit Root-Rechten eine Datei mit beliebigem Namen, in unserem Beispiel rsnapshot, im Verzeichnis /etc/cron.daily/. In dieser Datei trägt man den Shebang, gefolgt vom rsnapshot-Aufruf ein.

1
2
#!/bin/sh
/usr/bin/rsnapshot daily

Die Datei speichern und den Editor wieder verlassen. Anschließend muss die Datei mit den Rechten von anacron ausführbar sein. Dazu verwendet man den chmod-Befehl.

sudo chmod 755 /etc/cron.daily/rsnapshot 

Für eine wöchentliche und monatliche Ausführung geht man wie oben beschrieben vor, tauscht jedoch cron.daily gegen cron.weekly oder cron.monthly. Der Ausdruck im rsnapshot-Befehl muss nicht zwangsläufig getauscht werden, die Intervallnamen haben hier nur symbolischen Charakter. Aus Gründen der Verständlichkeit ist eine Änderung hier natürlich auch sinnvoll, allerdings nur, wenn dem in der Konfiguration von rsnapshot auch entsprechend Rechnung getragen wird.

Wiederherstellung

Wiederherstellung als Root ist natürlich ganz einfach. Wenn jedoch die gesicherten Dateien der Nutzer selbst rücksichern soll?

Die erzeugten Verzeichnisse sind für den Standardnutzer nicht selbsterklärend (hourly.0/server/mnt/etc., usw.). Es liegt also nahe, entweder im Linux-Filesystem symbolische Verknüpfungen ("symlinks") mit selbsterklärenden Namen auf die rsnapshot-Verzeichnisse zu erzeugen, oder dasselbe in Samba zu tun und den Nutzern dann auf "ihre" Verzeichnisse Leserechte zu geben. Dann kann jeder Nutzer seine Daten einfach zurücksichern.

Funktionsweise der Sicherung

Für das folgende Beispiel gilt, dass stündlich gesichert wird und die Aufbewahrungszeit 6 Stunden beträgt. In der /etc/rsnapshot.conf steht also als Intervall:

retain	hourly 6

Das Zielverzeichnis ist standardmäßig /var/cache/rsnapshot/. Das Backup mit dem kleinsten Sicherungsintervall (hier: hourly) und der 0 ist immer das aktuellste. In dem Beispiel also /var/cache/rsnapshot/hourly.0/. Als Erstes wird die Lock-Datei angelegt, um gleichzeitige Aufrufe von rsnapshot zu verhindern. Dazu wird lediglich die Prozess-ID in die Lock-Datei geschrieben (rsnapshot prüft beim Start, ob die Datei vorhanden ist):

echo [process-id] > /var/run/rsnapshot.pid 

Nun prüft rsnapshot, ob das älteste Backup vorhanden ist, wenn ja, wird dieses gelöscht. Das älteste Backup hat die höchste Zahl, abhängig von der als Intervall hinterlegten Aufbewahrungszeit.

rm -rf /var/cache/rsnapshot/hourly.5/  

Anschließend werden alle anderen Ordner (mit Ausnahme von /var/cache/rsnapshot/hourly.0) inkrementiert, also die Zahl im Ordnernamen erhöht.

mv 	/var/cache/rsnapshot/hourly.4/	 /var/cache/rsnapshot/hourly.5/ 
mv 	/var/cache/rsnapshot/hourly.3/	 /var/cache/rsnapshot/hourly.4/ 
mv	/var/cache/rsnapshot/hourly.2/	 /var/cache/rsnapshot/hourly.3/ 
mv 	/var/cache/rsnapshot/hourly.1/	 /var/cache/rsnapshot/hourly.2/  

Im Anschluss daran wird hourly.0 nach hourly.1 per Hardlink kopiert.

cp -al /var/cache/rsnapshot/hourly.0 /var/cache/rsnapshot/hourly.1 

Nun erfolgt die eigentliche Sicherung in den Ordner hourly.0 (Der Befehlsaufbau kann je nach Konfiguration abweichen):

rsync -a --delete --numeric-ids --relative --delete-excluded \
  --exclude=/home/BENUTZERNAME/.gvfs /home \
  /var/cache/rsnapshot/hourly.0/localhost/ 

Jetzt wird der Zeitstempel des Ordners aktualisiert:

touch /var/cache/rsnapshot/hourly.0/ 

Zum Abschluss wird die Lock-Datei wieder gelöscht:

rm -f /var/run/rsnapshot.pid 

Diese Revision wurde am 17. Mai 2019 14:37 von OliverWieland erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Datensicherung, Backup, Sicherheit