Die Foren-SW läuft ohne erkennbare Probleme. Sollte doch etwas nicht funktionieren, bitte gerne hier jederzeit melden und wir kümmern uns zeitnah darum. Danke!

Backup Script für VMware Server

Hilfe bei Problemen mit der Installation oder Benutzung des VMware GSX Server und VMware Server 1.

Moderatoren: irix, Dayworker

Member
Beiträge: 10
Registriert: 14.08.2006, 13:57

Backup Script für VMware Server

Beitragvon jani » 15.08.2006, 12:39

Hallo zusammen,

ich bin gerade dabei mich in dem Thema rund um VMWare einzuarbeiten, wobei ich jetzt auf das Thema des Backups gestoßen bin. Ich habe mich etwas eingelesen und bin dabei mir ein Backup Script (Batch-Datei) für die Sicherung zu basteln.

Dabei habe ich mir gedacht, dass die ich die Maschinen in den Status 'suspend' setze und dann die Dateien auf ein anderes Medium sichere/kopiere.

leider habe ich das problem, das mein script stehen bleibt, sobald ich über das script den befehl 'suspend' über vmware-cmd übergebe.

Ich würde gerne mein script einmal posten, vll kann mir jemand helfen bzw. dient der allgemeinheit :) würde mich freuen.

zum system:
wirt: windows 2003 server r2 mit vmware server 1.0

quelltext der backup.bat

Code: Alles auswählen

@echo Off
rem batch script fuer die sicherng von einer VM-Maschine
rem letzte aenderung 2006-08-15

rem Pfadangaben zur Installationspfad von VM
SET VMInsDir=C:\Programme\VMware\VMware Server
rem Pfadangaben zur Virtuellen Maschine
SET VMDir=C:\Virtual Machines\BlackBerry
rem Dateiname der Virtuellem Maschine
SET VMName=BlackBerry
rem Angabe des Sicherungspfad
SET VMSave=S:\Virtuelle Maschinen\BlackBerry\

rem pfad fuer die log-datei
SET OurLogDir=C:\Virtual Machines\_Logs

rem setzt das aktuelle datum
FOR /f "tokens=2-4 delims=. " %%i in ('date /t') do SET date=%%k-%%j-%%i

rem setzt den namen der log-datei
SET logfile=%OurLogDir%\%VMName%-messages-%date%.log

cls

echo INFO: Full Backup procedure %date% started >> %logfile%

echo Pause Virtuelle Maschine
"%VMInsDir%\vmware-cmd" "%VMDir%\%VMName%.vmx" suspend

rem echo Status der Maschine
rem "%VMInsDir%\vmware-cmd" "%VMDir%\%VMName%.vmx" getstate

if suspend() = 1 goto copystart

rem log success
echo ERROR: backup der vm ist fehlgeschlagen >> %logfile%
goto endbackup

rem :copystart
echo INFO: Kopieren der Festplattendateien
copy "%VMDir%\*.vmdk" "%VMSave%"
copy "%VMDir%\%VMName%.vhd" "%VMSave%"
copy "%VMDir%\%VMName%.vmx" "%VMSave%"
copy "%VMDir%\%VMName%.vmc" "%VMSave%"
goto endbackup

:endbackup
echo INFO: Starte VM
"%VMInsDir%\vmware-cmd" "%VMDir%\%VMName%.vmx" start

rem VM wurde gesichert
echo INFO: VM wurde gesichert >> %logfile%

pause


MFG

Member
Beiträge: 14
Registriert: 15.03.2006, 15:35
Wohnort: Koblenz

Beitragvon akr_ko » 15.08.2006, 15:11

Hallo jani,
setze mal Deine Pfadangaben in Anführungszeichen, z.B.:

SET VMInsDir="C:\Programme\VMware\VMware Server"

denn DOS mag Leerzeichen in Pfaden nicht so sehr. Außerdem versuche mal, den Aufruf von vmware-cmd per "call". In meinem eigenen Backup-Skript sieht das etwa so aus (VM beenden und aus dem Inventory entfernen):
..
call vmware-cmd -q "%ziel%\%Rechner1%\%vmxname1%" stop trysoft
call vmware-cmd -q -s unregister "%ziel%\%rechner1%\%vmxname1%"
..

