Engineering . Architecture . Design

Menu:

backup.bat

inkrementelle Backups mit Hardlinks

Lange Zeit habe ich intensiv nach einer zweckmäßigen Lösung für Sicherheitskopien meiner Festplatten gesucht. Viele Lösungen waren zu unflexibel oder so 'proprietär', dass ich kein Vertrauen darin hatte. Vollständige Backups sind unnötig und verschwenden viel Speicherplatz, da sich nicht jedesmal der gesamte Datenbestand ändert - inkrementelle Backups sind kompliziert zu handhaben, sofern im Ernstfall die Festplatte für einen bestimmten Zeitpunkt in der Vergangenheit rekonstruiert werden muss. Die Lösung bietet sich in der Form von Hardlinks an, die mit dem NTFS-Dateisystem ab Windows NT zur Verfügung gestellt werden. Hierdurch wird quasi lediglich eine zweite Instanz einer Datei erstellt - ohne dass damit zusätzlicher Speicherplatz verbraucht wird. Die Backup-Strategie sieht damit wie folgt aus:

  1. vollständiges Backup einer Festplatte mit allen Dateien erstellen
    ... danach für alle folgenden Backups ...
  2. Hardlinks auf das vorhergehende Backup für alle Dateien setzen, die sich seit dem vorhergehenden Backup nicht verändert haben
  3. kopieren aller neuen bzw. seit dem vorhergehenden Backup geänderten Dateien

Dieses Vorgehen verbindet die Vorteile von vollständigem und inkrementellem Backup: es liegt nach jedem Durchlauf ein vollständiges Abbild der Festplatte zu dem jeweiligen Zeitpunkt vor - allerdings wird dabei lediglich Speicherplatz für die neuen bzw. geänderten Dateien benötigt.

Informationsquellen

Weitere Informationen zu den Themen Backup und Hardlinks finden sich insbesondere unter den folgenden Quellen:

Der Batch-Programmierung unter Windows stehe ich mittlerweile durchaus nicht unkritisch gegenüber - zumindest für Aufagen, die einen entsprechenden Umfang erreichen. Manche Besonderheiten machen den Entwicklungsprozess nicht wirklich einfacher. Die fehlende Unterstützung für das Debugging - mir ist zumindest kein entsprechendes Tool bekannt - sollte in diesem Zusammenhang nicht unterschätz werden. Dafür war es umso interessanter, die Aufgabe wirklich 'old school' mit den vorhandenen Bordmitteln zu lösen. Hilfreich waren hierbei insbesondere die folgenden Seiten:

Batch

Das in der c't 9/2006 vorgestellte Skript 'rsyncBackup' war für mich nicht verwendbar, da Pfadangaben auf 260 Zeichen begrenzt sind, Junctions nicht berücksichtigt werden und die Verwendung von 'cygwin' bzw. 'rsync' auf meinem Rechner nicht ohne Umwege möglich war. Es lag also die Idee nahe, die Windows eigenen Bordmittel auszunutzen: Batch-Scripting unter Verwendung von 'fsutil' für die Verlinkung und dem hervorragenden Tool 'robocopy' (robust file copy) für das Kopieren der Dateien. Die Verifizierung der Sicherungskopie erfolgt im Anschluss durch den Aufruf von 'windiff'.

Einen ersten Eindruck über den Aufbau von 'backup.bat' liefert das Flussdiagramm. Das Skript selbst ist hinreichend kommentiert - wird das Skript ohne Parameter aufgerufen, wird eine kurze Hilfe zu den einzelnen Kommandozeilenoptionen ausgegeben.

Leerzeichen und Sonderzeichen in den Pfadangaben der für die Sicherungskopie vorgesehenen Dateien sind unkritisch - mit Ausnahme der Zeichen '!' und '%'. Diese kennzeichnen in der Batch-Programmierung die verwendeten Variablen und führen in den Pfadangaben zu entsprechenden Problemen. Mit Bordmitteln habe ich hierzu keine ansprechende Lösung gefunden - und proprietäre Batch-Erweiterungen wollte ich nicht verwenden. Unveränderte Dateien, die eines der genannten Zeichen in der Pfadangabe aufweisen, werden nunmehr nicht verlinkt, sondern im Rahmen des nachfolgenden Aufrufs von 'robocopy' kopiert. Sofern jemandem eine elegante Lösung für diesen Schönheitsfehler bekannt ist, würde ich mich über einen entsprechenden Hinweis freuen.

Disclaimer

Abschließend an dieser Stelle der Hinweis, dass obige Dateien 'as is' zur Verfügung gestellt werden. Ich rate dringend dazu, das Skript und die damit verbundenen Tools vor der Anwendung zu verstehen. Auch wenn das Skript äußerlich einen ordentlichen Eindruck vermittelt - es sollte nicht darüber hinwegtäuschen, dass es letztendlich von einem nicht-Fachmann erstellt wurde!