VShadow.EXE (früher vsnap.exe) und DiskShadow
Achtung:
Die hier beschriebenen Befehle sind keine legitimen Exchange Backups,
sondern sollen ihnen in TestUmgebungen helfen, die "Power" von
Schattenkopien selbst zu erfahren. Im Grunde ist es aber die gleiche
Technik, wie Sie heute schon kommerzielle Backuplösungen nutzen.
Windows 2008 DiskShadow
Windows 2008 enthält das Programm "Diskshadow", welches ebenfalls
Schattenkopien erlaubt. Siehe weiter unten.
"virtual machine snapshots aren't application aware,
and using them can have unintended and unexpected consequences für a
server application that maintains state data, such as Exchange. As a
result, making virtual machine snapshots of an Exchange guest virtual
machine isn't supported."
Quelle:
http://technet.microsoft.com/en-us/library/aa996719.aspx
Beachte dazu auch Windows 2003 Schattenkopien
VShadow ist kein Tool im eigentlichen Sinne sondern ein Test und Demoprogramm aus dem Windows SDK bzw. VSS SDK und als freier Download verfügbar. Es ist eine Kommandozeile, um Schattenkopien zu testen, anzufertigen und einiges mehr. Exchange 2003 hat erstmalig eine Sicherung mit Schattenkopien unterstützt und Exchange 2007 nutzt diese Methode als bevorzugte Sicherung. Auch das NTBackup von Windows 2003 macht die Dateisystemsicherungen per Schattenkopie und das Windows Server Backup von Windows 2008 sichert sogar die Festplatten komplett als "Image" über Schattenkopien. Da ist es an der Zeit sich mit passenden Werkzeugen einzudecken
Download
The VSS (Volume Shadow Copy) SDK is available für download
http://blogs.msdn.com/adioltean/archive/2004/12/30/344476.aspx
http://www.microsoft.com/downloads/details.aspx?FamilyID=0B4F56E4-0CCC-4626-826A-ED2C4C95C871&displaylang=en
Sie benötigen das VSS SDK, da dort die später genutzten Programme und Tools enthalten sind. Diese Tools gibt es nicht einzeln.
' Create Shadow copy of VM drive ' Generiere temporäres Skript vshadow.exe -script=setvar1.cmd -p d: ' Starte temporäres Skript zum auslesen der SchattenkopieID call setvar1.cmd ' Verbinde laufwerk mit Schattenkopie vshadow.exe -el=%SHADOW_ID_1%,x: ' hier kann man dann alles machen ' Lösche alle Laufwerke Echo y | vshadow.exe -da"
VShadow Parameter
usage: VSHADOW [optional flags] [commands] List of optional flags: -? - Displays the usage screen -p - Manages persistent shadow copies -nw - Manages no-writer shadow copies -ad - Creates differential HW shadow copies -ap - Creates plex HW shadow copies -scsf - Creates Shadow Copies für Shared Folders (Client Accessible) -t={file.xml} - Transportable shadow set. Generates also the backup components doc. -bc={file.xml} - Generates the backup components doc für non-transportable shadow set. -wi={Writer Name} - Verify that a writer/component is included -wx={Writer Name} - Exclude a writer/component from set creation or restore -script={file.cmd} - SETVAR script creation -exec={command} - Custom command executed after shadow creation, import or between break and make-it-write -wait - Wait before program termination or between shadow set break and make-it-write -tracing - Runs VSHADOW.EXE with enhanced diagnostics List of commands: {volume list} - Creates a shadow set on these volumes -ws - List writer status -wm - List writer summary metadata -wm2 - List writer detailed metadata -q - List all shadow copies in the system -qx={SnapSetID} - List all shadow copies in this set -s={SnapID} - List the shadow copy with the given ID -da - Deletes all shadow copies in the system -do={volume} - Deletes the oldest shadow of the specified volume -dx={SnapSetID} - Deletes all shadow copies in this set -ds={SnapID} - Deletes this shadow copy -i={file.xml} - Transportable shadow copy import -b={SnapSetID} - Break the given shadow set into read-only volumes -bw={SnapSetID} - Break the shadow set into writable volumes -el={SnapID},dir - Expose the shadow copy as a mount point -el={SnapID},drive - Expose the shadow copy as a drive letter -er={SnapID},share - Expose the shadow copy as a network share -er={SnapID},share,path - Expose a child directory from the shadow copy as a share -r={file.xml} - Restore based on a previously-generated Backup Components document -rs={file.xml} - Simulated restore based on a previously-generated Backup Components doc -revert={SnapID} - Revert a volume to the specified shadow copy
Wer sich die Parameter genau anschaut, dem wird sich natürlich auch die Hölle öffnen. So gibt es mit der Option "-bw" anscheinend die Möglichkeit, eine Schattenkopie in eine beschreibbares Volume zu konvertieren.
Schattenkopie anlegen
Aber fangen wir mal einfach an, indem wir per Kommandozeile einfach eine Schattenkopie eines Dateisystems unterer Wahl anlegen:
vshadow -p e:
Hier wird die Partition "E:" durch eine Schattenkopie "gesichert" . Das "-p" steht für persistent, d.h. die Schattenkopie bleibt nach dem Anlegen auch vorhanden, wenn vshadow sich beendet.
Achtung:
Die so angelegten Schattenkopien sind nicht mit dem Windows Explorer als
"Vorherige Versionen" zu sehen.
Schattenkopien anzeigen
Der nächste Schritt ist die Kontrolle der vorherigen Aktion. VSHADOW kann dazu die Schattenkopien mit folgendem Befehl anzeigen.
vshadow -q
Die Ausgabe im Textfenster zeigt alle Schattenkopien an.
C:\>vshadow.exe -q VSHADOW.EXE 2.2 - Volume Shadow Copy sample client Copyright (C) 2005 Microsoft Corporation. All rights reserved. (Option: Query all shadow copies) - Setting the VSS context to: 0xffffffff Querying all shadow copies in the system ... * SNAPSHOT ID = {587e185e-49ab-4fe3-bc57-d2eaf61ef767} ... - Shadow copy Set: {51bb9d70-8ca9-4162-a8d1-a78c92f03be1} - Original count of shadow copies = 1 - Original Volume name: \\?\Volume{545fb934-aa74-11d7-998f-806e6f6e6963}\ [C:\] - Creation Time: 09.05.2008 14:56:59 - Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy18 - Originating machine: srv01.msxfaq.local - Service machine: srv01.msxfaq.local - Not Exposed - Provider id: {b5946137-7b9f-4925-af80-51abd60b20d5} - Attributes: No_Auto_Release Persistent Differential
Interessant sind hier z.B. die Attribute. Hier sieht man, dass es eine "Persistent"-Version ist, d.h. Sie bleibt erhalten.
Schattenkopien als Laufwerk oder Verzeichnis mounten
Für den Zugriff auf Schattenkopien bietet VSHADOW nun mehrere Wege an
- Laufwerk
Sie können die Schattenkopie einfach als weitere Festplatte unter Windows zur Verfügung stellen. - Mountpoint
Alternativ (und aus meiner Sicht besser) ist die Bereitstellung in einem leeren Verzeichnis als Mountpoint. Das Spart Buchstaben und sorgt für Übersichtlichkeit - Netzwerkshare
Optional kann VSHADOW die Schattenkopie auch gleich im Netzwerk freigeben. Das kann aber auch nachträglich von Hand erfolgen.
Alle so bereit gestellten Schattenkopien sind aber erst mal "ReadOnly". Sie benötigen dazu aber die GUID der Schattenkopie, die "vshadow -q" ausgibt. Das Verzeichnis zum Mounten muss natürlich ebenfalls angelegt sein:
C:\>md c:\vssmount C:\>vshadow -el={b671aa9d-6ede-424b-981f-95474bd7954c},c:\vssmount - Setting the VSS context to: 0xffffffff - Exposing shadow copy {b671aa9d-6ede-424b-981f-95474bd7954c} under the path 'x:' ERROR: the snapshot ID identifies a Client Accessible snapshot which cannot be exposed
Mit dem VBSkript "VSSMOuNT" (siehe unten) habe ich mit eine Lösung geschaffen , um alle Schattenkopien als Mountpoint in einem vorgegebenen Verzeichnis bereit zustellen.
Schattenkopien wieder mit MOINTVOL dismounten
VSHADOW bietet leider keine Option, um eine einmal bereit gestellte Schattenkopie wieder zu entfernen. Man kann mit "-ds" die Schattenkopie nur komplett löschen. Aber Windows bringt schon "MOuNTVOL" mit, um Mountpoints zu behandeln. Damit ist es problemlos möglich, eine gemountete Schattenkopie wieder zu dismounten. Zurück bleibt wieder der leere Ordner.
VShadow zum Kopieren der Datenbank
Nach so viel Theorie ist nun der praktische Einsatz gefragt. Natürlich können Sie mit VSHADOW erst mal einfach kontrollieren, ob ihre Sicherungsanwendung auch Schattenkopien anlegt. VShadow kann aber auch genutzt werden, um Exchange oder SQL zu sichern.. Das machen wir uns nun für eine kleine Backuproutine zu nutze:
VSHADOW -p -script=SETVAR1.cmd c:
call SETVAR1.cmd
ESEuTIL /mh %VSHADOW_DEVICE_1%\DB\DB.EDB
COPY %VSHADOW_DEVICE_1%\DB\DB.EDB C:\backup.edb
Damit wird eine Schattenkopie gestartet und danach die CRC-Prüfsumme der Datenbank geprüft und dann die Datenbank weg kopiert. Das ist aber (noch) kein Ersatz für eine Exchange Sicherung, da wir die Konsistenz der Date nicht hergestellt haben.
Dazu müssten wir die Datenbank wieder auf eine Festplatte kopieren, die beschrieben werden kann und die Transaktionsprotokolle beifügen und mit ESEuTIL die Datenbank wieder in einen konsistenten Status (Clean Shutdown) bringen. Erst dann können wir sicher sein, eine komplette Kopie erhalten zu haben. Trotzdem weiß der Exchange Server davon noch nichts, und schneidet seine Transaktionsprokolle nicht ab. Es ist also noch ein steiniger Weg von einer Skriptlogik zum Kopieren einer Datenbank zum Backup.
Recovery Storage Group, PowerControls und VSS
Wer nun 1 und 1 zusammen zählt und ein bisschen hinter Exchange schaut, der wird eine Menge weiterer Anwendungsfälle für dies Technik sehen. Natürlich ist primär eine schnelle Sicherung ein Einsatzbereich. Nutzt eine Sicherungssoftware diesen Weg, dann kann Sie in wenigen Sekunden einen gültigem Schnappschuss der Exchange Datenbank erhalten und dann diesen per Blockcopy der Festplatte oder ganz ohne Mithilfe des Server über SAN-Techniken auf einen Sicherungsserver oder andere Medien bringen.
Der zweite Einsatzbereich ist natürlich die Nutzung als Wiederherstellungspunkt im Disasterfall. Eine defekte Datenbank kann in wenigen Sekunden zurückgedreht werden, wenn der Massenspeicher selbst nicht korrumpiert wurde.
Der dritte Einsatzfall ist aber etwas spezieller. Leider kann Exchange die Datebank in der Schattenkopie nicht als "Wiederherstellungsspeichergruppe" nutzen, da die Schattenkopie "ReadOnly" ist. Man müsste als Administrator also die Datenbank erst auf eine andere Festplatte kopieren und dann einbinden. Das dauert lange, kopiert sehr viele Daten und belastet den produktiven Server. Einfacher ist es da natürlich, die Schattenkopie als Freigabe im Netzwerk bereit zu stellen und mit einem Werkzeug wie Power Controls 5 direkt die Datenbank zu öffnen und die gewünschten Informationen zu extrahieren.
BETEST
BETEST ist eine "Backup Test"-Musteranwendung.
Achtung
Wenn Sie BETEST einfach so aufrufen, dann startet BETEST sofort eine
Schattenkopie, sichert die Daten und restauriert diese danach gleich wieder.
Spielen Sie damit nicht auf einem produktiven Server und lesen Sie vorher die Dokumentation. Ich werde dieses Tool hier nicht weiter beschreiben.
VSSMOUNT
Basierend auf diesen Erfahrungen mit Schattenkopien habe ich mir ein Skript gebaut, welches einfach alle Schattenkopien als Mountpoint in ein Verzeichnis einhängt. Das VBScript zählt erst alle Schattenkopien mithilfe von VSHADOW.EXE auf um dann die Bildschirmausgabe auszuwerten und die Platzhalterverzeichnisse anzulegen und dann wieder mit VSHADOW die Mountpoints dort einzubinden.
Aktuell unterscheide ich noch nicht nach Schattenkopien, die auch für Clients erreichbar sind (Stichwort: "vorherige Versionen"). Diese Mountpoint bleiben leer.
Aufgrund einiger "Besonderheiten" von VSHADOW muss das Skript erst über eine dynamisch generierte CMD-Datei starten, um dann die Bildschirmausgabe letztlich über eine Datei auszuwerten.
DiskShadow
DiskShadow.exe läuft nicht auf Windows 2003 oder Windows Vista !
Windows 2008 enthalt direkt das Programm "Diskshadow", welches als Kommandozeile ebenfalls zur Pflege und Verwaltung von Schattenkopien unter Windows 2008 genutzt werden kann. Aufmerksam wurde ich über den Blogeintrag "Windows 2008 und DiskShadow" (http://wolfgang-on-the-road.spaces.live.com/blog/cns!F135E7D1136D4C5A!1097.entry). Die Ehre gebührt also Wolfgang, das zuerst beschrieben zu haben. Nach dem Aufruf von DiskShadow hat man erst man nur einen schwarzen Bildschirm vor sich, welcher ähnlich Diskpar auf Eingaben wartet. Sie könnten z.B. eingeben:
set context persistent begin backup add volume e: create
Diese kleine Folge generiert auf dem Volume E: eine Schattenkopie, die auch nach dem Ende des Programms bestehen bleibt aber nicht über das Dateisystem als "vorherige Version" nutzbar ist. Theoretisch könnten Sie dieses Skript regelmäßig ausführen.
Wenn Sie am Ende noch ein "End Backup" anschließen, dann erhalten die Programme auch den Status, dass die Sicherung abgeschlossen wurde. Dass die Schattenkopien in Verwendung sind, sieht man aber auch im Explorer
3000 MB sind hier in Benutzung, aber eben nicht durch die "Vorgängerversionen". Wenn Sie dann an eine Schattenkopie zugreifen müssen, dann hilft folgende Befehlssequenz in DiskShadow.exe
list shadows expose {SchattenkopieID} V:
Der Befehl "List Shadows" zeigt ihnen alle Schattenkopien und mit der GUID der gewünschten Schattenkopie können Sie dann einfach dieser mit "expose" ein Laufwerk, einen Mountpoint oder eine Freigabe zuordnen. Das Medium ist aber schreibgeschützt. Aber das ist für einen Zugriff mit Programmen wie Power Controls 5 vollkommen ausreichend.
Am Ende sollten sie die Laufwerke wieder aufräumen
unexpose V:
Optional können Sie die Schattenkopien natürlich auch löschen. Ein "Delete Shadow {GUID} löscht die jeweilige Kopie. Ein "Delete shadow all" entfernt gleich alle Kopien.
VSS per PowerShell und WMI
Natürlich müssen Sie mittlerweile nicht mehr auf die CMD-Box oder COM/EXE-Programme zurückgreifen. Dank WMI und PowerShell geht das auch direkt aus den Skripten. Da ist es dann einfacher zu verwenden. Hier ein Beispiel um eine VSS-Kopie anzulegen, als symbolischen Link in einem leeren Verzeichnis bereit zu stellen und danach wieder zu löschen.
# SampleCode fuer VSS aus PowerShell [string]$volume = "C:\" # disk zu make a VSS Copy [string]$vsslinkdir = "c:\vsslink" # VSS Image will be linked in that empty directory write-host "Create WIn32_ShadowCopy-Object" $vssobject=[wmiclass]"root\cimv2:win32_shadowcopy" write-host "Create VSS Copy from $($volume)" $vssvolume = $vssobject.Create($volume, "ClientAccessible") write-host "Loading SnapshotID " $SnapshotId = [string]$vssvolume.ShadowID write-host "SnapshotId: $($SnapshotId)" Write-host "Load list of all VSS Copies" $vsscopylist = Get-WmiObject Win32_ShadowCopy $vsscopylist | ft id,ClientAccessible,state,Persistent,VolumeName,DeviceObject write-host "Select created VSS Instance" $mysnapshot = $vsscopylist | Where-Object { $_.ID -eq $SnapshotId } if ($mysnapshot) { [string]$DeviceObject = $mysnapshot.DeviceObject + "\" write-host "DeviceObject :$($DeviceObject)" write-host "Check, if $($vsslinkdir) is not already there" if (test-path -path $vsslinkdir -pathtype container) { write-warning "Directory already there -stop" } #new-item -type symbolic does not work here yet Invoke-Expression -Command "cmd /c mklink /d '$vsslinkdir' '$DeviceObject'" #New-Item -ItemType SymbolicLink -path $vsslinkdir -Target $DeviceObject write-host "Do whatever your want -Close box with EXIT" cmd.exe write-host "Removing Symbolic Link" [System.IO.Directory]::Delete($vsslinkdir,$true) #Remove-Itemis complaining about the junction point Write-host "Delete VSS Copy" $mysnapshot.delete() Write-host "Done" }
Script als Download
vsstest.ps1
- Create method of the Win32_ShadowCopy
class
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/vsswmi/create-method-in-class-win32-shadowcopy - Creating Symbolic Links
https://docs.microsoft.com/en-us/windows/desktop/fileio/creating-symbolic-links - MKLINK
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mklink - Frage Zugriff auf Volume Shadow Copy
(VSS) Snapshots aus der Powershell
http://germanylandofinnovation.com/questions/29784/zugriff-auf-volume-shadow-copy-vss-snapshots-aus-der-powershell - Shadow Copies and Shadow Copy Sets
https://docs.microsoft.com/en-us/windows/desktop/vss/shadow-copies-and-shadow-copy-sets
Weitere Link
- Windows 2003 Schattenkopien
- BackupExtrem
- Exchange Backup und Restore mit NTBACKUP
- MSDN: Volume Shadow Copy Service
http://msdn.microsoft.com/en-us/library/bb968832(VS.85).aspx - How Volume Shadow Copy Service Works
http://technet2.microsoft.com/WindowsServer/en/Library/2b0d2457-b7d8-42c3-b6c9-59c145b7765f1033.mspx?mfr=true - Windows 2008 und DiskShadow
http://wolfgang-on-the-road.spaces.live.com/blog/cns!F135E7D1136D4C5A!1097.entry - iSCSI mit NetApp und Snapshots
http://exchangepedia.com/blog/2005/07/netapp-data-ontap-7-and-flexvolumes.html