# Rdiff-backup

rdiff-backup ist eine für Linux und Windows entwickelte Datensicherungssoftware, mit der inkrementelle Backups erstellt werden können.

## Besonderheiten

Die Besonderheit von rdiff-backup besteht darin, dass neue oder geänderte Dateien jeweils in die Vollsicherung eingepflegt werden, während ältere und gelöschte Dateiversionen als Inkremente (sogenannte „reverse deltas“) gespeichert werden. Die Vollsicherung ist bei rdiff-backup jederzeit als normales Verzeichnis zugänglich – die Wiederherstellung des zuletzt gesicherten Datenbestandes kann also durch einen simplen Kopiervorgang geschehen – von Hand, oder mittels cp oder rsync. Frühere Dateiversionen oder Datenbestände müssen mittels rdiff-backup selbst wiederhergestellt werden.
Im Gegensatz dazu muss bei üblichen inkrementellen Backups, welche „forward deltas“ verwenden, der aktuelle Datenbestand mittels Inkrement-Dateien rekonstruiert werden, und nur der Datenbestand, der während der letzten Vollsicherung vorlag, kann unkompliziert wiederhergestellt werden.
rdiff-backup unterstützt auch die Sicherung auf Netzwerk-Server. Um neue Dateien bzw. neue Dateiversionen zu erkennen, verwendet rdiff-backup den Dateinamen, den Dateityp, die Dateigröße, die Änderungszeit (mtime) und die Dateiberechtigungen. Eine Prüfsumme wie SHA-1 wird nicht verwendet. Aus diesem Grund kann rdiff-backup etwa keine VeraCrypt-Containerdateien sichern, da die Dateigröße und Änderungszeit nicht verändert wird, um die Datei besser verbergen zu können. rdiff-backup verwendet den Algorithmus von rdiff (respektive rsync), um die geänderten Teile von Dateien zu erkennen und den Unterschied als Inkrement-Datei abzulegen.

### Übersicht über die Inkrement-Dateien

Im Backup-Verzeichnis (/rdiff-backup-data/increments) findet man für die Inkremente folgende Datei-Endungen – "Datum" entspricht jeweils der Zeitangabe, und "gz" steht für eine mit gzip komprimierte Datei:
* .Datum.missing für eine Datei oder ein Verzeichnis, welches zum Zeitpunkt des Backups noch nicht existiert hat. Dies ist jeweils eine leere Datei mit 0 bytes Größe.
* .Datum.diff.gz für eine Datei, die sich seit dem letzten Backup geändert hat.
* .Datum.snapshot.gz für eine Datei, die seit dem letzten Backup gelöscht oder verschoben wurde. Diese kann ohne Umschweife für die Wiederherstellung der Datei verwendet werden (siehe unten).
* .Datum.dir für ein Verzeichnis, dessen Inhalt sich seit dem letzten Backup verändert hat.

### rdiff-backup-fs

Mit einem Werkzeug namens rdiff-backup-fs ist es möglich, das gesamte Backup als Laufwerk zu mounten. Es erscheinen dann entweder eine bestimmte Anzahl Verzeichnisse, die den damaligen Quellverzeichnissen zu den jeweiligen Inkrement-Zeitpunkten entsprechen – mittels einer Option kann man das Backup aber auch so mounten, dass die derzeit aktuelle Vollsicherung angezeigt wird – aber mit sämtlichen Dateiversionen, wie sie zu jedem Inkrement-Zeitpunkt existierten. Auf diese Weise kann der Benutzer – wie bei rsnapshot – auf "Schnappschüsse" des Datenbestandes direkt zugreifen.

## Anwendungsbeispiele
### Backup