Gruß
Andreas

Member
Beiträge: 10
Registriert: 14.08.2006, 13:57

Beitragvon jani » 15.08.2006, 15:40

Hallo Andreas,

danke für deine antwort.

das mit dem aufruf über call hat funktioniert. das script geht nun weiter und
ist gerade dabei die dateien zu kopieren. kann man das nun noch etwas
verfeinern, zB eine if abfrage gestalten, falls die dateien schon vorhanden sind
das er ein unterverzeichnis erstellt oder sowas, damit man ein backu von mehren tagen hat?
weil so überschreibt er ja alle daten jeden tag und wenn das kopieren mal abbricht, ist das image defekt.

Member
Beiträge: 14
Registriert: 15.03.2006, 15:35
Wohnort: Koblenz

Beitragvon akr_ko » 15.08.2006, 16:22

Hallo jani,
klar kannst Du das beliebig verfeinern. Die Abfrage ob Dateien existieren (oder NICHT) macht man z.B. mit

if exist "%ziel%\%Rechner1%\%vmdkname1%.lck" goto shutdownvm1
oder
if NOT exist "%ziel%\%Rechner1%\%vmdkname1%.lck" goto shutdownvm1

Viele wertvolle Infos zur DOS-Batch-Programmierung findest Du z.B. unter
http://www.antonis.de/dos/batchtut/pittipla/index.htm
http://www.antonis.de/dos/batchtut/bat-kurs/
http://www.computerhope.com/batch.htm
http://www.libe.net/themen/BATch-Befehle.php
http://www.dosware.de/home/tips.htm
http://de.wikibooks.org/wiki/Batch-Prog ... ch_Befehle

Wenn Dich mein eigenes Skript interessiert (OHNE Gewähr natürlich, bin auch kein Profi ...), dann lies hier weiter:

Gruß
Andreas


:: ############# DOS-Batch zum Sichern von VMs unter VMware Server ################################
::
:: Der Batch untersucht, ob VMs (Virtuelle Maschinen) aktiv sind.
:: Dazu überprüft er die Existenz der Lock-Dateien (*.lck).
:: Wenn existent, werden die VMs mit Hilfe des Perl-Skripts vmware-cmd herutergefahren
:: und aus dem Inventory ausgetragen.
:: Anschließend werden beliebige Kopier- und Sicherungsaktionen gestartet,
:: die VMs wieder gestartet und im Inventory des VMware Server registriert.
::
:: Voraussetzungen: 1. Der Pfad zu vmware-cmd muss im PATH-Eintrag von Windows stehen
:: 2. Im folgenden Abschnitt müssen sinnvolle Werte für diverse
:: Verzeichnisse und Variablen eingetragen werden
::
:: AKR 21.07.2006
:: #################################################################################################

@echo off

:: Uhrzeit im Format HH.MM.SS auslesen und zwischenspeichern (keine Zehntelsekunden! deswegen :~0,8)
SET startzeit=%TIME:~0,8%


:: ############# Verzeichnisse und Variablen definieren #############

::--------------------------------------------------------------------------------------------
:: Hier bitte das Verzeichnis angeben, unter dem ALLE VM-Ordner liegen (z.B. E:\VM)
set ziel=E:\VM

::--------------------------------------------------------------------------------------------
:: Hier bitte den Ordnernamen jeder einzelnen VM angeben (z.B. W2k Prof)
set rechner1=dbwww
set rechner2=W2kProf
::set rechner3=

::--------------------------------------------------------------------------------------------
:: Hier bitte den Namen der jeweiligen *.vmx-Datei angeben (z.B. Windows 2000 Server.vmx)
set vmxname1=Windows 2000 Server.vmx
set vmxname2=win2000pro.vmx
::set vmxname3=

::--------------------------------------------------------------------------------------------
:: Hier bitte den Namen der jeweiligen *.vmdk-Datei angeben (z.B. dbwww_C.vmdk)
set vmdkname1=dbwww_C.vmdk
set vmdkname2=W2k_D.vmdk
::set vmdkname3=

