Dateiserver-Migrationen mit Robocopy Teil 1 von 2

Dieser Blog ist Teil 1 einer zweiteiligen Serie. Um Teil 2 zu sehen, klicken Sie hier.

Da in diesem Jahr die Unterstützung für verschiedene Varianten von Windows Server-Betriebssystemen ausläuft, habe ich eine ganze Reihe von Dateiserver-Migrationen von einem System auf ein anderes durchgeführt. Wenn auf dem Server keine anderen Rollen oder Funktionen als die eines Dateiservers installiert sind, kann ich manchmal einfach die Freigabe auf dem ursprünglichen Server aufheben, die virtuelle Festplatte von ihm trennen, die virtuelle Festplatte an den neuen Server anschließen und die Freigabe erneut freigeben. Dadurch bleiben die NTFS-Berechtigungen erhalten, wenn beide Server Mitglieder derselben Active Directory-Domäne sind. Außerdem ist es in der Regel sehr schnell, da keine Terabytes an Daten von einem Server auf den anderen kopiert werden müssen. Dieses Verfahren funktioniert jedoch nur dann elegant, wenn die Daten der Dateifreigabe auf einem Volume liegen, auf dem weder Windows noch andere Anwendungen installiert sind.

Wenn es erforderlich ist, die Daten für die Migration auf den neuen Server zu duplizieren, greife ich immer auf den alten treuen Robocopy (Robust File Copy for Windows) zurück. Robocopy gibt es schon seit den NT4-Tagen im Jahr 1996, also hören Sie wahrscheinlich nicht zum ersten Mal davon. Damals und bis 2008 war es mit dem Download des Windows Resource Kit erhältlich. Ab 2008 (und danach) wurde es sowohl mit Desktop- als auch mit Server-Betriebssystemen gebündelt, beginnend mit Vista und Server 2008. Wenn Sie also eine Eingabeaufforderung auf Ihrem Computer starten und „robocopy /?“ eingeben, werden Sie mit großer Wahrscheinlichkeit die Hilfedatei mit Informationen zur Verwendung des Dienstprogramms auf Ihrem Bildschirm sehen.

Es gibt eine ganze Reihe von Optionen, wenn es um Dateiserver-Migrationen mit Robocopy geht, und Sie wissen vielleicht nicht, wo Sie anfangen sollen. Seien Sie vorsichtig mit einigen der Optionen, wenn Sie sie nur ausprobieren, da einige von ihnen die Daten verschieben (Löschen von Dateien und Ordnern am Quell- oder Zielspeicherort).

Im Laufe der Jahre habe ich festgestellt, dass diese Syntax diejenige ist, auf die ich immer wieder zurückgreife:

Robokopie \\Quellenserver\Freigabename D:\Shares\ShareName /e /b /copyall /PURGE /r:5 /w:5 /MT:64 /tee /log+:D:\Shares\log_ShareName _%date:~-10,2%“-„%date:~7,2%“-„%date:~-4,4%.txt /v

Schauen wir uns das mal genauer an.

Robocopy
Initiiert den Befehl.

\\Quellenserver\Freigabename
Der erste Parameter ist immer der Quellort. Ich führe Robocopy in der Regel immer vom neuen Dateiserver aus, da:

  • auf diesem wahrscheinlich eine neuere Version von Robocopy installiert ist und
  • die Freigaben auf dem neuen Server wahrscheinlich noch nicht erstellt wurden.

D:\Shares\ShareName
Der zweite Parameter ist immer der Zielspeicherort. Ich empfehle Ihnen dringend, diese nach Möglichkeit nicht auf dem Betriebssystemvolume C:\ abzulegen. Ich erstelle auch gerne einen Stammordner namens „Shares“ und lege alle freigegebenen Ordner in diesem Ordner ab, anstatt sie im Stammordner zu belassen. Das hat mehrere Vorteile, wie ich im Laufe der Jahre festgestellt habe.

Die nächsten Parameter müssen nicht in einer bestimmten Reihenfolge angegeben werden.

/e

Damit werden Unterverzeichnisse kopiert, auch leere. Hier kommt der wahre Wert von Robocopy ins Spiel. Wenn nur die Dateien im obersten freigegebenen Ordner kopiert würden, wäre es nicht von großem Wert.

/b
Dies kopiert Dateien im Sicherungsmodus. Dabei wird kein VSS-Snapshot erstellt, sondern dies ist nützlich, wenn das Windows-Konto, mit dem Sie Robocopy ausführen, aufgrund von ACLs in NTFS möglicherweise keinen vollständigen Zugriff auf den Quellspeicherort hat.

