От редакции VM Guru: Данная статья от одного из авторов VM Guru решает проблему доступности виртуальных машин, иногда возникающую у пользователей VMware vSphere при эксплуатации виртуальной инфраструктуры. Благодарим Андрея за предоставленный материал.
Вне зависимости от издания VMware ESXi 4.1 (будь то бесплатная версия, или лицензия Enterprise Plus), доступна функция Configuration=>Software=>Virtual Machine Startup/Shutdown (рис.1), которая позволяет отработать ситуацию с выключением питания на физическом сервере и автоматически запускает виртуальные машины:
Рис.1 Virtual Machine Startup/Shutdown
Существует три режима запуска виртуальных машин:
Автоматический запуск (Automatic Startup).
Режим запуска по любому приказу (Any Order).
Ручной запуск (Manual Startup).
В изданиях VMware vSphere 4, где используется функция ручной миграции работающих виртуальных машин на другой физический сервер – VMotion, или включена служба балансировки нагрузки – DRS, после миграции виртуальной машины на другой физический сервер происходит сброс настройки автоматического запуска (Automatic Startup) этой виртуальной машины в режим запуска по любому приказу (Any Order).
В случае если поднят кластер VMware HA и по какой-либо причине физический сервер, на котором работает виртуальная машина с режимом запуска Any Order, выключается, то данная виртуальная машина согласно политикам VMware HA перезапускается на другом физическом сервере. Но существует случай, когда питание в ЦОД пропало вообще и времени работы бесперебойных блоков питания не хватает, чтобы дождаться подачи на них напряжения, т.е. все физические сервера в кластере выключаются. И вот в данной ситуации после возобновления и загрузки физических серверов, виртуальная машина, настройки запуска которой изменились при миграции с Automatic Startup на Any Order, автоматически не запустится.
Отказываться от таких возможностей как VMotion и DRS не хочется по следующим причинам: 1) удобно и полезно; 2) за этот функционал заплачено дополнительно приличная сумма денег. Отслеживать каждую миграцию и руками заново выставлять настройки автозапуска виртуальных машин занятие бестолковое, это время можно потратить более продуктивно. Каким образом совместить миграции виртуальных машин с их корректным автозапуском? Рассмотрим подробнее процессы, которые происходят внутри гипервизора VMware ESXi при миграции виртуальной машины, настроенной на Automatic Startup.
Настройки автозапуска виртуальных машин, которые мы устанавливаем посредством VMware vSphere Client (рис.1), сохраняются в файле:
/etc/vmware/hostd/vmAutoStart.xml
Во время старта системы ESXi вызывается скрипт /sbin/vmware-autostart.sh, который запускает виртуальные машины определенные в конфигурационном файле vmAutoStart.xml. Приведем листингvmAutoStart.xml, соответствующего настройке, показанной на рисунке 1:
Разберем этот файл. В нем 6 виртуальных машин для запуска (id0-5), следовательно, виртуальные машины с типом запуска Manual Startup здесь не определенны. Каждая виртуальная машина определенна по номеру id, который она получат, когда регистрируется на хосте ESXi, он находится между тегов <moid>1360</moid>. Соответствие этого id к имени виртуальной машины можно получить командой:
vim-cmd vmsvc/getallvms
Виртуальные машины запускаются по очереди. Эта очередь определяется тегом <startOrder>5</startOrder>. Виртуальные машины, которые запускаются в режиме Any Order имеют следующий тег <startOrder>-1</startOrder>.
Способ №1: Как делать не надо:)
Задачу можно свести к редактированию файла /etc/vmware/hostd/vmAutoStart.xml, в котором нужно найти и изменить все теги <startOrder>-1</startOrder>, заменяя их на<startOrder>номер очереди автостарта</startOrder>. После чего необходимо перезапустить сервисную консоль, чтобы редактирование этого файла вступило в силу, следующей командой:
/etc/init.d/hostd restart
Автоматизирует эти действия следующий скрипт:
#!/bin/ash VMn=`grep -c '<startOrder>-1' /etc/vmware/hostd/vmAutoStart.xml` if [ "$VMn" -ne "0" ] then VM=`grep -c '<startOrder>' /etc/vmware/hostd/vmAutoStart.xml` N=`expr $VM - $VMn` grep -n "startOrder>-1" /etc/vmware/hostd/vmAutoStart.xml|cut -d' ' -f1|sed 's/://g'|\ while read s do pat=' ' N=`expr $N + 1` pat="startOrder>"$N sed -i "$s s/startOrder>-1/$pat/" /etc/vmware/hostd/vmAutoStart.xml done /etc/init.d/hostd restart fi
Скрипт со своей задачей справляется полностью. Но во время выполнения команды /etc/init.d/hostdrestart, которая является частью команды перезапуска сервисной консоли (/sbin/service.shrestart), на короткое время теряется связь с vCenter, чего достаточно для прерывания любой операции над хостом. Поэтому данный способ оказался непригоден для использования в Production-среде.
Способ №2:
Среди набора команд vim-cmd существует следующая ветка:
vim-cmd hostsvc/autostartmanager
которая позволяет управлять конфигурацией менеджера автозапуска виртуальных машин. Среди команд этой ветки интересна следующая:
Таким образом, задача сводится к тому, чтобы для всех машин с <startOrder>-1</startOrder> получить VMId (в файле /etc/vmware/hostd/vmAutoStart.xml он соответствует цифре, которая расположена между тегами <moid>VMId</moid>), номер очереди запуска StartOrder, ипередатьэтипараметрыкоманде vim-cmd hostsvc/autostartmanager/update_autostartentry.
Данный способ лишен недостатка Способа №1, а также использует встроенный механизм управления автозапуском виртуальных машин, что минимизирует вероятность некорректной работы скрипта.
Скрипт необходимо разместить на централизованном хранилище по двум причинам:
После перезагрузки гипервизора ESXi из системных папок удаляются посторонние файлы.
Разместив скрипт на централизованном хранилище, он становится доступным со всех хостов ESXi.
Далее делаем скрипт исполняемым:
chmod 777 /vmfs/volumes/Path/easyStartupScript.sh
Для того, чтобы скрипт запускался автоматически, редактируем файл планировщика заданий /var/spool/cron/crontabs/root:
Чтобы изменения файла /var/spool/cron/crontabs/root вступили в силу, необходимо перезапустить демон crond, получаем номер процесса:
cat /var/run/crond.pid
Полученный номер используем для того, чтобы «убить» процесс crond:
kill № процесса (например: kill 4096)
Перезапускаем процесс crond:
crond
После этого скрипт будет выполнятся каждые 5 минут. Но следует обратить внимание, что после перезагрузки хостов ESXi файл /var/spool/cron/crontabs/rootостанется девственно чистым и строка, которая в него была вписана, пропадет. Чтобы генерировать задание автоматического запуска после перезагрузки хоста ESXi необходимо в файл /etc/rc.local добавить следующие три строчки: