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

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.

VSMount

Aktuell unterscheide ich noch nicht nach Schattenkopien, die auch für Clients erreichbar sind (Stichwort: "vorherige Versionen"). Diese Mountpoint bleiben leer.

VSS Mountpoints im Explroer

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

Weitere Link