Содержание

Автоматический запуск виртуальных машин в XCP-ng 8

Скрипт автозапуска виртуальных машин сломался в версии XCP-ng 8. Чиним.

Перестали ловиться события через команду xe event-wait. Поэтому запуск виртуалок происходил по таймауту, а не детектированию статуса загрузки драйверов.

Заменил xe event-wait на проверку статусов в цикле каждые 10 секунд.

bash

#!/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 смотреть в предыдущей статье.

Короче, поставил Alpine linux, а он в версии драйвера ерунду какую-то отдаёт. Выпилил эту проверку, добавил проверку на готовность сети. Смотреть в репозитории.

  1. Command-line interface
  2. Bash-скрипты: начало