Kategorien

Windows Backup mit robocopy

Im Laufe der Zeit sammeln sich viele Daten auf einem Rechner an. Die meisten davon möchte man natürlich auch vor Verlust schützen (z.B.: durch versehentliches Löschen oder Festplattendefekte). Die einfachste Möglichkeit ist, diese Daten zusätzlich auf einer externen USB-Festplatte zu sichern.

Man muss aber nicht gleich Geld für eine Backupsoftware ausgeben.
Windows gibt uns hier von Haus aus einige Mittel an die Hand, um Dateien zu sichern. Bei XP gab es noch das schöne Backup-Programm, welches ab Vista in die „Datensicherung“ geändert wurde, das mir persönlich weniger gefällt.
Soweit will ich hier aber erstmal nicht einsteigen, sondern eher Standard-Befehle zeigen, um Daten manuell zu sichern.
Ich bin der Meinung, dass es wesentlich wichtiger ist sich Gedanken darüber zu machen, welche Daten man wie sichern möchte. Denn nur so erkennt man die Vor- und Nachteile der unterschiedlichen Variationen und kann dann auch Optionen in Softwarepaketen für Backups besser verstehen.

Copy/Xcopy

Das einfachste ist der „copy“-Befehl, oder der besser geeignete „xcopy“-Befehl, in der Konsole.
Möchte man eine komplette Verzeichnisstruktur sichern, genügt der Befehl

Winback1-01
Damit würden alle Dateien und Verzeichnisse auf das Ziellaufwerk/Zielverzeichnis kopiert und man erhält eine 1:1 Kopie der Daten.

Führt man diesen Befehl ein weiteres man aus, werden alle Dateien wieder kopiert, vorhandene Dateien aber nicht überschrieben.

Winback1-02
Mit dem Parameter /Y würde man dann auch nicht mehr gefragt, ob die schon vorhandene Datei überschrieben werden darf.

Winback1-03

Da alle Dateien immer wieder kopiert werden, dauert es natürlich auch sehr lange, bis eine Sicherung erfolgt ist.
Besser wäre da schon ein „intelligentes“ Kopieren, bei dem vorhandene Dateien einfach ausgelassen werden.

robocopy

Hier kann man den Befehl „robocopy“ verwenden, welcher ab Vista fester Bestandteil von Windows ist. Bei XP musste dieser Befehl noch mit dem „Windows Ressource Kit 2003“ nachinstalliert werden.

Der obige Befehl würde mit robocopy so aussehen

winback1-07

Wird dieser Befehl ein weiteres Mal ausgeführt, so werden nur neue und geänderte Dateien übertragen, alle gleichen Dateien werden ausgelassen.
winback1-08

Verwendet man, anstelle des Parameters „/S“, den Parameter „/E“, werden auch leere Verzeichnisse mit kopiert (In diesem Fall würde der Ordner „Leerer Ordner“ ebenfalls auf das Ziel-Laufwerk übertragen).

winback1-08b

Kopieren oder Synchronisieren?

Der Vorteil beim Kopieren von Dateien besteht darin, dass gelöschte Dateien im Quelllaufwerk weiterhin auf der Backupfestplatte erhalten bleiben.
winback1-09

Der Nachteil beim Kopieren von Dateien besteht darin, dass gelöschte Dateien im Quelllaufwerk weiterhin auf der Backupfestplatte erhalten bleiben.
(Nein, das ist kein Copy/Paste-Fehler. Ob dieses Verhalten ein Vor- oder Nachteil ist, liegt nämlich im gewünschten Verhalten.)

Wird eine Datei versehentlich gelöscht, so bleiben die Dateien auf der Backupfestplatte erhalten und man kann diese wiederherstellen.
Wird aber eine Datei absichtlich gelöscht oder umbenannt, so wird diese Änderung als „neue Datei“ interpretiert und ein weiteres Mal auf Backupfestplatte geschrieben, wodurch zusätzlicher Speicherplatz benötigt wird. Somit kann es passieren, dass auf der Backupfestplatte mehr Speicherplatz belegt ist, als die >aktuellen< Daten auf dem Ziellaufwerk benötigen.

Möchte man nur eine 1:1 Kopie der vorhandenen Dateien haben, so kann man die Daten auch synchronisieren. Das bedeutet, dass nicht nur neue Dateien auf das Backuplaufwerk kopiert werden, sondern auch Dateien, welche im Quelllaufwerk nicht mehr vorhanden sind, auf dem Backuplaufwerk gelöscht werden.
Verantwortlich hierfür ist der Parameter „/PURGE“

winback1-10

Dadurch vermeidet man einerseits Datenmüll, aber verliert auch an Datensicherheit.
Versehentlich gelöschte Dateien auf dem Rechner werden jetzt nämlich auch im Backup gelöscht und sind dadurch verloren.
Anstatt der Parameter „/E /PURGE“ kann auch „/MIR“ verwendet werden, welches den gleichen Effekt hat. Naja, zumindest fast den gleichen Effekt, denn während bei der Verwendung von „/E /PURGE“ die Sicherheitseinstellungen eines bereits vorhandenen Zielverzeichnisses nicht geändert werden, wird dieses bei „/MIR“ ebenfalls angepasst.

Möchte man einen Befehl erstmal testen, so kann mit „/L“ (List only) erst ein Trockenlauf ausgeführt werden, bei dem nicht wirklich kopiert wird. So kann man die Aktion vorab überprüfen.

Mit diesem kleinen Befehl kann man so schon seine Daten sichern.
Robocopy bietet aber noch viel mehr Einstellungen.

 

Hier noch ein paar weitere Parameter von robocopy, welche durchaus nützlich sein könnten.

Bisher kopiere ich Verzeichnisse mit /E, oder synchronisiere diese mit /E /PURGE oder /MIR.

Möchte man nun Dateien eines bestimmten Types kopieren, so kann man dies auch angeben.
In diesem Beispiel werden nur „doc“-Dateien synchronisiert.

Möchte man Dateien hingegen „doc“-Dateien auslassen, so kann dies mit dem Parameter /XF (eXclude File) angeben

Oder man kann ganze Verzeichnisse mit /XD (eXclude Directory) auslassen

Möchte man mehrere Dateien oder Verzeichnisse auslassen, so werden diese einfach hintereinander, durch ein Leerzeichen getrennt, angegeben.
Ebenfalls ist die Angabe von Wildcards möglich.
Am Beispiel sollen zwei Verzeichnisse und ein paar Systemfiles ausgelassen werden.

Problem Samba-Share

Ich hatte das Problem, dass beim Kopieren von Dateien auf eine Samba-Freigabe meines Linux-Servers, die Dateien immer wieder kopiert wurden.
Verantwortlich hierfür ist das Handling der Zeitangaben der Dateien (FAT-Uhrzeitangaben). Mit dem Parameter „/FFT“ wird hier eine Differenz von 2 Sekunden akzeptiert und damit funktioniert das Kopieren der Dateien wieder ohne Probleme.

Gesperrte Dateien

Dateien, welche zum Zeitpunkt des Kopieren/Synchronisieren geöffnet sind oder für die man keine Zugriffsrechte hat, können nicht kopiert werden. Robocopy wartet hier im Standard 30 Sekunden und wiederholt den Versuch 1000000 mal.
Zum Kopieren kann hier der Wert für die Wartezeit (/W) und die Wiederholungen (/R) auf andere Werte gesetzt werden. Auch der Wert 0 kann gesetzt werden, so wird bei einem Fehler sofort mit der nächsten Datei fortgefahren.
Im Beispiel habe ich mir für die „Datei 2.TXT“ die Rechte entzogen und versuche diese zu kopieren.

winback2-01

winback2-02
Wie man sieht, wird jetzt der Fehler übersprungen und der Befehl ohne Unterbrechung weiter ausgeführt. Die „Datei 2.TXT“ wird nicht kopiert, da mir dazu ja die Rechte fehlen.

Kopieren von Dateien ohne Berechtigung

Wenn ich eine Datei nicht kopieren kann, weil mir die Rechte dazu fehlen, kann man dies dennoch mit dem Parameter „/B“ (Backupmodus) erzwingen. In diesem Fall greifen die Berechtigungen des Filesystems. Ich muss also im Filesystem des Quell- und Ziel-Laufwerks administrative Schreibrechte besitzen.
Dazu starte ich den Robocopybefehl als Administrator und führe den folgenden Befehl aus.

winback2-03b