::--------------------------------------------------------------------------------------------
:: Verzeichnis von vmware-cmd angeben, davor ein cd-Kommando!
cd "E:\Programme\Tools\VMware Server\VMware VmPerl Scripting API"
if errorlevel 1 goto error-cmd

::--------------------------------------------------------------------------------------------
:: Quell- und Zielverzeichnis der zu sichernden VMs ("E:\VM\test")
set copyquelle="E:\VM\test"
set copyziel="D:\VM_Backup"

::--------------------------------------------------------------------------------------------
:: Speicherverzeichnis der Logdatei (z.B. c:\ oder f:\Logs\ )
set logablage=C:\
:: Dateiname der Logdatei (z.B. VM-Backup-Log.txt)
set logdatei=VM-Backup-Log.txt


:: Kurze Info
echo Dieses Batch beendet alle laufenden VMs
echo und sichert das Verzeichnis %copyquelle% nach %copyziel%.
echo Eine Logdatei wird unter %logablage%%logdatei% abgelegt.
echo.



:: ############# VMs beenden #############

:: Alle VMs überprüfen, ob sie laufen (*.lck existiert?) und wenn nötig herunterfahren

:check0
if exist "%ziel%\%Rechner1%\%vmdkname1%.lck" goto shutdownvm1
if exist "%ziel%\%Rechner2%\%vmdkname2%.lck" goto shutdownvm2
::if exist "%ziel%\%Rechner3%\%vmdkname3%.lck" goto shutdownvm3
if NOT exist "%ziel%\%Rechner1%\%vmdkname1%.lck" goto copy
if NOT exist "%ziel%\%Rechner2%\%vmdkname2%.lck" goto copy
::if NOT exist "%ziel%\%Rechner3%\%vmdkname3%.lck" goto copy

:shutdownvm1
call vmware-cmd -q "%ziel%\%Rechner1%\%vmxname1%" stop trysoft
call vmware-cmd -q -s unregister "%ziel%\%rechner1%\%vmxname1%"
if errorlevel 1 goto error-cmd
echo.
echo ==} Die VM [%rechner1%] wurde gestoppt
goto check0

:shutdownvm2
call vmware-cmd -q "%ziel%\%Rechner2%\%vmxname2%" stop trysoft
call vmware-cmd -q -s unregister "%ziel%\%rechner2%\%vmxname2%"
if errorlevel 1 goto error-cmd
echo.
echo ==} Die VM [%rechner2%] wurde gestoppt
::goto check0
:: (Achtung!!! Sprunganweisung goto check0 nach ALLEN, AUSSER nach
:: dem letzten verwendeten shutdownvmx (x=1,2,3,...) eintragen!!!

:: :shutdownvm3
::call vmware-cmd -q "%ziel%\%Rechner3%\%vmxname3%" stop trysoft
::call vmware-cmd -q -s unregister "%ziel%\%rechner3%\%vmxname3%"
::if errorlevel 1 goto error-cmd
::echo.
::echo ==} Die VM [%rechner3%] wurde gestoppt
::goto check0
:: (Achtung!!! Sprunganweisung "goto check0" nach ALLEN, AUSSER nach
:: dem letzten verwendeten shutdownvmx (x=1,2,3,...) eintragen!!!

:: Warten, bis alle VMs beendet sind
:wait
:: ca. 10 Sekunden warten [Bei ping-Problemen kann die folgende Zeile entfernt werden]
@ping localhost -n 10>NUL
if exist "%ziel%\%Rechner1%\%vmdkname1%.lck" goto wait
if exist "%ziel%\%Rechner2%\%vmdkname2%.lck" goto wait
::if exist "%ziel%\%Rechner3%\%vmdkname3%.lck" goto wait



:: ############# Kopieraktionen #############
cls
:copy
echo.
echo ==} Alle VMs wurden beendet.
echo ==} Der Sicherungsvorgang startet nun.
echo ==} Ich kopiere die folgenden Dateien
echo ==} von %copyquelle% nach %copyziel%:

