Иногда сталкиваюсь с тем, что виртуальная машина на хосте VMWare ESXi зависает и не отвечает на команды перезагрузки или выключения из веб-интерфейса клиента vSphere. В этой статье разберемся как принудительно остановить зависшей виртуальную машину VMWare.
Если процесс виртуальной машины на сервере ESXi завис, она перестает реагировать на команды Reset/Power Off, и на любое действие выдает ошибку вида:
-
The attempted operation cannot be performed in the current state; -
Another task is already in progress; -
The virtual machine might be performing concurrent operations. Actions: Complete the concurrent operation and retry the power-off operation. The virtual machine is in an invalid state.
Вы можете вручную остановить процесс зависшей ВМ на хосте ESXi из локального командной строки ESXi Shell или PowerCLI без перезагрузки сервера. Имейте в виду, что принудительное выключение ВМ может привести к потере данных в гостевой ОС (аналогично ситуации с отключением кабеля питания на физическом компьютере).
- Сначала определите на каком ESXi хосте запущена зависшая виртуальная машина;

- Откройте vSphere Client, найдите ВМ. Имя хоста, на котором запущена ВМ, указано на вкладке Summary в секции Related Object -> Host;
- Включите SSH доступ на этом ESXi хосте;
- Подключитесь к ESXi с помощью SSH клиента (можно использовать встроенный ssh клиент Windows);
- Выведите спиcок запущенных ВМ:

$ esxcli vm process list - Скопируйте идентификатор нужной виртуальной машины (World ID);
- Чтобы принудительно завершить процесс виртуальной машины в ESXi используется команда:
$ esxcli vm process kill --type=[soft,hard,force] --world-id=WorldNumber
Есть три типа завершения процесса виртуальной машины:
- Soft – самый безопасный способ завершить VMX процесс (похож на
kill -SIGTERM); - Hard – немедленное завершение процесса ВМ (
kill -9); - Force – используется в последнюю очередь, если другие опции не помогли.
Попробуйте мягко остановить ВМ с указанным ID:
$ esxcli vm process kill --type=soft -w=25089429
![]()
ВМ должна выключиться.
$ esxcli vm process kill -t=soft -w=`esxcli vm process list | grep -A2 "hq-rds01" | grep World | awk '{print $3}'`
Можно отключить зависшую виртуальную машину с помощью PowerShell (это удобно, т.к. при подключении к vCenter вам не нужно искать хост, на котором запушена ВМ и включать SSH доступ). Подключитесь к vCenter с помощью PowerCLI и проверьте, что ВМ запущена:
get-vm 'web2' | select name,PowerStates

Принудительно остановите процесс ВМ:
stop-vm -kill "web2" -confirm:$false

Также вы можете остановить зависшую виртуальную машину с помощью консольной утилиты ESXTOP.
В SSH сессии введите команду
esxtop
, затем нажмите
c
для отображения ресурсов CPU и
shift + V
, чтобы отображать только процессы вириальных машин

Затем нажмите
f
(выбрать отображаемы поля),
c
(отобразить поле LWID- Leader World Id) и нажмите
Enter
.

Найдите вашу ВМ в списке и запомните ее LWID. Чтобы остановить процесс ВМ, нажмите
k
(kill) и наберите LWID идентфикатор ВМ, которую нужно выключить.
Последний способ жёсткого выключения виртуальной машины – воспользоваться утилитой kill. Такой способ позволит остановить не только ВМ, но и все дочерние процессы.
Получите ID родительского процесса ВМ:
ps | grep "hq-rds01"
Завершите процесс ВМ:
kill -9 527888

После такого “hard reset”, установленная ОС запустится в режиме восстановления (в случае гостевой Windows, запустится среда Windows Recovery Environment).
$ /etc/init.d/hostd restart
$ /etc/init.d/vpxa restart



+5 Спасибо, очень помог!
А нет ли лекарства, чтобы виртуалки не зависали таким образом ? На сервере крутится единственная включенная вируталка с win2008r2/sql2008r2. Виснет она строго по ночам, без каких либо выявленных закономерностей: может месяцами не виснуть, может 2 раза за ночь. Достало просыпаться по ночам и перезагружать.
Странно — у меня баг с зависанием виртуальной машиной на ESXi встречался не столько часто…
Возможно стоит для начала обновить версию до последней версию ESXi и VMtools на гостевой ОС.
Если ничего не поможет — придется прикручивать какой-нибудь костыль в виде скрипта, периодически запускающегося на хосте ESXi и проверяющий доступность определенного сервиса на виртуалке (хотя бы тем же telnet-ом). Если сервис не отвечает — выполняем скрипт перезапуска виртуалки (по мотивам этого мануала)
На текнете порекомендовали накатить http://support.microsoft.com/kb/2465772/en-us вот этот хотфикс. Пока не висло. Если зависнет — отпишусь здесь. если нет — тоже отпишусь если вспомню =)
Спасибо за инфу!
У меня были случаи подвисания виртуальных машин с Linux, Windows и FreeBSD — так что решение, похоже, не универсальное. Скорее тут какой-то глюх самого ESXi.
В любом случае по результатам, пожалуйста, отпишитесь…
К сожалению не помогла заплатка. зависания всё равно случаются.
Может память или ядра неправильно распределены?
Я заметил что бывают торможения всех виртуалок и начал оставлять запас по мощности.
Хорошая статья, спасибо!
Исправь опечатку: get-vm “web2″ | select name,PowerStates ‘s’ на конце PowerState лишняя
столкнулся с похожей херней виртулка Ubuntu, остановлена, esxcli vm process list — ни чего тут нет. и с ней ни чего нельзя сделать (Delete, Rename,Unregistrer, Poweron) ответ один Failed — The attempted operation cannot be performed in the current state (Powered off). еще погуглю но наверно придется перезагружать host.
Client version:
1.34.8
Client build number:
17417756
ESXi version:
7.0.2
ESXi build number:
17867351
1)Unregistred Registered
2)через ssh который надо включить в Services
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
второе мне помогло…
второе мне помогло: аналогичная ситуация, помогло