Hyper-V shut down lento ed errore 7043 parte 2

Nel post Hyper-V shut down lento ed errore 7043 ho descritto uno scenario che ho avuto modo di esaminare e ho indicato possibili cause e soluzioni.

In seguito ho avuto la possibilità di analizzare più approfonditamente il caso specifico e di seguito riporto le cause del problema e la soluzione che ho adottato.

Causa della lentezza dello shut down

La causa nello scenario che ho analizzato è da imputare al fatto che due VM eseguite sul sistema non restituisco al servizio Hyper-V Virtual Machine Management (VMMS) l’informazione che si sono arrestate.

Infatti se le VM vengono arrestate manualmente e poi viene eseguito lo shutdown non si presenta alcun tipo di rallentamento.

Lo scenario che ho avuto modo di analizzare era basato su Windows Server 2012 R2 con solo il ruolo Hyper-V e tutti gli aggiornamenti installi. Le VM erano degli XP SP3 migrati da Virtual Server.

Il problema è rimasto anche dopo aver eseguito sulle VM le seguenti operazioni:

  • Disinstallato le Virtual Additions e installato gli Integration Services di WS 2012 R2 (versione 6.2.9600.16384)
  • Installato gli ultimi aggiornamenti del sistema operativo sulle VM
  • Disabilitato lo screensaver
  • Disabilitato le opzioni di risparmio energetico

Dal momento che sulle VM vi erano installati una serie di software industriali su cui erano state eseguite una serie di configurazioni la cui reimpostazione in caso di reinstallazione del sistema avrebbe comportato un certo numero di ore di lavoro e l’interazione con tecnici diversi, ho deciso di gestire il problema utilizzando uno script di arresto che preventivamente arrestasse le VM.

Di seguito lo script che ho utilizzato:

Arresto.ps1

$wsShell = new-object -comobject wscript.shell
$answer = $wsShell.popup(“Confermi l’arresto del sistema?”, 0, “Arresto del sistema”, 4)

If ($answer -eq 6)
{
  # Arresto delle VM Forzato
  If ((Get-VM | Where State -eq Running).Count -ge 0)
  {
    Write-Host “Arresto delle VM in corso…”
    Get-VM | Where State -eq Running | Stop-VM -Force -Verbose
      
    Write-Host “Arresto delle VM eseguito”
  }

  # Arresto del computer
  Write-Host “Arresto del computer in corso…”
  Stop-Computer -Force –Verbose

  #Pause
  cmd /c pause
}

Si noti come in PowerShell sia possibile gestire l’interazione con l’utente visualizzando una dialog box di conferma tramite l’utilizzo di wscript.shell. A riguardo si veda Provide a Yes/No Prompt in Windows PowerShell (in alternativa sarebbe anche possibile visualizzare una MessageBox utilizzando il namesoace System.Windows.Forms del .NET Framework, a riguardo si veda PowerShell Message Box Function).

Si noti anche la gestione finale del Pause per consentire di visualizzare eventuali messaggio di errori che hanno bloccato l’esecuzione dello. Io ho adottato la tecnica di richiamare il comando pause del DOS, ma al seguente è possibile avere indicazioni per soluzioni alternative Rebuild the Pause Command with PowerShell.

Nel caso sia necessario eseguire lo script tramite un utente senza privilegi amministrativi si veda questo post Hyper-V 2012 R2 delega amministrativa.