Автоматический запуск виртуальных машин в XCP-ng 8
Содержание
Скрипт автозапуска виртуальных машин сломался в версии XCP-ng 8. Чиним.
Введение
Перестали ловиться события через команду xe event-wait. Поэтому запуск виртуалок происходил по таймауту, а не детектированию статуса загрузки драйверов.
Исправление
Заменил xe event-wait на проверку статусов в цикле каждые 10 секунд.
#!/bin/bash
# Location: /usr/local/bin
# VM UUIDs that automatic starts
VM_UUIDS=()
# DNS
VM_UUIDS+=(71a2119d-9ace-e8ed-429f-e34a7b495b1d)
# Pi-Hole
VM_UUIDS+=(295cd49f-1558-179a-a796-27e51832f6f7)
# XAPI start timeout
XAPI_START_TIMEOUT_SEC=120
# VM start timeout
VM_START_TIMEOUT_SEC=180
# PV drivers version regexp
PV_DRV_VER_REGEX="major: [[:digit:]]+; minor: [[:digit:]]+; micro: [[:digit:]]+; build: [[:digit:]]+"
# Check Xen FS
[ -e /proc/xen ] || exit 0
# Wait for xapi to complete initialisation
/opt/xensource/bin/xapi-wait-init-complete $XAPI_START_TIMEOUT_SEC
if [ $? -eq 0 ]
then
for VM_UUID in "${VM_UUIDS[@]}"
do
VM_LABEL=$(xe vm-param-get param-name=name-label uuid=$VM_UUID)
START_TIME=$(date +%s)
if [[ $(xe vm-param-get uuid=$VM_UUID param-name=power-state) == "running" ]]
then
printf "$VM_LABEL already started\n"
continue
else
printf "$VM_LABEL starting"
xe vm-start uuid=$VM_UUID
fi
printf ", waiting for boot "
VM_RUN_UP="false"
while [ $VM_RUN_UP != "true" ]
do
printf "."
sleep 10
VM_POWER_STATE=$(xe vm-param-get uuid=$VM_UUID param-name=power-state)
VM_PV_DRV_STATE=$(xe vm-param-get uuid=$VM_UUID param-name=PV-drivers-detected)
VM_PV_DRV_VERSION=$(xe vm-param-get uuid=$VM_UUID param-name=PV-drivers-version)
VM_BOOT_TIME=$(($(date +%s)-$START_TIME))
if [[ $VM_POWER_STATE == "running" && $VM_PV_DRV_STATE == "true" && $VM_PV_DRV_VERSION =~ $PV_DRV_VER_REGEX || $VM_BOOT_TIME -gt $VM_START_TIMEOUT_SEC ]]
then
VM_RUN_UP="true"
printf " Done\n"
else
VM_RUN_UP="false"
fi
done
done
echo "All VMs started"
fi
Systemd unit смотреть в предыдущей статье.
Upd 2022: Alpine linux
Короче, поставил Alpine linux, а он в версии драйвера ерунду какую-то отдаёт. Выпилил эту проверку, добавил проверку на готовность сети. Смотреть в репозитории.