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