Logo faq-o-matic.net
Logo faq-o-matic.net

Client Hyper-V: Automatische Checkpoints abschalten

von veröffentlicht am25. Juni 2018, 06:06 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: PowerShell, Virtualisierung, Windows 10   Translate with Google Translate Translate EN   Die angezeigte Seite drucken

Seit einigen Versionen erzeugt Client Hyper-V (also die Hyper-V-Variante, die unter Windows 10 läuft) von neu erzeugten VMs automatische Checkpoints (umgangssprachlich auch als “Snapshots” bezeichnet). Das geschieht immer dann, wenn man eine solche VM startet und soll es in Test- und Entwicklungsszenarien ermöglichen, einfach und schnell die betreffende VM auf einen definierten Stand zurückzusetzen. Das ist in manchen Situationen sicher praktisch, aber oft stört es, denn u.a. führt es dazu, dass beim Beenden der VM der Checkpoint wieder aufgelöst wird, was einige Zeit dauern kann.

Die Funktion gibt es auch auf dem Server, dort ist sie aber standardmäßig deaktiviert. In Windows 10 hingegen ist sie immer aktiv, man kann sie nur pro VM abschalten. Eine zentrale Konfiguration zum Deaktivieren dieses Features gibt es nicht.

Da mir die Auto-Checkpoints eher im Weg stehen, habe ich einen Weg gesucht, die Voreinstellung zu ändern und bin auf einen Workaround gestoßen: Ich weise Windows an, beim Erzeugen einer neuen VM die betreffende Option sofort abzuschalten. Das reicht mir völlig aus.


Der Trick besteht darin, das Ereignisprotokoll, die Aufgabenplanung und ein kurzes PowerShell-Skript einzusetzen. Beim Erzeugen einer neuen VM schreibt Windows das Event 18304 in eines der Hyper-V-Eventlogs. An dieses Event kopple ich im Task Scheduler eine Aufgabe, die mein PowerShell-Skript aufruft. Dieses erhält den Namen der VM und kann so die Option deaktivieren. So geht’s:

Der Task

Die folgende XML-Datei (Download findet sich unten) legt eine Aufgabe an, die sich an das Event 18304 im passenden Eventlog als Auslöser hängt. Die Datei ist leicht erweitert, denn von sich aus geben Taks keine Details an die aufgerufenen Programme weiter. Möglich ist das aber sehr wohl, wie folgende Blogposts beschreiben:

[Reference The Event That Triggered Your Task – Otto Helweg – Management Matters]
https://blogs.technet.microsoft.com/otto/2007/11/09/reference-the-event-that-triggered-your-task/

[Task scheduler – Event Log Trigger – Include Event Data in mail | Blog for reference – Vijred]
https://vijredblog.wordpress.com/2014/03/21/task-scheduler-event-log-trigger-include-event-data-in-mail/

In der zunächst manuell erzeugten und dann exportierten Aufgabe fügt man also eine “ValueQuery” hinzu und definiert so die zu übergebenden Werte. Diese lassen sich dann mit der Syntax $(Variable) an das Programm übergeben. So sieht das dann aus:

image

Hier also die XML-Datei, reduziert auf das Wesentliche:

<?xml version=“1.0″ encoding=“UTF-16″?>
<Task version=“1.2″ xmlns=“
http://schemas.microsoft.com/windows/2004/02/mit/task“>
   <Triggers>
     <EventTrigger>
       <Enabled>true</Enabled>
       <Subscription>&lt;QueryList&gt;&lt;Query Id=“0″ Path=“Microsoft-Windows-Hyper-V-VMMS-Admin“&gt;&lt;Select Path=“Microsoft-Windows-Hyper-V-VMMS-Admin“&gt;*[System[Provider[@Name=’Microsoft-Windows-Hyper-V-VMMS‘] and EventID=18304]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
      <ValueQueries>
         <Value name=“VMName“>Event/UserData/VmlEventLog/VmName</Value>
       </ValueQueries>

     </EventTrigger>
   </Triggers>
   <Actions Context=“Author“>
     <Exec>
       <Command>powershell.exe</Command>
       <Arguments>-noprofile -ExecutionPolicy Unrestricted -file „E:\Daten\VM-Event\Disable-VMAutoCheckPoint.ps1“ -VMName $(VMName)</Arguments>
     </Exec>
   </Actions>
</Task>

Diese XML-Datei passt man in Zeile 15 an und hinterlegt dort den Pfad, an dem das PowerShell-Skript hinterlegt ist. Dann importiert man die Datei als neue Aufgabe.

Das Skript

Fehlt noch das PowerShell-Skript. Das ist eigentlich sehr simpel, denn es verändert nur eine Option an der VM. Dazu braucht es allerdings eine Parameterübergabe, die hier den Regeln schönen Codings entsprechend ausgeführt ist.

param(
  [string]$VMName
)
Set-VM -Name $VMName -AutomaticCheckpointsEnabled $false

# uncomment the follwing line and set a valid path to have the VM name logged
# $VMName | Out-File -FilePath E:\Daten\VM-Event\MyResult.txt -Append

Dieses Skript hinterlegt man an dem Pfad, der in der XML-Datei angegeben ist. Auf gemeinsam genutzten Systemen sollte man ggf. die Berechtigungen des Ordners anpassen, damit einem niemand ein manipuliertes Skript unterschiebt.

Der Download

Hier die beiden Skripte zum Download:

Download: Disable-VMAutoCheckPoint  Disable-VMAutoCheckPoint (1,1 KiB, 56-mal heruntergeladen, letzte Änderung am 20. Juni 2018)

Los geht’s!

Das war es auch schon. Erzeugt man nun eine neue VM, so öffnet sich kurz ein PowerShell-Fenster, das gleich wieder verschwindet. Danach ist bei der neuen VM die betreffende Option abgeschaltet:

image

© 2005-2019 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!