Das Backup wird einfach mittels rdiff-backup -v N --print-statistics Quellverzeichnis Backupverzeichnis durchgeführt. Je nachdem muss man sudo voranstellen, damit auch Dateien kopiert werden, für die der angemeldete Nutzer keine Zugriffsberechtigungen besitzt. -v N und --print-statistics geben zusätzliche Informationen über den Backup-Vorgang an und können weggelassen werden. N ist eine Zahl von 0 bis 9.
rdiff-backup --exclude AusgeschlossenesVerzeichnis Quellverzeichnis Backupverzeichnis schließt ein bestimmtes Verzeichnis von den Backups aus. Dies kann zum Beispiel beim Browser-Cache sinnvoll sein.
Das Backup kann mittels --no-fsync massiv beschleunigt werden, indem rdiff-backup die Daten ohne Verzögerung auf das Sicherungsmedium schreibt, wobei aber die Gefahr von Datenverlusten höher ist.
Die Problematik von Dateien, deren Größe und Bearbeitungsdatum trotz einer Änderung des Inhalts dieselben bleiben, kann wie folgt umgangen werden: rdiff-backup --compare-full Quellverzeichnis Backupverzeichnis vergleicht die Dateien im Quellverzeichnis und Backup bitweise, oder rdiff-backup --compare-hash Quellverzeichnis Backupverzeichnis vergleicht die Dateien mittels SHA-1-Prüfsummen. Ein Backup findet dabei aber nicht statt. Im Quellverzeichnis kann die Änderungszeit der betroffenen Dateien sodann mit touch auf die aktuelle Zeit umgestellt werden, und so wird die Datei dann vom nächsten Backup erfasst.

### Entfernung alter Backups

rdiff-backup kann nur die ältesten Inkremente des gesicherten Verzeichnisses löschen. Dies geschieht mit rdiff-backup --remove-older-than X Backupverzeichnis, wobei X entweder ein Datum ist (z. B. 2014-12-12), eine Zeitspanne wie 5D (für "fünf Tage") oder 1M (für "einen Monat"), oder die Nummer der Sicherung (--remove-older-than 10B belässt die 10 jüngsten Sicherungen).
Bislang ist es nicht möglich, nur spezifische Dateien/Verzeichnisse und deren gesicherten früheren Versionen aus dem Backup zu löschen. Eine solche Funktion wurde für die Version 2.2 von rdiff-backup angekündigt.

### Wiederherstellung

Die Wiederherstellung beliebiger gesicherter Verzeichnisse und Dateien geschieht mit rdiff-backup -r Zeit Backup Ziel. „Zeit“ ist beispielsweise „now“, oder eine Zeit-, Datums- oder Versionsangabe (analog zur Entfernung alter Backups, siehe oben). Noch einfacher ist es für die Wiederherstellung des letzten Sicherungsstandes rsync -a --delete Backup Ziel oder cp -a --remove-destination Backup Ziel zu verwenden. Die Benutzerrechte werden dabei aber nur dann korrekt wiederhergestellt, wenn rdiff-backup auf jenem Computer lief, an welchem auch das Sicherungsmedium angeschlossen war (z. B. externe Festplatte auf dem Privatcomputer, vgl. Sicherung über das Netzwerk, wobei rdiff-backup auf einem externen Rechner läuft).
Gezielt und relativ einfach lässt sich eine alte Datei oder ein älteres Verzeichnis wiederherstellen, wenn man im Verzeichnis /rdiff-backup-data/increments des Backup-Verzeichnisses die entsprechende Inkrement-Datei ausfindig macht:
rdiff-backup Inkrementdatei Zielverzeichnis rdiff-backup Inkrementdatei Zieldatei
Dies gelingt mit allen Inkrementdateien – außer mit solchen, welche die Dateiendung ".missing" tragen. Diese Inkrementdatei zeigt bloß an, dass eine Datei beziehungsweise ein Verzeichnis zum angegebenen Zeitpunkt nicht existiert hatte.
Die Wiederherstellung einer gelöschten Datei geschieht sogar noch einfacher: Hierzu muss man die Inkrement-Datei mit der Dateiendung ".snapshot.gz" ausfindig machen, ins gewünschte Verzeichnis hinüberkopieren, mit gzip entpacken, und den Dateinamen anpassen (etwa "Lebenslauf.doc.2014-10-10T09:23:50+02:00.snapshot" zu "Lebenslauf.doc" umbenennen).

### Statistiken

rdiff-backup-statistics Backupverzeichnis gibt verschiedene Statistiken an, wie zum Beispiel die Angabe jener Verzeichnisse, welche sich über alle Backups hinweg am stärksten verändert hatten.
rdiff-backup -l Backupverzeichnis zeigt das Datum der Vollsicherung als auch der Inkremente an. Für die (kumulativen) Dateigrößen der verschiedenen Inkremente kann man schließlich rdiff-backup --list-increment-sizes Backupverzeichnis benutzen.