:: VMs werden gesichert, gelöscht, verschoben, umbenannt, ...
:: ... was immer robocopy oder xcopy hergeben ...

xcopy %copyquelle% %copyziel% /S /E /C /H /O /R /Y /V

:: Mögliche Parameter von xcopy [QUELLE] [ZIEL] /Parameter
:: von [QUELLE] zu [ZIEL] wird kopiert
:: (/E)Alle Unterverzeichnise kopieren ...
:: (/S)... egal ob sie leer sind oder nicht
:: (/C)Kopieren auch dann fortsetzen, wenn Fehler auftauchen ...
:: (/H)... oder die Dateien eigentlich als "versteckt" oder "System" gekennzeichnet sind
:: (/O)Alle Schreib- und Benutzerrechte mit kopieren
:: (/R)Alte Version des Backups überschreiben, auch wenn sie schreibgeschützt ist
:: (/Y)Ständige Nachfrage "Überschreiben?" bejahen
:: (/D)Nur die jeweils aktuelleren Dateien bleiben erhalten
:: (/V)Alle kopierten Dateien überprüfen



:: ############# VMs wieder starten #############
echo.
echo ==} Der Kopiervorgang wurde beendet.

::Rechner werden nun wieder in das Inventory des VMWare-Servers gelesen und gestartet

:check1
if exist "%ziel%\%Rechner1%\%vmxname1%" goto register1

:check2
if exist "%ziel%\%Rechner2%\%vmxname2%" goto register2

:: :check3
::if exist "%ziel%\%Rechner3%\%vmxname3%" goto register3

:register1
call vmware-cmd -q -s register "%ziel%\%rechner1%\%vmxname1%"
call vmware-cmd -q "%ziel%\%rechner1%\%vmxname1%" start
if errorlevel 1 goto error-cmd
echo ==} Die VM [%rechner1%] wurde wieder gestartet.
goto check2

:register2
call vmware-cmd -q -s register "%ziel%\%rechner2%\%vmxname2%
call vmware-cmd -q "%ziel%\%rechner2%\%vmxname2%" start
if errorlevel 1 goto error-cmd
echo ==} Die VM [%rechner2%] wurde wieder gestartet.
::goto check3

:: :register3
::call vmware-cmd -q -s register "%ziel%\%rechner3%\%vmxname3%
::call vmware-cmd -q "%ziel%\%rechner3%\%vmxname3%" start
if errorlevel 1 goto error-cmd
::echo ==} Die VM [%rechner3%] wurde wieder gestartet.



:: ############# Log-Datei erzeugen #############

SET endzeit=%TIME:~0,8%
::Aktion an Logdatei anhängen, dabei aber bitte neue Logeinträge an den Loganfang setzen!
if NOT exist %logablage%%logdatei% goto loganlegen
if exist %logablage%%logdatei% goto logweiter

:loganlegen
echo. >> %logablage%%logdatei%
if errorlevel 1 goto error-log

:logweiter
CD %logablage%
if errorlevel 1 goto error-log
echo Start: %startzeit% (%date%) # Ende: %endzeit% (%date%) >> c:\logneu.txt
TYPE %logablage%%logdatei% >> c:\logneu.txt
DEL %logablage%%logdatei%
REN c:\logneu.txt %logdatei%
if errorlevel 1 goto error-log


cls
echo.
echo #########################################
echo # Alle VMs wurden wieder gestartet
echo #
echo # Logdatei unter %logablage%%logdatei%
echo #
echo # Startzeit: %startzeit% (%date%)
echo # Endzeit: %endzeit% (%date%)
echo #########################################
echo.
Goto ende




:: ############# Fehlerbehandlung #############

:: Falls Fehler beim Aufruf von vmware-cmd auftreten, Meldung machen
:error-cmd
echo.
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo.
echo Ein Fehler ist aufgetreten!
echo vmware-cmd wurde nicht gefunden oder
echo sein Speicherort ist nicht im
echo Windows-PATH eingetragen!
echo.
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo.
Goto ende

