Автозапуск и автовыключение ВМ в VmWare ESXi 5.0 Update 1

в 17:09, , рубрики: ESXi, VMware, виртуализация, Песочница, метки: , ,

Решил я начать внедрять виртуализацию в одном государственно учреждении. Мой выбор пал сначала на Citrix XenServer, т.к. в нем можно было организовать программный RAID1 (т.к. из-за нехватки бюджета в сервере не был установлен аппаратный RAID-контроллер), но потыкавшись с ним все таки выбил деньги на аппаратный RAID-контроллер и перешел на VmWare ESXi 5.0. Что хорошо, оба они предоставляются бесплатно.

Все было прекрасно, нужные задачи были виртуализированны, виртуалки исправно работали, но тут случился Update 1 для ESXi 5.0. После обновления перестали работать функции автозапуска и автовыключения виртуальных машин. Казалось бы, мелочь, но питание у нас оставляло желать лучшего, и периодически возникал вопрос с автоматическим стартом виртуалок, после перезагрузки самого сервера. Ну и иногда сервер тоже приходится выключать, и для этого приходилось подключаться VMware vSphere Client к гипервизору и поочереди гасить виртуалки, что было очень лень.

Покопавшись в сети, был найден способ, как включать ВМ при запуске сервера написанием скрипта и вызовом его из /etc/rc.local.

Но хотелось, что бы и выключение отрабатывало корректно, правки в /etc/inittab не помогали. Правки файлов типа /sbin/shutdown.sh и /sbin/vmware-autostart.sh пользы не принесли, т.к. выяснилось, что все окружение гипервизора загружается в оперативку из образов и там живет.

Было принято решение внести правки в сам образ гипервизора.

Специально для этих целей были написаны скрипты автозапуска и автовыключения, которые берут информацию об автоматически запускаемых и выключаемых машин у самого гипервизора, т.е. сделав изменения в конфигурации в разделе «Virtual Machines Startup/Shutdown» скрипты корректно их обработают (разве что порядок не соблюден, т.е. работает по принципу «Any Order»).

1) autostart.sh:

#!/bin/sh

sleep_time=`/bin/vim-cmd hostsvc/autostartmanager/get_defaults | grep startDelay | sed "s/ //g" | sed "s/,//g" | awk 'FS="=" {print $2}'`

for i in `/bin/vim-cmd hostsvc/autostartmanager/get_autostartseq | grep vim.VirtualMachine | sed "s/',//g" | awk 'FS=":" {print $2}'`; do
state=`/bin/vim-cmd vmsvc/power.getstate $i | grep Power`
if [ "$state" = "Powered off" ]; then
/bin/vim-cmd vmsvc/power.on $i
j=0
while [ $j -le 3 ]; do
sleep $((sleep_time))
state=`/bin/vim-cmd vmsvc/get.guestheartbeatStatus $i`
if [ "$state" = "green" ]; then
break
fi
j=$((j+1))
done
fi
done

2) autostop.sh:

#!/bin/sh

sleep_time=`/bin/vim-cmd hostsvc/autostartmanager/get_defaults | grep stopDelay | sed "s/ //g" | sed "s/,//g" | awk 'FS="=" {print $2}'`

for i in `/bin/vim-cmd hostsvc/autostartmanager/get_autostartseq | grep vim.VirtualMachine | sed "s/',//g" | awk 'FS=":" {print $2}'`; do
state=`/bin/vim-cmd vmsvc/power.getstate $i | grep Power`
if [ "$state" = "Powered on" ]; then
/bin/vim-cmd vmsvc/power.shutdown $i
j=0
while [ $j -le 3 ]; do
sleep $((sleep_time))
state=`/bin/vim-cmd vmsvc/power.getstate $i | grep Power`
if [ "$state" = "Powered off" ]; then
break
fi
j=$((j+1))
done
fi
done

!!! Все изменения вносятся на ваш страх и риск, автор ни какой ответственности за последствия не несет!!!