Jedoch kann ich diese kopierte Datei im Ziel öffnen, da ich die Sicherheitsangaben der Datei nicht mit kopiert habe und damit alle hinterlegten Zugriffsrechte auf die Standardrechte des Filesystems gesetzt werden.
winback2-05

Zugriffsrechte (ACL´s) mit kopieren

Man kann auch die ACL´s der Dateien mit sichern, was allerdings ein Ziel-Laufwerk mit NFTS (Windows) oder eine SAMBA-Freigabe mit ACL (Linux) voraussetzt.
Hierzu muss der Befehl um die Angabe von „/SEC“ erweitert werden. Dieser Parameter benötigt zusätzlich noch die Angabe, welche Sicherheitsparameter mit kopiert werden sollen. Ein „/COPYALL“ kopiert alle Angabe, mit „/COPY:xxx“ können diese einzeln angegeben werden:
D=Daten
A=Attribute
T=Zeitstempel
S=Sicherheit (NTFS-ACL´s)
O=Besitzerinformationen
U=Überwachungsinformationen
Die Standardangabe ist hier /“COPY:DAT“

Beispiel mit copyall

winback2-06b

Der Parameter „/SECFIX“ kopiert keine Dateien, sondern korrigiert die Sicherheitsangaben der Dateien im Zielverzeichnis.
Im obigen Beispiel mit dem Parameter „/B“, wo ich ohne die „/SEC“-Angabe kopiert habe, könnte ich so die Dateirechte im Ziel-Laufwerk korrigieren.
Auch hier ist die Angabe der „Copy“-Flags notwendig.

winback2-08

Paralleles Kopieren

Robocopy kopiert seriell; das bedeutet, dass die Dateien nacheinander kopiert werden. Man kann aber auch Kopiervorgänge parallel starten. Dazu benutzt man den Parameter „/MT“ (Multithread). Im Standard wird hier „/MT:8“ verwendet, also 8 parallele Kopiervorgänge. Hier können Zahlen von 1-128 angegeben werden, aber man sollte bedenken, dass parallele Zugriffe auf Datenträger oder parallele Datenstreams über das Netzwerk die Leistung beeinträchtigen können.
Hier gilt: Ausprobieren, welche Werte zum verwendeten System passen.

Augabe loggen

Möchte man die Ausgabe von robocopy dokumentieren, z.B.: weil ein Backup unbeobachtet über Nacht läuft, gibt es den Parameter „/LOG:“.
Während „/LOG:“ die Logdatei überschreibt, wird mit „/LOG+:“ die Logdatei jedes Mal um die Ausgabe erweitert.
Möchte man die Ausgabe protokollieren UND auch im Konsolenfenster die Ausgabe sehen, so kann noch der Parameter /“TEE“ angehängt werden.
Leider lässt sich diese Ausgabe nicht weiter durch eine Angabe eines Trennzeichens parametrisieren. Es werden einfach Leerzeichen zwischen die Angaben gestellt.
Beeinflussen kann man die Ausgabe nur noch, indem man Ausgabewerte unterdrückt.
Ein kleiner Auszug aus „robocopy /?“ :
/NJH Unterdrückt die Kopfdaten (Angabe der Parameter).
/NJS Unterdrück die Zusammenfassung am Ende
/FP Schließt den vollständigen Pfadnamen von Dateien in die Ausgabe ein
/NS Unterdrückt die Dateigröße
/NC Gibt keine Dateiklasse aus (NEUER, GEÄNDERT, EXTRA DATEI usw)
/NFL Verhindert die Ausgabe der Dateien
/NDL Unterdrück die Verzeichnisangaben
/NP unterdrückt die Prozentangabe des Kopierfortschrittes.

Ein weiterer interessanter Aspekt ist die Möglichkeit, robocopy in einer Dauerschleife, oder zeitgesteuert laufen zu lassen.

Man kann hierfür die Parameter „/MOT:“ (Monitor <Time> ) und „/MON:“ (Monitor N <Anzahl geänderter Dateien> ) angeben, bzw. eine Kombination aus beiden Parametern.
Soll robocopy automatisch wieder gestartet werden, wenn sich mehr als 20 Dateien geändert haben so würde der Parameter „/MON:20“ lauten.

