Windows-PCs mit 'robocopy' sichern

Aus Synology Wiki
Version vom 31. März 2011, 19:23 Uhr von A-Jay (Diskussion | Beiträge) (Bemerkung zur Wochentagermittlung mit anderen robocopy-Versionen)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Einleitung

Datensicherung - wichtig, aber häufig nicht praktiziert. Oft wird eine Datensicherung erst dann eingerichtet, nachdem Daten einmal unwiederbringlich verloren gegangen sind. Datensicherungen sollten möglichst "im Hintergrund" arbeiten, d. h. ohne dass der Benutzer zusätzliche Arbeit hat. Hier ist eine Möglichkeit beschrieben, eine Datensicherung mit einem Mausklick zu erledigen. Etwas Einrichtungszeit ist allerdings nötig, diese hält sich aber in Grenzen (je nach Umfang der zu sichernden Daten 5-30 Minuten). Einmal eingerichtet und mit einer Verknüpfung auf dem Desktop wird nach einem arbeitsreichen Tag am Rechner dieser nicht über Start->Ausschalten, sondern über einen Doppelklick auf das Icon der Verknüpfung ausgeschaltet, wobei vorher "noch kurz" alle wichtigen Daten auf das Lieblings-NAS gesichert werden.

Allgemein

Das hier beschriebene Skript (eine Windows-Batchdatei) dient als Beispiel, wie eine einfache Datensicherung mit dem Tool 'Robocopy' realisiert werden kann. Das Skript kopiert an einem gewählten Wochentag alle Dateien eines Verzeichnisses (oder mehrerer Verzeichnisse), inklusive der Unterverzeichnisse. An den anderen Wochentagen werden nur geänderte Dateien kopiert (inkrementell oder differentiell). Falls gewünscht, wird der Rechner nach dem Kopieren heruntergefahren. Bei jedem Kopiervorgang wird auf dem Ziel ein Ordner mit dem aktuellen Datum erstellt. Daher sollte das Skript nur einmal pro Tag ausgeführt werden. Das Skript wurde bisher nur unter Windows XP SP2/3 getestet, sollte aber auch unter anderen Windowsversionen laufen.

Robocopy

Robocopy (Robust File Copy Utility) ist ein Programm vom Microsoft. Es ist in dem Windows Server 2003 Resource Kit Tools enthalten, welches kostenlos von Microsoft runtegeladen werden kann. Robocopy.exe muss aus dem Recource Kit extrahiert und in das Verzeichnis des Skripts gespeichert weden. Robocopy bietet weit mehr Möglichkeiten, als hier genutzt werden. Z. B. können mit Robocopy Verzeichnisse auch (im Hintergrund) gespiegelt werden.

PowerOff

PowerOff ist ein Programm von Jorgen Bosman. Mit PowerOff kann ein Rechner automatisch und ohne Administratorrechte heruntergefahren werden. Es kann über ein GUI oder per Kommandozeile gesteuert werden. Auch entfernte Rechner können gesteuert werden. In diesem Beispiel wird aber nur die Möglichkeit des einfachen Shutdowns des lokalen Rechners genutzt. Poweroff.exe in dasselbe Verzeichnis speichern, wie das Skript.

Das Skript

Im folgenden werden alle Abschnitte des Skripts erläutert.

Sicherungstyp

Zuerst muss festgelegt werden, welcher Sicherungstyp gewünscht ist. Es kann eine inkrementelle oder eine differetielle Sicherung gewählt werden. Bei beiden Typen wird an einem gewählten Wochentag eine Komplettsicherung (Vollsicherung) durchgeführt. Hierbei werden alle Dateien gesichert und das Archiv-Bit der Quelldateien zurückgesetzt. An allen anderen Wochentagen werden bei der

  • inkrementellen Sicherung alle Dateien gesichert, die sich seit der letzten Voll- oder inkrementellen Sicherung geändert haben.
  • differentiellen Sicherung alle Dateien gesichert, die sich seit der letzten Vollsicherung geändert haben.

Die inkrementelle Sicherung benötigt weniger Platz auf dem Sicherungsmedium, dafür ist der Aufwand bei der Wiederherstellung höher.