/copy all
Sie haben sich vielleicht gefragt, warum der ganze Aufwand? Warum nicht zu beiden Speicherorten navigieren und die Dateien von Speicherort zu Speicherort kopieren und einfügen? Mit diesem Parameter werden alle Dateiinformationen kopiert. Auf diese Weise gibt es keinen neuen Zeitstempel, keinen neuen Eigentümer, keine geerbten NTFS-Berechtigungen, wenn dies nicht der Fall sein sollte, usw. Alle Dateiinformationen umfassen:

  • Daten
  • Attribute
  • Zeitstempel
  • Sicherheit (NTFS ACLs)
  • Besitzerinformationen
  • Überprüfungsinformationen

/PURGE
Dieser Parameter löscht Zieldateien und -ordner, die in der Quelle nicht mehr existieren. Beachten Sie, dass die Verwendung der Parameter /e und /PURGE zusammen technisch gesehen die gleiche Wirkung hat wie die Verwendung eines Parameters allein (/mir – für „mirror“), aber ich ziehe es vor, ein großes „PURGE“ in der Syntax zu haben, damit ich weiß, dass ich wahrscheinlich etwas lösche, wenn ich es ansehe. Hier stellt sich die Frage, warum ich eine Datei oder einen Ordner, die bzw. der im Quellverzeichnis nicht mehr existiert, in das Zielverzeichnis kopieren möchte. Außerdem, warum sollte ich eine Datei löschen, die nie existiert hat.

Das ist der zweite Punkt, an dem Robocopy wirklich glänzt. Normalerweise lasse ich Robocopy nicht nur einmal laufen und bin dann fertig, es sei denn, ich kopiere inaktive, veraltete Daten. Normalerweise erstelle ich eine geplante Aufgabe, um eine Batch-Datei auszuführen, die die auszuführenden Robocopy-Zeilen enthält. In diesem Fall und mit den oben genannten Parametern wird die erste Ausführung des Auftrags eine Weile dauern, da er die erste Kopie aller Daten durchführen muss. Wenn er jedoch das nächste Mal ausgeführt wird (ich stelle ihn in der Regel so ein, dass er täglich nach den Geschäftszeiten ausgeführt wird), sieht er sich die Quelle an und vergleicht sie mit dem Ziel, und wenn sich die Datei nicht geändert hat, wird er nichts damit machen. Wenn die Datei in der Quelle neuer ist, wird die Datei im Ziel überschrieben. Wenn die Datei in der Quelle seit der letzten Ausführung des Auftrags gelöscht wurde, wird die gleiche Datei im Ziel automatisch ebenfalls gelöscht. Für eine tatsächliche Dateifreigabe-Migration richte ich den Job etwa eine Woche im Voraus ein, schaue mir die erzeugten Protokolle an, behebe etwaige Probleme und lasse ihn täglich bis zum geplanten Übergabedatum laufen. Am Übergabedatum schalte ich die Quellfreigabe auf schreibgeschützt und führe den Robocopy-Auftrag noch einmal aus, um alle Deltas zu kopieren, die sich seit dem letzten Lauf geändert haben. Danach würde ich die Freigabe der Quellfreigabe aufheben und die neue Freigabe freigeben.

/r:5
Dieses Flag gibt an, wie oft Robocopy einen fehlgeschlagenen Kopiervorgang für eine Datei oder einen Ordner wiederholen soll. Manchmal schlägt dies fehl, weil die Datei gesperrt ist, weil der Benutzer oder Prozess sie geöffnet hat. In diesem Fall wiederholt Robocopy den Kopiervorgang, um zu sehen, ob die Datei nicht mehr gesperrt ist. Standardmäßig (wenn Sie diesen Parameter nicht angeben) wird Robocopy den Kopiervorgang 1 Million Mal wiederholen. Da ich weiß, dass wir diese Datei beim nächsten geplanten Lauf in einem Tag erneut kopieren werden, bin ich mit fünf Versuchen mehr als zufrieden, und wenn der Kopiervorgang nicht erfolgreich ist, fahre ich mit der nächsten Datei fort.