winback3-01
Soll der Robocopy-Befehl jeweils eine Stunde nach dem letzten Lauf ausgeführt werden, so geht dies mit /MOT:60

winback3-02
Aber Achtung:
Hier wird eine Stunde gewartet, nachdem der letzte Lauf abgeschlossen wurde. Es läuft demnach nicht jede Stunde, sondern eine Stunde nach dem Ende des letzten Kopiervorgangs.

Angabe von Sperrzeiten

Um, z.B.: bei einer Firma, nicht in die Produktivzeit eines Server zu fallen, kann man mit dem Parameter /RH (Run Hours) auch einen Zeitbereich angeben, in dem Robocopy ausgeführt werden darf.
Die Angabe erfolgt als Startzeit-Endezeit. Die Zeit wird 4stellig im 24h-Format angegeben.
„/RH:1800-0600“ würde demnach das Kopieren zwischen 18Uhr Abends bis 6Uhr Morgens erlauben.

winback3-03
Aber auch hier gibt es wieder eine Stolperfalle.
Würde der obige Kopierbefehl um 5:59h ausgeführt werden, so ist es noch im erlaubten Zeitbereich und robocopy startet – egal wie lange es für das Kopieren benötigen würde.
Damit dies nicht passiert gibt den Parameter „/PF“ (per File).
Damit kontrolliert robocopy nach JEDEM kopierten File, ob es sich noch im erlaubten Zeitbereich befindet oder nicht.

Ist es außerhalb des erlaubten Zeitbereiches, wird das Kopieren angehalten und bei Eintritt in den erlaubten Zeitbereich an der unterbrochenen Stelle wieder fortgeführt.

Klingt schon mal nicht schlecht, hat aber noch immer das Problem, dass ein begonnener Kopiervorgang noch fertig gestellt wird.
Das bedeutet, bei obigen Beispiel: würde eine 40GB große Datei um 5:59h gestartet, wird diese auch noch fertig kopiert, da sie innerhalb der Sperrzeit gestartet wurde.
Es gibt noch ein weiteres Problem.
Würde robocopy am Ende des erlaubten Zeitbereiches stoppen, läuft er dann bei Eintritt in den erlaubten Zeitbereich weiter. Wird aber der Kopiervorgang, z.B.: durch eine Aufgabenplanung, jeden Tag angestoßen, laufen der neue UND der unterbrochene robocopy-Task parallel. Vermutlich würde dann der neue Task irgendwann den Task vom Vortag einholen und dann beide Tasks auf die gleichen Dateien zugreifen – was einen Konflikt erzeugt.

Die bessere Alternative wäre hier, bei der Aufgabenplanung nicht nur die Startzeit anzugeben, sondern ebenfalls auch, wann die Aufgabe beendet werden soll (Option: „Aufgabe beenden, falls Ausführung länger dauert“). Hier darf nicht vergessen werden, auch die Option „Beenden der aktiven Aufgabe erzwingen, falls die Aufforderung nicht beendet wird“ zu aktivieren.
Somit wird der Kopiervorgang definitiv beendet.
Jedoch beginnt er bei einem Neustart wieder von Vorne, womit, wenn der Zeitbereich regelmäßig nicht ausreicht, nicht alle Daten kopiert werden.
Hier empfiehlt es sich mehrere Kopiervorgänge parallel zu starten, z.B.: in Abhängigkeit der Dateigröße.

Angabe von Dateigrößen

Mit „/MIN:Bytes“ wird die minimale, mit „/MAX:Bytes“ die maximale Dateigröße in Bytes angegeben.
Möchte man nur Dateien bis 1GB (1024*1024*1024Bytes) kopieren, so könnte der Befehl so aussehen

Für Dateien Größer 1GB wäre der Befehl

Achtung !
„/MIR“: kopiert auch die komplette Verzeichnisstruktur.
winback3-04
Werden diese Befehle parallel ausgeführt, so lassen sich „große“ Dateien parallel zu den „kleinen“ Dateien kopieren und so könnte der komplette Kopiervorgang evtl. in der vorgegebenen Zeit fertiggestellt werden.
Ein anderer Ansatz wäre, dass sehr große Dateien nur über ein Wochenende kopiert werden und unter Woche unbeachtet bleiben.

