Idee für Backup-Tool
Seit einer ganzen Weile beschäftigt mich die Fragestellung, wie man am besten Backups von all seinen Rechner anfertigt. Diese Backups müssen natürlich endweder physisch beweglich gespeichert werden, damit man sie z.B. auch räumlich getrennt lagern kann. Oder aber, man sichert gleich alles über das Internet auf einem entfernten Rechner, der z.B. irgendwo in einem Rechenzentrum für diesen Zweck gemietet wurde.
Gerade bei Datensicherungen über langsame Netzwerkverbindungen muss man natürlich besonders die dabei zu übertragende Datenmenge im Auge behalten. Wenn man viele Rechner auf einen Backupserver sichern will, muss man auch sehr auf den absoluten Platzbedarf achten. Vor allem möchte man hier auch doppelt vorhandene Dateien nach Möglichkeit nur einmal aufbewahren müssen.
Was man eigentlich generell vom Backup-Tool seines Vertrauens erwartet:
- Inkrementelle Sicherung, damit nicht immer alles hin- und herkopiert werden muss
- Aufbewahren mehrerer Snapshots, damit man nicht nur eine Kopie hat, sondern eben auch noch den Stand von gestern, vorgestern und vor einem Monat.
- Die Sicherung muss wenigstens insofern platzsparend erfolgen, als dass Dateien, die sich nicht geändert haben, nicht erneut abgelegt werden.
- Besser wäre es, wenn das auch für verschobene bzw. umbenannte Dateien gilt, deren Inhalt gleich geblieben ist.
- Noch besser wäre es, wenn eine Datei selbst dann nur einmal abgelegt werden muss, wenn sie in verschiedenen Backupsets vorkommt, wenn also mehrere Rechner die inhaltlich gleiche Datei sichern wollen. Gerade wenn das ganze Betriebssystem mitgesichert wird, dürfte der Anteil der mehrfach vorhandenen Dateien recht groß sein.
- Wenn man auch Diskimages von virtuellen Maschinen (z.B. vmdk-Dateien bei VmWare) sichern will, wäre es sehr hilfreich, wenn man auch die Änderungen innerhalb einer einzelnen Datei inkrementell sichern könnte. Diskimages sind sehr groß, ändern sich aber gewöhnlich immer nur blockweise, so dass auch immer große Bereiche unverändert bleiben.
- Für Offsite-Backups muss man die gesicherten Dateien verschlüsseln können.
- Oftmals ist es auch wünschenswert, dass eine einfache Komprimierung der Dateien erfolgt. Bestimmte Dateitypen sollte man davon aber ausnehmen können, da sich eine Komprimierung nicht für alle Dateitypen lohnen wird.
Snapshots mit rsync
rsync bietet von Hause aus eine wunderbare Möglichkeit, platzsparend Snapshots zu speichern. Dabei werden dann nur neue oder geänderte Dateien kopiert. Für bereits im letzten Snapshot existierende Dateien legt rsync einfach einen Hardlink auf die bereits vorhandene Kopie an. Ändert sich jedoch der Pfad oder Name einer Datei, kann rsync keine Zuordnung mehr herstellen und legt eine neue Kopie an.
Apple verwendet in seiner TimemachineTM ebenfalls diesen Hardlink-Trick.
Noch mehr Platz sparen mit Message-Digests
Als ich mir den Chaos Radio Express-Podcast über das Versionsverwaltungssystem git anhörte, kam mir folgende Idee:
git hat nämlich ein ganz ähnliches Problem wie ein Backuptool: Es muss zum einen entscheiden, ob sich eine Datei gegenüber einer Vorgängerversion geändert hat, und es muss diese Datei sichern, falls sich der Inhalt geändert hat. In git wird dieses Problem auf eine sehr einfache und elegante Art und Weise gelöst. Für jede Datei wird einfach ein Hash-Wert (in diesem Fall sha1) berechnet. Im Repository wird der Inhalt der Datei dann in einer Datei abgelegt, deren Name dem Hash-Wert entspricht. Gibt es diese Datei bereits im Repository, wurde diese Version der Datei offensichtlich bereits gesichert. Oder aber es gibt bereits eine andere Datei, die genau den gleichen Inhalt hat. Auch in diesem Fall ist ja eine weitere Sicherung nicht mehr erforderlich. Somit müssen Datei auch nicht mehrfach gesichert werden, wenn sie unterschiedliche Namen oder Pfade haben.
Diese Idee habe ich in Form eines in Python geschriebenen Prototypen umgesetzt, den ich hier in Kürze vorstellen werde.