Иногда сталкиваюсь с тем, что виртуальная машина на хосте 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
второе мне помогло…
второе мне помогло: аналогичная ситуация, помогло