none
Hyper-V 2019 fährt Gäste nicht runter RRS feed

  • Frage

  • Hallo.

    Ich habe auf dem Hyper-V 2019 mehrere Windows 2019 Gäste, die (wie eingestellt) mit dem Host herunterfahren sollen. Das passiert aber offensichtlich nicht ordnungsgemäß, da mich die Gäste jedes Mal mit Kernel-Power, Windows wurde unerwartet heruntergefahren, begrüßen - BugCheckCode 0.Updates sind aktuell, die Integrationsdienste im Client aktiv. Ein manuelles Herunterfahren funktioniert sowohl im Client als auch aus dem Hyper-V Manager normal.

    Zwei Fragen dazu:

    • Ist dieser Fehler bei MS bekannt und akzeptiert bzw. ist man beim bugfixing? Diesen Fehler hatte ich bereits bei 2016 beobachtet, er ist wohl auch schon bei 2012 aufgetreten, wurde dort aber gefixt. Meine Internetrecherche zeigt, das dieser Fehler bereits 2018 gemeldet wurde.
    • Was mich ärgert ist, das ich nun leider bei jeder Anmeldung die Meldung der Ereignisprotokollierung (Kernel-Power) erhalte. Diese wird zwar ordnungsgemäß beantwortet, kommt aber trotzdem immer wieder (ohne Neustart). Die Frage, wie bekomme ich das weg?

    Ich habe bereits das Systemprotokoll gelöscht, das hilft nicht. Scheinbar merkt Windows sich das noch anderswo!?


    • Bearbeitet MP.Topper Montag, 22. April 2019 17:30
    Montag, 22. April 2019 17:28