Первоначально распакуем gunzip’ом файл образа на основное хранилище:
~ # gunzip < /bootbank/s.v00 > /vmfs/volumes/MainStorage/temp/tmp.vmtar
Перейдем на основное хранилище и распакуем еще раз то, что получилось с помощью VmWare’ного tar’а:
~ # cd /vmfs/volumes/MainStorage/temp/
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # vmtar -x tmp.vmtar -o tmp.tar

И только теперь просто распакуем tar’ом (вот такая хитрая матрешка):
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # tar -xf tmp.tar
Удалим лишние архивы и посмотрим что получилось:
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # rm -f tmp.tar tmp.vmtar
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # ls -l
drwxr-xr-x 1 201 201 7280 Jun 5 16:18 bin
drwxr-xr-x 1 201 201 280 Apr 30 03:16 dev
drwxr-xr-x 1 201 201 6580 Jun 5 16:18 etc
drwxr-xr-x 1 201 201 17080 Jun 5 16:15 lib
drwxr-xr-x 1 201 201 420 Jun 5 16:15 lib32
drwxr-xr-x 1 201 201 4900 Jun 5 16:15 lib64
drwxr-xr-x 1 201 201 420 Jun 5 16:15 opt
drwxr-xr-x 1 201 201 280 Apr 30 03:21 proc
lrwxrwxrwx 1 201 201 23 Jun 5 16:15 productLocker -> /locker/packages/5.0.0/
drwxr-xr-x 1 201 201 19040 Jun 5 16:18 sbin
drwxrwxrwt 1 201 201 280 Apr 30 03:33 tmp
drwxr-xr-x 1 201 201 980 Jun 5 16:16 usr
drwxr-xr-x 1 201 201 1400 Jun 5 16:18 var
drwxr-xr-x 1 201 201 560 Jun 5 16:18 vmfs
drwxr-xr-x 1 201 201 560 Jun 5 16:18 vmimages
lrwxrwxrwx 1 201 201 18 Jun 5 16:18 vmupgrade -> /locker/vmupgrade/

Нас очень интересует содержимое каталога sbin, перейдем в него и скопируем файлы для автозапуска и автовыключения ВМ, изменим владельца и права доступа как у всех остальных (типа мы местные):
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # cd sbin/
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # cp ../../autostart.sh .
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # cp ../../autostop.sh .
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # chown 201:201 autostart.sh autostop.sh
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # chmod a=rx autostart.sh autostop.sh

Разрешим изменять файлик vmware-autostart.sh, добавим в конец функции vmware_autostart_vms вызов скрипта автозапуска и добавим в начало функции vmware_autostop_vms вызов скрипта автовыключения:
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # chmod a+w vmware-autostart.sh
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # vi vmware-autostart.sh
# AutoStart vms if any ( Execute the subshell in the background )
vmware_autostart_vms() {
(
logger -t 'VMware[startup]' " Starting VMs"
-----8<------------------------------------------------------------------------
done # wait to start
) &

/sbin/autostart.sh

}
# AutoStop vms if any
vmware_autostop_vms() {
logger -t 'VMware[shutdown]' " Stopping VMs"

/sbin/autostop.sh

val=$("$VIMSH" -U $ROOT_USER $AUTOSTOP_CMD 2>&1 > /dev/null)
-----8<------------------------------------------------------------------------
fi
}

После чего вернем права обратно и запакуем матрешку обратно:
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # chmod a-w vmware-autostart.sh
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp/sbin # cd ..
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # tar -cf ../tmp.tar *
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed/temp # cd ..
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed # vmtar -c tmp.tar -o tmp.vmtar
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed # gzip < tmp.vmtar > s.v00

Сменим права доступа как были и заменим имеющийся файл нашим, не забыв предварительно сделать бекап:
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed # chmod 700 s.v00
/vmfs/volumes/4f72a981-4f940db0-18e9-001517ecc0ed # cp -f s.v00 /bootbank/s.v00

Вот собственно и все, перезагружаемся, проверяем и работаем.

Автор: KASPER56

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js