:: Falls Fehler beim Speichern der Log-Datei auftreten, Meldung machen
:error-log
echo.
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo.
echo Ein Fehler ist aufgetreten!
echo Die Logdatei konnte nicht korrekt
echo erzeugt werden. Bitte Speicherorte und
echo Variablen am Batchanfang überprüfen.
echo Evtl. keine Schreibrechte auf %logablage%?
echo.
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo.


:: ############# Ende #############

:ende
::Benutzer-Tastendruck zum Beenden, eventuell für automatischen Betrieb auskommentieren
pause

Member
Beiträge: 64
Registriert: 19.06.2006, 21:24
Kontaktdaten:

Beitragvon Mallah » 15.08.2006, 23:41

heyy cool.. nur .. batch??.. wie muss ich mir das vorstellen?..laufen diese batch datei auf den gast-betriebssysteme sprich windows..

Member
Beiträge: 10
Registriert: 14.08.2006, 13:57

Beitragvon jani » 16.08.2006, 10:01

ne, die batch dateien sind ja zur sicherung da. daher laufen die auf deinem windows wirtsystem. bei mir laufen die scripte als geplante tasks unter windows zu einer definierten zeit, damit die immer zur selben zeit gesichert werden.

Member
Beiträge: 3
Registriert: 16.09.2006, 21:42

local system account

Beitragvon MisterT » 16.09.2006, 21:50

Hallo Andreas,
da ich auch relativ neu bin auf dem Gebiet VMware, habe ich mir erlaubt deine batch zu kopieren und für mich angepasst....
Eine Frage dazu hab ich aber - ist das deregistrieren notwendig? (call vmware-cmd -q -s unregister "%ziel%\%rechner1%\%vmxname1%")
Ich habe die virtuellen Maschinen so eingestellt, daß sie als "local system account" nach dem booten des Host starten, aber nach dem Durchlaufen des Skripts stehen sie jedes Mal auf "User that powers on the machine".
Hat das etwas mit dem deregistrieren und neuregistrieren zu tun?
Falls nicht, wei0t du woran das liegen könnte?

Danke, Tobi

Member
Beiträge: 3
Registriert: 16.09.2006, 21:42

poweroptions

Beitragvon MisterT » 16.09.2006, 22:44

Ziehe obige Frage zurück... War wohl zu schnell mit dem Posten - hab die Antwort schon gefunden: setrunasuser <username>
Was ich allerdings nicht gefunden habe, sind die poweroptions, also den Parameter "Poweron virtual macine" / "Don'r power on virtual machine".
Ist es möglich diese Option in einem Skript festzulegen?

Danke, Tobi

Member
Beiträge: 4
Registriert: 26.09.2006, 13:20

Re: poweroptions

Beitragvon Raomer » 26.09.2006, 13:26

MisterT hat geschrieben:Ziehe obige Frage zurück... War wohl zu schnell mit dem Posten - hab die Antwort schon gefunden: setrunasuser <username>
Was ich allerdings nicht gefunden habe, sind die poweroptions, also den Parameter "Poweron virtual macine" / "Don'r power on virtual machine".
Ist es möglich diese Option in einem Skript festzulegen?

Danke, Tobi


Hiho!

Ich habe das Backupscript so weit zum laufen gebracht, finde aber nicht raus wie du das mit dem "local system Account" hingekriegt hast (ich habe keinen Programmierbackground)

Ich habe es so versucht (geändert auf richtig):

call vmware-cmd -q -s register "%ziel%\%rechner1%\%vmxname1%"
call vmware-cmd -q "%ziel%\%rechner1%\%vmxname1%" setrunasuser "SYSTEM"
call vmware-cmd -q "%ziel%\%rechner1%\%vmxname1%" start
if errorlevel 1 goto error-cmd

Edith:

Ich habs doch hingekriegt dass es als System läuft....aber:

sie sollte "on host startup" starten.