Antworten

  • Ja, das lässt sich dann wohl nur via eigenem Skript erledigen.

    @befuerchau: die Seite war informativ, guter Hinweis.

    Ich habe es nun so gelöst - zwei Powershell-Skripte für's Herunterfahren bzw. Neustarten (Bsp. anbei, ohne Gewähr)

    #Alle laufenden VMs herunterfahren
    $LaufendeVMs = Get-VM | Where state -eq ‘running’
    foreach ($VM in $LaufendeVMs){
        # VM herunterfahren
        Stop-VM -Name $VM.name -Force
        # Warten das VM heruntergefahren ist
        While ((Get-VM | Where { $_.Name -eq $VM.Name -and $_.State -eq ‘running'}).Count -gt 0) {Start-Sleep 1}}
    
    Restart-Computer

    Ich musste das Beispiel von devblogs etwas anpassen:

    • Stop-VM statt Stop-Computer da ich auch Non-Windows Gäste habe
    • Statt Wait-Event (das wurde bei mir nicht gefeuert) habe ich eine Schleife auf Status eingebaut

    Funktioniert. 

    Das andere Problem mit dem immer wiederkehrenden Hinweis auf unerwartetes Herunterfahren ließ sich über einen abgesicherten Start lösen: Abgesicherter Neustart, Meldung quittieren, ein weiteres Mal Abgesicherter Neustart = Meldung kam nicht mehr.

    Damit wäre mein Problem erst einmal umgangen. 


    Mittwoch, 24. April 2019 17:00

Alle Antworten

  • Hallo MP.Topper,

    Andere Benutzer haben bereits über das Problem berichtet. Es wurde auch bei Microsoft gemeldet, jedoch mir ist nicht bekannt, ob dies inzwischen etwas gebracht hat. Leider weiß ich auch nicht mehr.

    Gruß

    Mihaela


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 23. April 2019 14:03
    Moderator
  • Ggf. ist die eingestellte Zeit (Default 2 Minuten) für das Shutdown einfach zu kurz?

    https://www.altaro.com/hyper-v/extending-hyper-vs-guest-grace-period-host-shutdown/

    Dienstag, 23. April 2019 14:13
  • Ja, diesen Artikel habe ich auch gelesen, und auf 600s eingestellt - das ändert nichts. Ich glaube, der Fehler besteht weniger im Abbruch der Sequenz sondern darin, das das Herunterfahren gar nicht erst getriggert wird.

    Danke trotzdem.

    Dienstag, 23. April 2019 15:52
  • Die Frage stellt sich dann, ob du Hyper-V normal beendest oder den Host per Shutdown runterfährst.
    Auch beim Hostshutdown kann man einen Timeout mitgeben der Hyper-V natürlich ebenso genug Zeit mitgeben muss.

    Hast du die VM-Eisntellungen geprüft?
    https://www.apc.com/us/en/faqs/FA159689/

    Dienstag, 23. April 2019 16:09
  • Wie eingangs bereits mitgegeben, die VMs sind so eingestellt, das sie heruntergefahren werden, mit dem Host. Wie im altaro Artikel beschrieben, habe ich die ShutdownTimeout hochgesetzt, so wie auch die WaitToKillServiceTimeout - das ändert alles nichts, das Verhalten bleibt identisch. Ich bleibe bei meiner Vermutung, das das Herunterfahren der VMs nicht getriggert wird, wenn der Host heruntergefahren wird.

    Gibt es vielleicht noch Ideen zur zweiten Frage? Auch wenn ich den Hinweis "Unerwartetes Herunterfahren" beantworte kommt er trotzdem bei jeder Anmeldung wieder, obwohl es keinen Neustart gegeben hat...!? Irgendwo merkt sich Windows das, denn ich habe bereits alle Protokolle gelöscht, der Hinweis kommt hartnäckig wieder.

    Danke & Grüße. Magnus

    Dienstag, 23. April 2019 17:04
  • "Ein manuelles Herunterfahren funktioniert sowohl im Client als auch aus dem Hyper-V Manager normal."

    Dies zeigt zumindest, dass Hyper-V den Shutdown doch korrekt über die Integrationsdienste weiterleitet so dass sich die VM's auch korrekt beenden.
    Aber wie fährst du den Hyper-V-Host denn runter?

    Alles was ich finden kann ist, dass es da wohl keinen Automatismus gibt (wieder mal) und dies jeder selber steuern muss:
    https://devblogs.microsoft.com/scripting/use-powershell-to-perform-an-orderly-shutdown-of-a-server-running-hyper-v/


    • Bearbeitet bfuerchau Mittwoch, 24. April 2019 08:15
    Mittwoch, 24. April 2019 08:12
  • Ja, das lässt sich dann wohl nur via eigenem Skript erledigen.

    @befuerchau: die Seite war informativ, guter Hinweis.

    Ich habe es nun so gelöst - zwei Powershell-Skripte für's Herunterfahren bzw. Neustarten (Bsp. anbei, ohne Gewähr)

    #Alle laufenden VMs herunterfahren
    $LaufendeVMs = Get-VM | Where state -eq ‘running’
    foreach ($VM in $LaufendeVMs){
        # VM herunterfahren
        Stop-VM -Name $VM.name -Force
        # Warten das VM heruntergefahren ist
        While ((Get-VM | Where { $_.Name -eq $VM.Name -and $_.State -eq ‘running'}).Count -gt 0) {Start-Sleep 1}}
    
    Restart-Computer

    Ich musste das Beispiel von devblogs etwas anpassen:

    • Stop-VM statt Stop-Computer da ich auch Non-Windows Gäste habe
    • Statt Wait-Event (das wurde bei mir nicht gefeuert) habe ich eine Schleife auf Status eingebaut

    Funktioniert. 

    Das andere Problem mit dem immer wiederkehrenden Hinweis auf unerwartetes Herunterfahren ließ sich über einen abgesicherten Start lösen: Abgesicherter Neustart, Meldung quittieren, ein weiteres Mal Abgesicherter Neustart = Meldung kam nicht mehr.

    Damit wäre mein Problem erst einmal umgangen. 


    Mittwoch, 24. April 2019 17:00
  • Schön wäre es natürlich, wenn Hyper-V per Kommando incl. dem Herunterfahren aller VM's mit anschließendem Shutdown des Computers und ggf. Restart vorhanden wäre.
    Aber an sowas hat Microsoft dann wohl nicht gedacht, somit muss jeder selber rumwurschteln.

    Zu diesem Thema gibt es auch noch mehr Links auf diverse Script-Lösungen.

    Dein Script fährt die VM's aber nacheinander runter.
    Ich würde das in 2 Schleifen machen.
    1. Foreach: Stop aller laufenden VM's initiieren
    2. While-Prüfung auf Ende aller VM's, wobei hier das Zählen der laufenden VM's ja bereits reicht.
    Damit kann das Runterfahren der VM's parallelisiert werden.


    Mittwoch, 24. April 2019 17:22
  • Nachdem bei meinem Server 2016 das gleiche Problem mit nicht sauber heruntergefahrenen VM's auftritt, habe ich die Idee von bfuerchau in das Skript von MP.Topper eingebaut.

    Es ist aber noch nicht auf alle Eventualitäten getestet, bei mir funktioniert es bislang:

    # alle laufenden VMs herunterfahren
    $laufendeVMs = Get-VM | Where state -eq 'running'
    foreach($vm in $laufendeVMs){
    	# VM herunterfahren
    	Stop-VM -Name $vm.name -AsJob
    }
    
    # warte, bis alle VMs beendet sind
    $maxSeconds = 120
    $seconds = 0
    do{
    	$running = 0
    	Start-Sleep 1
    	++$seconds
    	# laufen immer noch welche?
    	foreach($vm in $laufendeVMs){
    		if( $vm.state -eq 'running' ){
    			++$running;
    		}
    	}
    }while($running -gt 0 -and $seconds -lt $maxSeconds)
    
    # schieße alle noch laufenden VMs ab
    foreach($vm in $laufendeVMs){
    	if( $vm.state -eq 'running' ){
    		# VM herunterfahren
    		Stop-VM -Name $vm.name -Force -AsJob
    	}
    }
    
    # und warte, bis die letzte beendet ist
    while( (Get-VM | Where state -eq 'running').Count -gt 0 ){
    	Start-Sleep 1
    }
    
    Restart-Computer

    Freitag, 2. August 2019 09:12
  • Warum machst du das 2x?
    Reicht da einmal bei dir nicht?
    Freitag, 2. August 2019 09:22
  • in der ersten foreach werden die VMs ohne die Option "Force" heruntergefahren. Bei aktivierter Force-Option fuhr mein virtueller DC nicht sauber herunter.

    Danach wird 120 Sekunden lang geprüft, ob alle VMs heruntergefahren wurden. Wenn nein, dann werden sie mit der Option "Force" erzwungen heruntergefahren, mit eventuellem Datenverlust.

    Am Ende wird so lange gewartet, bis alle VMs aus sind.

    Freitag, 2. August 2019 10:02
  • Aber bringt der Force nicht dann genau die bekannten Probleme?
    Freitag, 2. August 2019 10:48
  • schon, aber die VM hat zumindest die Chance, ohne Force sauber herunterzufahren.

    Wenn das nicht klappt, dann wird die VM abgeschossen...

    Freitag, 2. August 2019 10:55
  • hm, hätte besser testen sollen:

    da der Server sich nicht sauber herunterfahren lässt, wenn noch ein User angemeldet ist, klappt das Herunterfahren dann doch nur mit Force. Bei meinen Versuchen habe ich aber nun trotzdem keine Hinweismeldung mehr, dass der Server unerwartet heruntergefahren wurde, warum auch immer???

    Ich habe im Augenblick keine Möglichkeit gefunden, alle User auf einer VM über den Hypervisor mit powershell herunterzufahren. Das wäre die beste Möglichkeit, die mir einfällt.

    Freitag, 2. August 2019 11:41
  • Dann mach doch einen Invoke-Command in die VM und einen internen shutdown.
    Die VM soll sich selber beenden.
    Dann nach Ablauf der 2 Minuten einen 2. Invoke mit einem "shutdown -f".
    Freitag, 2. August 2019 13:45
  • Gute Idee, das habe ich nun in das Skript eingebaut:

    "Alle laufenden VMs herunterfahren."
    $laufendeVMs = Get-VM | Where state -eq 'running'
    foreach($vm in $laufendeVMs){
    	if( $vm.name -eq "DC" ){
    		"Fahre den DC herunter"
    		# den DomainController herunterfahren. Loggt auch noch angemeldete User ab.
    		# Zuvor wurde das Kennwort durch folgende Befehle abgesichert in einer Datei abgelegt:
    		# read-host -assecurestring | convertfrom-securestring | out-file C:\admin\scripts\dcCredential.txt
    		# Das Kennwort muss dabei in der nächsten Zeile durch den Benutzer eingeben werden.
    		
    		# hole das Kennwort aus der zuvor erzeugten Datei
    		$password = get-content C:\admin\scripts\dcCredential.txt | convertto-securestring
    		$credentials = new-object -typename System.Management.Automation.PSCredential -ArgumentList "meineDomain\shutdownUser",$password
    		Invoke-Command -VMName DC -credential $credentials -ScriptBlock { shutdown /s }
    	}else{
    		"Fahre " + $vm.name + " herunter"
    		Stop-VM -Name $vm.name -AsJob
    	}
    }
    
    # warte, bis alle VMs beendet sind
    $maxSeconds = 120
    "Warte maximal " + $maxSeconds + " Sekunden, bis alle VMs heruntergefahren sind."
    $seconds = 0
    do{
    	$running = 0
    	Start-Sleep 1
    	++$seconds
    	# laufen immer noch welche?
    	foreach($vm in $laufendeVMs){
    		if( $vm.state -eq 'running' ){
    			++$running;
    			if( $seconds % 10 -eq 0 ){
    				"VM " + $vm.name + " laeuft noch, warte noch maximal " + ($maxSeconds-$seconds) + " Sekunden."
    			}
    		}
    	}
    }while($running -gt 0 -and $seconds -lt $maxSeconds)
    
    "Schieße alle noch laufenden VMs ab."
    foreach($vm in $laufendeVMs){
    	if( $vm.state -eq 'running' ){
    		# VM herunterfahren
    		Stop-VM -Name $vm.name -Force -AsJob
    	}
    }
    "und warte, bis die letzte beendet ist."
    while( (Get-VM | Where state -eq 'running').Count -gt 0 ){
    	Start-Sleep 1
    }

    "DC" ist mein Domaincontroller, der wird mit Deiner Idee über Invoke-Command heruntergefahren. Die anderen VM's mit teilweise Linux werden über Stop-VM beendet.

    Die 120 Sekunden, bis das Herunterfahren erzwungen wird, sind wohl für die Installation von Windows-Updates viel zu kurz. Wie sich das Ganze dann verhält, konnte ich noch nicht testen.

    Samstag, 3. August 2019 09:16
  • Dann solltest du die Windows-Updates uhrzeitmäßig mit deinem Shutdown synchronisieren.
    Also Updates immer um 22:00 Uhr, Shutdown immer um 01:00 Uhr, dann hat der Update 3 Stunden Zeit.

    Auch Linux erlaubt "Remote-Command":
    https://unix.stackexchange.com/questions/116672/running-linux-script-on-remote-linux-system-using-putty

    Suche da auch mal nach "rexec, rsh".

    Samstag, 3. August 2019 12:54
  • Der DC soll bei mir weitgehend durchlaufen, die Idee mit dem Installationszeitpunkt der Updates ist aber trotzdem gut, werde ich umsetzen.

    Die Linuxmaschinen haben bislang noch keine Probleme bereitet, kann aber auch daran liegen, dass die noch kaum was zu tun haben. Wenn das Herunterfahren über Stop-VM dann ein Problem sein sollte, werde ich mich mit deinem Link beschäftigen.

    Danke für die Unterstützung, das war mein erstes (zusammengeklautes) powershell-Skript.

    Gruß
    Kurt


    • Bearbeitet baschdler Samstag, 3. August 2019 17:09
    Samstag, 3. August 2019 17:09
  • Dann wäre es noch besonders nett, die Einträge, die dir geholfen haben, zu markeiren;-).
    Sonntag, 4. August 2019 12:03