Як зупинити зависла віртуальну машину на Hyper-V?

Якщо ваша віртуальна машина, запущена на хості Hyper-V зависла з якихось причин, перестала відповідати, і не реагує на кнопки включення, виключення, перезавантаження в консолі Hyper-V, єдиний швидкий спосіб примусово зупинити таку машину - завершити процес цієї ВМ в хостовой ОС. Покажемо, як примусово перезавантажити ВМ в Hyper-V на Windows Server 2016/2019 без перезавантаження всього сервера і запущених ВМ (якщо у вас немає HA кластера Hyper-V і Live-Migration).

зміст:

  • Віртуальна машина Hyper-V зависла в статусі Stopping, Starting
  • Помилка Hyper-V: Connecting to Virtual Machine Management service
  • Завершення процесу зависла ВМ за допомогою Task Manager
  • Скинути зависла ВМ на Hyper-V VM за допомогою PowerShell
  • Hyper-V: Чи не вдалося змінити стан віртуальної машини

Віртуальна машина Hyper-V зависла в статусі Stopping, Starting

Отже, припустимо, що одна з ВМ на Hyper-V зависла в стані Stopping (Stopping-Critical) / Starting (Starting 10%).

Гостьова ОС перестала відповідати, а кнопки "Turn Off", "Shut Down" і "Reset" в консолі Hyper-V Manager стали недоступні або при натисканні повертають помилку:

Отже, припустимо, що одна з ВМ на Hyper-V зависла, гостьова ОС перестала відповідати, а кнопки «Turn Off», «Shut Down» і «Reset» в консолі Hyper-V Manager стали недоступні або при натисканні повертають помилку:

Failed to change state The operation can not be performed while the object is in its current state 

Помилка Hyper-V: Connecting to Virtual Machine Management service

Якщо ваш Hyper-V не відображує віртуальні машини в консолі Hyper-V Manager, повертаючи помилку «Connecting to Virtual Machine Management service«, Вам потрібно перезапустити процес vmms.exe (Hyper-V Virtual Machine Management service). Це безпечна операція і не перерве роботу запушених віртуальних машин. Найпростіше перезапустити процес vmms.exe через службу vmms і через консоль services.msc або командою:

Get-Service vmms | Restart-Service

Завершення процесу зависла ВМ за допомогою Task Manager

Єдиний спосіб примусово вимкнути / перезапустити таку зависла віртуальну машину без перезавантаження всього хостового сервера Hyper-V - завершити її робочий процес на гостьовий ОС. Все ВМ на хості Hyper-V запускаються за допомогою процесу vmwp.exe (Virtual Machine Worker Process). Для пошуку процесу потрібно дізнатися GUID віртуальної машини.

Визначити GUID ВМ можна через консоль управління Hyper-V Manager. Відкрийте настройки сервера (Hyper-V Settings). У розділі Server зазначено каталог, в якому зберігаються конфігураційні файлів ВМ (в нашому прикладі D: \ VMStore).

Відкрийте цей каталог в File Explorer і знайдіть каталог з ім'ям зависла віртуальної машини. Скопіюйте GUID, який вказаний в імені конфігураційного файлу ВМ з розширенням * .vmcx.

Тепер потрібно запустити диспетчер задач (Task Manager) І перейти на вкладку Details. Всі віртуальні машини запускаються в рамках власного примірника процесу vmwp.exe. Щоб визначити який процес за яку ВМ відповідає, нам потрібен отриманий раніше GUID зависла ВМ. Знайдіть процес vmwp.exe, у якого в стовпці User name вказано GUID вашої ВМ. Завершіть цей процес (End Task).

Віртуальна машина буде примусово зупинено. Тепер ви зможете робити з нею все що завгодно.

Скинути зависла ВМ на Hyper-V VM за допомогою PowerShell

Набагато простіше знайти і завершити процес зависла віртуальної машини за допомогою PowerShell. Запустіть консоль PowerShell з правами адміністратора (обліковий запис повинен складатися в локальній групі Hyper-V administrators).

В цьому випадку вбудований командлет Stop-VM не дозволить вам вимкнути ВМ. Якщо спробувати виконати команду Stop-VM -Force, вона також зависає. Очевидно очікує відповіді від ВМ.

У цьому випадку також потрібно завершити процес ВМ по її ID. Можна отримати GUID ВМ з по її імені. Наприклад, для ВМ з ім'ям SVM-GUARDEDHOST1, виконайте команду:

$ VMGUID = (Get-VM "SVM-GUARDEDHOST1"). ID

Якщо ви не хочете набирати повне ім'я ВМ, можете вивести список всіх ВМ, зареєстрованих на даному хості Hyper-V:

Get-VM | Select Name, Id

Скопіюйте GUID потрібної ВМ з отриманого списку.

Тепер потрібно знайди ідентифікатор процесу (PID) 'vmwp.exe' для вашого VMGUID:

$ VMWMProc = (Get-WmiObject Win32_Process |? $ _. Name -match 'VMWP' -and $ _. CommandLine -match $ VMGUID)

Потім за допомогою команди Stop-Process потрібно примусово завершити цей процес:

Stop-Process ($ VMWMProc.ProcessId) -Force

Ось так нескладно можна примусово завершити робочий процес підвішеному віртуальної машини Hyper-V.

Порада. У нас також описана аналогічна процедура по завершенню процесу зависла ВМ на хості VMWare ESXi.

Hyper-V: Чи не вдалося змінити стан віртуальної машини

Іноді буває, що навіть після завершення завислого процесу ви не можете включити ВМ і вона зависає в статусі Starting з помилкою:

Virtual Machine Connection Неможливо змінити стан. Failed to Change State.

В цьому випадку перевірте наступні варіанти:

  • Перевірте що на диску, на якому зберігаються файли ВМ досить вільного місця;
  • Якщо в налаштуваннях ВМ підключений ISO образ, перевірте його доступність;
  • Перевірте мережеві настройки ВМ. Віртуальні мережеві адаптери повинні бути підключені до існуючого віртуального комутатора Hyper-V (не повинно бути статусу Network Adapter - Configuration Error);
  • Перевірте, що служба Hyper-V Virtual Management Service (VMMS) запущено, і не зависла в статусі Stopping;
  • Переконайтеся, що ваш антивірус не блокує доступ до файлів ВМ. Додайте шляху до каталогу ВМ в виключення антивіруса (див. Як додати виключення у вбудований антивірус Windows Server 2016 - Windows Defender);
  • Перевірте помилки в журналі подій Event Viewer -> Applications and Services Logs -> Microsoft -> Windows -> Hyper-V-Worker.