/w:5
Dieses Flag geht Hand in Hand mit /r. Dieses Flag gibt die Zeit in Sekunden an, die zwischen den Wiederholungsversuchen gewartet werden soll. Die Voreinstellung ist 30 Sekunden. Nimmt man 2 und 2 zusammen, ergibt sich 1.000.000 * 30 = 30.000.000 Sekunden oder 500.000 Minuten oder 8.333 Stunden und 20 Minuten oder 347 Tage und 5 Stunden. Das bedeutet, dass Robocopy bei einer einzigen gesperrten Datei fast ein Jahr brauchen würde, bevor es mit der nächsten Aufgabe fortfahren könnte! Dies ist ein Muss, um die /r- und /w-Flags entsprechend zu setzen.

/MT:64
Dieses Flag setzt eine neue maximale Anzahl von Threads, wenn Kopien mit mehreren Threads durchgeführt werden. Dadurch werden nicht mehrere Dateien oder Ordner gleichzeitig kopiert, sondern es werden mehr Threads mit der CPU verwendet, um die eingestellte Kopie durchzuführen. Die Standardeinstellung ist 8. Ich erhöhe diese Zahl gerne auf insgesamt 64 (beachten Sie dies, wenn Sie mehrere Robocopy-Aufträge gleichzeitig ausführen). Das Öffnen der Quelldatei, das Öffnen der Zieldatei, das Kopieren der Daten, das Schließen der Quelldatei und das Schließen der Zieldatei ist mit einem CPU-Overhead verbunden. Wenn all diese Vorgänge ausgeführt werden müssen, bevor mit der nächsten Datei fortgefahren wird, kann es sein, dass das E/A-Subsystem einen Teil der Zeit, in der es hätte arbeiten können, im Leerlauf ist. Hinweis: Dies wird Ihr System wahrscheinlich träge erscheinen lassen, da es die CPU anständig auslastet. Wenn es sich um einen neuen, noch nicht produktiven Dateiserver handelt, sollte es keine Rolle spielen, ob er „langsam“ ist.

/tee
Standardmäßig gibt Robocopy bei manueller Ausführung über die Eingabeaufforderung auf dem Bildschirm aus, was es gerade tut. Bei möglicherweise Tausenden von Dateien, die kopiert werden müssen, ist dies eine nicht gerade effiziente Methode, um einen Fehler zu finden. Durch die Angabe von /tee (anstatt es ganz wegzulassen) wird die Ausgabe in das Konsolenfenster und in die Protokolldatei erzwungen. Dies ist vor allem dann nützlich, wenn Sie den Robocopy-Auftrag zum ersten Mal ausführen und eine Fehlersuche durchführen, weil etwas nicht ganz so funktioniert, wie es sollte. Wenn ich eine geplante Aufgabe des Robocopy-Auftrags erstelle, empfehle ich, diesen Befehl wegzulassen.

log+:D:\Shares\log_ShareName _%date:~-10,2%“-„%date:~7,2%“-„%date:~-4,4%.txt

Standardmäßig wird die Protokollierung von Robocopy nur auf dem Bildschirm angezeigt. Mit dem Parameter /log geben Sie den Dateipfad zu einer neuen Datei (oder einer vorhandenen Datei) an. Die Datei wird überschrieben, wenn sie bereits vorhanden ist. Wenn Sie diesen Vorgang jedoch mit einer geplanten Aufgabe durchführen, möchten Sie vielleicht alle Iterationen des Laufs sehen und nicht nur die letzte. Wenn Sie das + nach log (/log+) angeben, wird es an die angegebene Datei angehängt, anstatt sie zu überschreiben. Wenn Sie außerdem „_%date:~-10,2%“-„%date:~7,2%“-„%date:~-4,4%“ in den Dateinamen einfügen, wird automatisch eine neue Datei mit dem Suffix _MM_DD_YYYYY am Ende der Protokolldatei erstellt, um historische Referenzen zu erhalten (wenn der Lauf an diesem Tag zum ersten Mal durchgeführt wurde). Bei besonders großen Dateifreigaben können sogar die Protokolldateien auf mehrere Gigabyte anwachsen, wenn sie tagelang laufen, so dass eine Aufteilung in tägliche Protokolle sehr sinnvoll ist.

/v
Dieser Parameter zeigt eine ausführliche Ausgabe, die übersprungene Dateien anzeigt. Im Allgemeinen möchten Sie dies sehen, um sicherzustellen, dass übersprungene Dateien protokolliert werden.

In Teil 2 dieses Blogs zeige ich, wie Sie einen täglichen Robocopy-Job mit dem Taskplaner einrichten.

Sind Sie mit der Migration Ihrer Dateiserver nicht zufrieden? Kontaktieren Sie Sikich. Wir sind bereit zu helfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.