В том случае, если ваша виртуальная машина, запущенная на Hyper-V по каким-то причинам зависла, перестала отвечать, и не реагирует на кнопки включения/выключения/перезагрузки виртуальной машины в консоли Hyper-V, единственный быстрый способ принудительно остановить такую машину — «пристрелить» процесс на хостовой ОС, отвечающий за данную ВМ. Покажем как это сделать на Hyper-V, работающем на Windows Server 2016.
Итак, предположим, что одна из ВМ на Hyper-V зависла, гостевая ОС перестала отвечать, а кнопки «Turn Off», «Shut Down» и «Reset» в консоли Hyper-V Manager стали недоступны либо при нажатии возвращают ошибку:
Failed to change state
The operation cannot be performed while the object is in its current state
Чтобы принудительно остановить / перезапустить такую ВМ без перезагруки всего хостового сервера, нужно завершить процесс этой ВМ. Для этого нужно узнать GUID виртуальной машины.
Определить GUID ВМ, можно открыв в консоли управления Hyper–V Manager настройки сервера (Hyper–V Settings). В разделе Server указано местоположение конфигурационных файлов ВМ (в нашем примере D:\VMStore).
Перейдите в данный каталог и найдите каталог с именем вашей виртуальной машины. Нам требуется запомнить GUID, который указан в имени конфигурационных файлов ВМ.
Теперь нужно запустить диспетчер задач (Task Manager) и переключится на вкладку Details. Все виртуальные машины запускаются в рамках собственного экземпляра процесса vmwp.exe. Чтобы определить какой процесс за какую ВМ отвечает, нам нужен полученный ранее GUID зависшей ВМ. Найдите процесс vmwp.exe, в столбце User name которого указан полученный GUID. Завершите данный процесс (End Task).
Виртуальная машина будет остановлена. Теперь вы сможете делать с ней все что угодно.
Но! Гораздо проще найти и завершить процесс зависшей виртуальной машины с помощью PowerShell. В это случае нам понадобится только ее имя.
Получим GUID для ВМ с именем SVM-GUARDEDHOST1:
1 2 3 |
$VMGUID = (Get-VM "SVM-GUARDEDHOST1").ID |
Найдём идентификатор процесса ‘vmwp.exe’ для данного VMGUID:
1 2 3 |
$VMWMProc = (Get-WmiObject Win32_Process | ? {$_.Name -match 'VMWP' -and $_.CommandLine -match $VMGUID}) |
И с помощью Stop-Process принудительно завершим этот процесс:
1 2 3 |
Stop-Process ($VMWMProc.ProcessId) –Force |
Вот так несложно можно принудительно завершить рабочий процесс подвисшей виртуальной машины Hyper-V.