Der Wochentag für die Vollsicherung wird über die Variable DayOfFullBackup gewählt. Hier einen der Werte Mon|Tue|Wed|Thu|Fri|Sat|Sun angeben (Groß-/Kleinschreibung beachten!). Der Sicherungstyp wird über die Variable BackupType gewählt. Hier "I" für inkrementell oder "D" für differentiell angeben (Großschreibung!):

set DayOfFullBackup=Sun
set BackupType=I

Wochentag

Der aktuelle Wochentag wird über ein Workaround ermittelt. Hierzu wird aus der Startmeldung von Robocopy der Wochentag extrahiert:

for /f "tokens=3" %%i in ('robocopy /?^|find "Started"') do ( set DayOfWeek=%%i )
set DayOfWeek=%DayOfWeek:~0,3%

Die hier gezeigte Ermittlung des aktuellen Wochentages gilt für die englische robocopy Version XP010. Für andere Versionen (speziell anderssprachige) muss die for-Zeile entsprechend angepasst werden.

Datum

Setzen der Variable dat mit dem aktuellen Datum im Format "JJJJ-MM-TT". Es wird davon ausgegangen, das der Befehl date in der Windows-Eingabeaufforderung das Datum im Format "TT.MM.JJJJ" ausgibt. Falls das nicht der Fall sein sollte, mus die folgende Zeile entsprechend angepasst werden:

set dat=%date:~-4%-%date:~-7,2%-%date:~-10,2% 

LOG-Datei

Verzeichnis für Logdateien erstellen und den Namen der Logdatei festlegen:

IF /I NOT EXIST .\log md .\log
set logfile=".\log\Robo_Backup_%dat%.log" 

Sicherungstyp ermitteln

Falls der aktuelle Tag der gewünschte Tag der Vollsicherung ist, dann BT=F, sonst BT=I (inkrementell) oder BT=D (differentiell) setzen:

IF /I %DayOfWeek%==%DayOfFullBackup% (set BT=F) ELSE (set BT=%BackupType%)

Robocopy JOB-Datei

Robocopy kann über eine Vielzahl von Parametern (Optionen) gesteuert werden. Diese können zur Vereinfachung über eine JOB-Datei zugeführt werden. Die JOB-Datei kann von Hand erstellt oder von Robocopy selbst erzeugt werden. Ein Vorteil einer von Robocopy erzeugten JOB-Datei ist die automatische Dokumentation der verwendete Optionen. Im Skript wird in Abhängigkeit des ermittelten Sicherungstyps eine JOB-Datei mit den entsprechen Optionen erzeugt. Die JOB-Datei ist eine Textdatei und kann z. B. mit Notepad angesehen werden. Die Sicherungstypen 'C' (Copy) und 'M' (Mirror) werden hier nicht verwendet. Speziell bei eigenen Versuchen mit Robocopy ist bei der Verwendung von /MIRR äußerste Vorsicht geboten (siehe Dokumentation zu Robocopy).

Erzeugung der JOB-Datei für den späteren Aufruf vomn Robocopy:

IF /I %BT%==C robocopy /NOSD /NODD  /E /R:3 /W:5 /NP /ETA      /LOG+:%logfile% /SAVE:Robo_Backup /QUIT & GOTO doit
IF /I %BT%==F robocopy /NOSD /NODD  /E /R:3 /W:5 /NP /ETA      /LOG+:%logfile% /SAVE:Robo_Backup /QUIT & GOTO doit
IF /I %BT%==I robocopy /NOSD /NODD  /E /R:3 /W:5 /NP /ETA /M   /LOG+:%logfile% /SAVE:Robo_Backup /QUIT & GOTO doit
IF /I %BT%==D robocopy /NOSD /NODD  /E /R:3 /W:5 /NP /ETA /A   /LOG+:%logfile% /SAVE:Robo_Backup /QUIT & GOTO doit
IF /I %BT%==M robocopy /NOSD /NODD  /E /R:3 /W:5 /NP /ETA /MIR /LOG+:%logfile% /SAVE:Robo_Backup /QUIT & GOTO doit
;
:doit

Startmeldung in Logdatei schreiben

echo .                                                                     >>%logfile%
echo --------------------------------------------------------------------- >>%logfile%
echo Starte Backup: %date% %time%  (%DayOfWeek%)                           >>%logfile%
echo --------------------------------------------------------------------- >>%logfile% 

Sicherungsverzeichnis

Festlegen des dynamischen Teils des Sicherungsverzeichnisses. Der dynamische Teil setzt sich zusammen aus dem Datum und dem Sicherungstyp. Die Sicherungstypen 'C' (Copy) und 'M' (Mirror) werden hier nicht verwendet:

IF /I %BT%==C set bd=Copy
IF /I %BT%==F set bd=%dat% (%BT%)
IF /I %BT%==I set bd=%dat% (%BT%)
IF /I %BT%==D set bd=%dat% (%BT%)
IF /I %BT%==M set bd=Mirror 

Beispiel für die erzeugten Verzeichnisse:

  • ..\..\Backup\2011-03-11 (F)\Daten ==> für eine Vollsicherung (Full)
  • ..\..\Backup\2011-03-11 (I)\Daten ==> für eine inkrementelle Sicherung
  • ..\..\Backup\2011-03-11 (D)\Daten ==> für eine differentielle Sicherung


Sicherungs-Jobs

Im Skript können beliebig viele Sicherungs-Jobs angegeben werden (diese Jobs nicht mit den oben genannten JOB-Dateien verwechseln). Für jedes zu sichernde Verzeichnis muss ein Job angegeben werden.

Festlegen des Quellverzeichnisses (source) und des Sicherungsverzeichnisses (destin):

set source="C:\Dokumente und Einstellungen\A-Jay"
set destin="\\DS207p\Backup\%bd%"\C\DuE\A-Jay

Festlegen von Unterverzeichnissen (exdir) und Dateien (exfil), die nicht mitgesichert werden sollen:

set exdir=*temp* *tmp* *verlauf* *cookies* *recent* *cache* 
set exfil=*ntuser* *UsrClass* *temp* *tmp*

Hier würden u. a. die Verzeichnisse '..\..\IE\Google cookies\..\' und '..\..\cash\..' sowie die Dateien 'ntuser.bat' und 'abc.tmp' nicht mitgesichert werden.

Robocopy Aufruf

Hier wird endlich kopiert (gesichert)

robocopy  %source%  %destin%  /XF %exfil% /XD %exdir%  /JOB:Robo_Backup

Auf das Archivbit bezogen bietet Robocopy nur die Möglichkeiten

  • alle Dateien kopieren
  • nur Dateien mit gesetztem Archivbit kopieren
  • nur Dateien mit gesetztem Archivbit kopieren und Archivbit löschen

Was fehlt, ist die Möglichkeit

  • Alle Dateien kopieren und Archivbit löschen

Workaround: Archivbit nach dem Kopieren separat löschen (hier: nur bei "F" = Vollsicherung):

IF /I %BT%==F (attrib -a %source%\*.* /s /d)

Endemeldung in Logdatei schreiben

echo --------------------------------------------------------------------- >>%logfile%
echo Backup Fertig: %date% %time%                                          >>%logfile%
echo --------------------------------------------------------------------- >>%logfile%
echo .   

Poweroff (Rechner herunterfahren)

Nachdem alle Jobs abgearbeitet worden sind, kann der Rechner heruntergefahren werden. Mit Administratorrechten sollte das auch ohne das Programm PowerOff funktionieren, dann einfach hier 'shutdown -s' aufrufen. Aus Sicherheitsgründen sollte das Arbeiten mit Administratorrechten aber vermieden werden. Daher wird hier PowerOff verwendet. Vorher wird noch eine Meldung ausgegeben und 30 Sekunden gewartet, um dem Benutzer die Möglichkeit zu geben, das Herunterfahren des Rechners zu vermeiden.

echo .
echo Backup done.  Computer will shutdown in 30 seconds.  Press CTRL-C to abort 
echo .
ping 127.0.0.1 -n 1 -w 30000 > nul
.\Poweroff poweroff


Downloads

Robocopy
PowerOff
Der Download des Skripts folgt noch...