Ich hoffe ihr könnt mir weiterhelfen, ich bin momentan etwas ratlos
:(

Ist es überhaupt notwendig die VMs neu zu registrieren bzw. erst einmal "unregister" zu machen? Weil dann ersprare ich mir ja sozusagen die startsettings neu eintragen zu müssen.

MFG, Rao

Member
Beiträge: 69
Registriert: 15.01.2007, 16:04

Beitragvon Kran01 » 25.01.2007, 11:28

@akr_ko

Geht das auch mit suspend statt stop? Ich habe einen Terminalserver im Einsatzt und der braucht nach einem Stop immer sehr lange, bis er eine vernünftige Leistung erreicht.

Member
Beiträge: 1
Registriert: 01.10.2007, 17:34

Frage zum Thema "Freier Speicherplatz auf Zielmedium&qu

Beitragvon dollhorn » 01.10.2007, 17:41

Hallo zusammen,
erstmal vielen Dank und vollsten Respekt an die Autoren des Skriptes. Das ist wirklich eine gute Lösung.

Genug des Lobes, ich habe logischerweise eine Frage:
Habe das Script zusammen mit einem REV-Wechsler im Einsatz. Auf die REV-Medien passen ca. 35-70 GB. Meine zu sichernde Maschine liegt bei ca. 35 GB, so daß ich immer nur eine Sicherung auf ein Medium bringe. Ist aber kein Thema, habe ja einen Wechsler und nutze täglich andere Medien. Worum mir es nun geht ist folgendes: Das Skript prüft ja, ob auf dem Medium noch genug Speicherplatz ist. Kann ich diese Prüfung irgendwie umgehen, bzw. mit den Parametern KeepCopyFiles = True, CleanUpBackupFiles = True, NumberBackupsToKeep = 0, MinFileSize = 1 das steuern? Momentan ist es so, daß mir das Script sagt, daß auf dem Medium kein Platz ist. P.S. Ich zippe das Backup nicht, dauert mir zu lange, außerdem habe ich auf dem Medium für eine Sicherung immer genug Platz.

Die Alternative ist natürlich, daß ich vor der Sicherung einfach die Dateien auf dem Medium lösche.... Grübel, grübel... je mehr ich darüber nachdenke umso sicherer werde ich, daß ich das so mache....

Was meint Ihr?

Dollhorn

Member
Beiträge: 5
Registriert: 24.10.2007, 09:56

Mehrer Virtuelle HDs sichern

Beitragvon Depechem70 » 05.08.2009, 10:24

Hi, also ich habe jetzt das Script von akr_ko für mich endeckt, läuft soweit ganz gut, das Problem was ich habe ist nun:
Wie sichere ich bei einem Virtuellen Server der mehrere Virtuelle HDs hat?
Bei dem Script hab ich ja nur die HD gesichert, die eingetragen ist.
Was kann ich da tuen?

Member
Beiträge: 14
Registriert: 15.03.2006, 15:35
Wohnort: Koblenz

Beitragvon akr_ko » 05.08.2009, 10:58

@ Depechem70: Hi, habe mich schon lange nicht mehr gedanklich mit dem Skript beschäftigt, aber ich versuche mal eine Antwort:
Wenn ich recht verstehe, hast Du virtuelle HDs, die zwar bereit liegen, aber aktuell nicht an der Virtuellen Maschine angemeldet sind? Wenn diese "nichtangemeldeten" im gleichen Verzeichnis wie die "angemeldeten" liegen, sollte das Skript sie eigentlich mitsichern, denn

Code: Alles auswählen

xcopy %copyquelle% %copyziel% /S /E /C /H /O /R /Y /V

sichert den kompletten Ordner, den Du unter %copyquelle% angibst, inkl. aller enthaltenen Dateien.
Liegen deine "nichtverwendeten" HDs irgendwo außerhalb, könntest Du sie entweder in den Ordner deiner VM verschieben oder z.B. weitere xcopy-Zeilen hinzufügen:

Code: Alles auswählen

xcopy %Verzeichnis_unangemeldeter_HDs% %Sicherungsverzeichnis_unangemeldeter_HDs% /S /E /C /H /O /R /Y /V


Hoffe, das hilft etwas weiter. Gruß
Andreas


Zurück zu „VMserver 1 und GSX“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast