Windows-PCs mit 'robocopy' sichern
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