Содержание

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

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

Задача озвучена выше. Хост — XCP-ng 7.6.
Я знаю два с половиной варианта решения проблемы: опции auto_poweron и скрипты.

В XenServer 6.x из графического интерфейса была удалена опция автоматического запуска, потому что она конфликтует с функциями высокой доступности (HA). Но если возможности высокой доступности не используются, можно включить автозапуск через консоль.

Настраиваем пул серверов:

shell-session

xe pool-param-set uuid=UUID other-config:auto_poweron=true

Настраиваем каждую виртуальную машину, которую нужно автоматически запускать:

shell-session

xe vm-param-set uuid=UUID other-config:auto_poweron=true

Готово.

Фатальный недостаток этого способа — мы не можем задать порядок запуска машин. Порядок можно установить, сформировав vApps. Но сами vApps придётся запускать или вручную, или через скрипты.

Создадим на основе скрипта /opt/xensource/bin/xapi-autostart-vms свой скрипт запуска виртуалок /usr/local/bin/vm-autostart:

bash

#!/bin/bash

# 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=240

# VM start timeout
VM_START_TIMEOUT_SEC=240

# PV drivers undetected version
PV_DRV_UNDETECTED_VER="micro: -1"

# Check Xen FS
[ -e /proc/xen ] || exit 0

# Wait for xapi to complete initialisation
/opt/xensource/bin/xapi-wait-init-complete 240

if [ $? -eq 0 ]
then

    for VM_UUID in "${VM_UUIDS[@]}"
    do
        VM_LABEL=$(xe vm-param-get param-name=name-label uuid=$VM_UUID)

        echo "Starting $VM_LABEL"
        xe vm-start uuid=$VM_UUID

        echo "Waiting $VM_LABEL for boot"
        sleep 3
        timeout $VM_START_TIMEOUT_SEC xe event-wait class=vm uuid=$VM_UUID PV-drivers-detected=true PV-drivers-version=/="$PV_DRV_UNDETECTED_VER"
    done

    echo "All VMs started"
fi

Установим права:

shell-session

chmod 755 /usr/local/bin/vm-autostart

На основе /usr/lib/systemd/system/xapi-domains.service создадим свой юнит-файл /etc/systemd/system/vm-autostart.service для запуска скрипта, приведённого выше:

ini

[Unit]
Description=Start VMs on dom0 start
Requires=xapi.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/vm-autostart

[Install]
WantedBy=multi-user.target

Перечитываем описания сервисов и включаем запуск нашего сервиса при загрузке системы:

shell-session

systemctl daemon-reload
systemctl enable vm-autostart.service

Перезагружаем хост, проверяем автозапуск:

shell-session

# systemctl status vm-autostart.service
● vm-autostart.service - Start VMs and vApps on dom0 start
   Loaded: loaded (/etc/systemd/system/vm-autostart.service; enabled; vendor preset: disabled)
   Active: activating (start) since Thu 2019-06-13 20:19:33 MSK; 4min 34s ago
 Main PID: 949 (vm-autostart)
   CGroup: /system.slice/vm-autostart.service
           ├─ 949 /bin/sh /usr/local/bin/vm-autostart
           └─4979 xe vm-start uuid=295cd49f-1558-179a-a796-27e51832f6f7

XCP-ng starting VMs
Результат: процесс запуска виртуалок в заданном порядке

  1. How to Setup XenServer 6.x to Auto-Start Virtual Machines
  2. XenServer 6.5 SP1 — autostart vm boot order
  3. XenServer 7.2: systemd runs rc.local too early
  4. event-wait options
  5. Command-line interface
  6. 10.6. Creating and Modifying systemd Unit Files