Ein weiterer Parameter um die Anzahl der Dateien zu begrenzen, ist das Alter der Dateien.
Besitzt man z.B.: mehrere Datenbank-Dumps auf dem Quell-Laufwerk, benötigt aber nur die neuesten Dumps als Backup, so kann man mit „/MAXAGE:“ das Kopieren auf diese Tage begrenzen (Analog dazu gibt es „/MINAGE:“).
Die Angabe erfolgt als „Anzahl Tage“ oder als Datum (Format JJJJMMTT).
Kopiert nur Dateien, welche maximal 2 Tage alt sind:

Kopiert Dateien, welche gleich oder jünger als das angegeben Datum sind:

Bis jetzt ging es nur um das Kopieren/Synchronisieren von Dateien aus einem Quell- auf ein Ziellaufwerk.

Da unter NTFS Hardlinks möglich sind (siehe Hard-/Softlinks – Teil 3 (Windows): Junctions und symbolische Links gibt es auch noch.) sollte dies doch möglich sein – aber welche Hürden ich hier zu nehmen hatte, das wurde mir erst bei der Ausführung bewusst.

Drei Hinweise vorweg:
Hinweis 1:
Es gibt so eine Lösung bei Heise zum Download (rsyncBackup.vbs) , aber ich wollte das Ganze selber lösen. Ich finde einfach, wenn man sich eine Lösung selbst erarbeitet, lernt man die Mechanismen besser verstehen und lernt somit auch die Möglichkeiten und Funktionen von „Fremdsoftware“ einzuschätzen.
Hinweis 2:
Mein Anspruch an die Lösung:
Nutzen der Windows-Konsole
Nur Systembefehle verwenden (keine zusätzlichen Installationen)
Hinweis 3:
Es gab dann auch gleich ein riesen FAIL, weshalb es hier 2 Blogeinträge werden.

Pack ma´s oa (bayrisch).

Zuerst wurde das Ziellaufwerk präpariert.
Im Ziel-Laufwerk wurden 2 weitere Verzeichnisse angelegt: „orig“ und „archiv“. Wie bereits beim Linux-Backup realisiert, sollen die Dateien vom Quell-Laufwerk auf das Ziel-Laufwerk -> „orig“ synchronisiert, und diese Dateien dann per Hardlinks auf Ziel-Laufwerk -> „archiv“ -> „Datum“ verlinkt werden.
winback4-01

Schritt 1: Synchronisation
Somit war erstmal das Ausführen der Synchronisation nötig

winback4-02

Schritt 2: Präparieren des „Archiv-Ziels“
Da nur Dateien einen Hardlink besitzen können, muss im „Hardlink-Ziel“ die Verzeichnis-Struktur abgebildet werden.
Auch dazu nutzte ich robocopy

winback4-03

Schritt 3: Erzeugen der Hardlinks
Jetzt erzeuge ich die Hardlinks mit Hilfe einer For-Schleife
(Der Einfachheit halber habe ich das in einer Batchdatei mit dem Namen HL.bat realisiert.)

winback4-04
Bis hierher war es (relativ) einfach.

Aber ab jetzt ging es mit der Erfolgswelle erstmal steil bergab.

Ich habe im Quell-Laufwerk die Datei „Datei 2.TXT“ bearbeitet und dann eine weitere Synchronisation vom Quell-Laufwerk zum Ziel-Laufwerk „orig“ ausgeführt.
Da die Datei nun nicht mehr die gleiche Datei ist, bin ich – wie von Linux gewohnt – davon ausgegangen, dass diese Datei ersetz wird. Aber dem war nicht so.
winback4-05

Ergebnis des Lerneffektes (der nach einer kleinen Verwunderungsstarre einsetzte):
Windows ersetzt geänderte Dateien nicht im Ziel-Laufwerk, sondern updatet diese.
Klingt wenig spektakulär, macht aber einen riesigen Unterschied.
Während unter Linux eine Synchronisation mit rsync unterschiedliche Dateien im Ziel-Laufwerk als neue Datei (mit neuer, unabhängiger Inode) anlegt, wird unter Windows (egal ob mit robocopy, copy oder xcopy) die Datei mit der ursprünglichen FileID erneuert.
Das bedeutet, dass unter Linux die Verbindung von vorhandenen Hardlinks aufgelöst wird, unter Windows bleiben diese aber erhalten.

 

Quelle: https://krausens-online.de/