Писать о
power race я начал не случайно. Это "жжж" неспроста (с). После виртуализации всего и вся, для меня настало время подумать о корректном завершении работы виртуальных машин и самого хоста ESXi по сигналу от UPS.
Нужно сказать, что вопрос этот не первый год будоражит умы. Решений - хороших и разных, не то что бы много, но они есть. Чаще конечно попадаются "разные", где вам предлагают развернуть
vMA, настроить
apcupsd и т.д. и т.п, но
встречаются и православные shell-скрипты, работающие на стороне хоста. Последние выглядят как-то попроще, понароднее. Я и сам недавно изваял скрипт на стописят строк для корректного гашения виртуалок. Присмотрелся - ба! Дурная работа - такая дурная!
Тут вот ведь что выяснилось: некоторые, возможно, будут удивлены, но в каталоге /sbin хоста ESXi лежит файло poweroff, которое, не смотря на страшное название, работает совсем не так брутально как кажется. Вы не поверите, но /sbin/poweroff корректно завершает работу всех запущенных виртуальных машин, причем, делает это в правильном порядке, определяемом настройками Virtual Machine Startup/Shutdown, и выключает хост.
Да, в интернете вы найдете, что /sbin/poweroff гасит хост и виртуалки жестко, попросту выключая питание. Но, по крайней мере у меня, в свежем лицензионном VMware vSphere 5 Essentials Bundle (VMKernel Release Build 623860) все происходит ровно так, как написано выше. Проверено електроникой. Особо недоверчивые могут перед /sbin/poweroff выполнить /sbin/shutdown.sh (присмотритесь к содержимому этого скрипта и скриптов, которые он вызывает).
Итак, для корректного завершения работы виртуальных машин и самого хоста достаточно установить куда-нибудь
PuTTY и выполнить в командной строке:C:\Program Files\PuTTY>plink root@host -pw password "nohup /sbin/poweroff &"
где host - имя или IP хоста ESXi, а password - соответственно, пароль рута.
Теперь рассмотрим практическую ситуацию. К хосту ESXi USB-шнурком подключен Smart UPS. С помощью
USB-passthrough, он проброшен в одну из виртуальных машин хоста. На машине установлено соответствующее программное обеспечение. Ладно, не будем ходить вокруг да около, UPS - это APC Smart UPS 1500RM, программное обеспечение - APC PowerChute Business Edition 9.0.1, а виртуальная машина - Windows Server Standard 2003R2. Так будет еще нагляднее.
PowerChute позволяет перед завершением работы машины, на которую он установлен, запускать т.н. командные файлы. Делает он это своеобразно, к чему мы еще вернемся, а пока создадим один такой. В каталоге C:\Program Files\APC\PowerChute Business Edition\agent\cmdfiles заводим файл shutdownesxi.cmd со следующим содержимым:@START "" "C:\Program Files\PuTTY\plink.exe" root@host -pw password "nohup /sbin/poweroff &"
PuTTY, понятно, установлен; смысл параметров host и password - тот же.
Чтобы PowerChute мог выполнить этот файл, нужно найти службу "APC PBE Agent" и разрешить ей взаимодействовать с рабочим столом (вкладка "Вход в систему" в свойствах службы). У меня на поиск такого простого (и, главное, очевидного) решения ушли часы, а вам эта инфа достается задаром(( Ок, проехали. Положим, все работает и PowerChute настроен на запуск shutdownesxi.cmd перед завершением работы системы. И вот, когда ну казалось бы уже все, уже пора кричать: "PROFIT!", выясняются некоторые моменты...
Хост не просыпается после
power race... Та-дамм!!! А получается, по всей видимости, вот что: /sbin/poweroff гасит виртуальную машину, на которую установлен PowerChute, раньше чем PowerChute успевает сообщить о завершении работы системы UPS'у. Это догадка. Я не знаю наверняка, что там происходит между ними, но, если работу системы завершает не PowerChute Agent, а другой процесс, или даже пользователь с консоли, то UPS при power race не производит powerdown cycle, т.е. не отключает на короткое время нагрузку. Логично объяснить это тем, что он думает будто система продолжает работать.
Где же выход из этого исхода?(с) Очевидно, что необходимо дать агенту PowerChute самому завершить работу машины, к которой подключен UPS. Тут конечно же мне снова пришлось писать скрипт, но на этот раз не чрезмерный, а строк эдак в писят. Его нужно скачать
отсюда, создать в корне datastore хоста ESXi каталог _UPS, положить скрипт туда и поставить на него права 0755. Соответственно, содержимое файла shutdownesxi.cmd, запускаемого PowerChute перед завершением работы, теперь будет выглядеть так:
@START "" "C:\Program Files\PuTTY\plink.exe" root@host -pw password "nohup ./vmfs/volumes/datastore1/_UPS/shutdownhost.sh &"
где datastore1 - имя вашего хранилища.
Коротко говоря, скрипт сначала ждет (но не более UPS_VM_SHUTDOWN_DURATION секунд) пока PowerChute Agent завершит работу виртуальной машины, к которой подключен UPS (UPS_VM_NAME), а затем выполняет все тот же /sbin/poweroff. Параметры UPS_VM_NAME (имя машины, как вы его видите в VMware vSphere Client) и UPS_VM_SHUTDOWN_DURATION нужно поправить под ваши нужды в теле самого скрипта. Своеобразие PowerChute при исполнении командных файлов пользователя заключается в том, что нет никакого способа задать "Operating System Delay" меньше одной минуты:
Логика там такова: сначала PowerChute выполняет командный файл в течение интервала "Command File Duration", а уже затем завершает работу операционной системы. Понятно, что по этой логике "Command File Duration" = "Operating System Delay", и если первое еще можно как-то там через Agent Web Interface снизить до секунд, то второе стоит колом и никаким регулировкам в сторону понижения ни через Agent Web Interface, ни через APC PowerChute Business Edition Console не поддается. Так что имейте ввиду, что UPS_VM_SHUTDOWN_DURATION - это та самая минута (Operating System Delay) + предельное время необходимое виртуальной машине, к которой подключен UPS, на завершение работы (т.е. этот параметр не может быть меньше Operating System Delay).
Это все, т.е. нет. Во-первых, раз уж в командном файле shutdownesxi.cmd в открытом виде лежит пароль рута хоста ESXi, то надо ограничить права на эту папку, чтобы никто - ничего. Второй момент в том, что раз уж /sbin/poweroff завершает работу виртуальных машин в порядке, определяемом настройками Virtual Machine Startup/Shutdown, логичным выглядит поставить UPS и PowerChute на машину, запускаемую при автостарте последней, т.к. Shutdown выполняется в обратном порядке, и такая настройка будет больше соответствовать логике скрипта.