Скрипт для живой миграции виртуальной машины между нодами Proxmox с ZFS-репликацией

Обновлено и опубликовано Опубликовано:

В этой инструкции разберём готовый скрипт для миграции виртуальной машины в кластере Proxmox с двумя нодами и ZFS-репликацией дисков. Скрипт сам определяет, на какой ноде сейчас находится VM, синхронизирует диски перед переносом и запускает живую миграцию без остановки сервиса — удобный вариант, если миграция виртуальных машин Proxmox выполняется регулярно.

Настройки перед запуском

Перед первым использованием скрипт нужно адаптировать под свой кластер — все параметры вынесены в начало файла:

  • NODE1 — имя первой ноды кластера.
  • NODE2 — имя второй ноды.
  • REPLICATION_ID — префикс задания репликации из /etc/pve/replication.cfg (обычно local).
  • ONLINE — переключатель живой миграции: 1 переносит VM без остановки, 0 — офлайн.
  • WITH_LOCAL_DISKS — по умолчанию должен оставаться 1. При ZFS-репликации диски VM хранятся локально на каждой ноде, а не на общем (shared) хранилище — без этого флага онлайн-миграция с локальных дисков не запустится.

* если задание репликации для VM ещё не настроено, скрипт его просто не найдёт в /etc/pve/replication.cfg и перейдёт сразу к миграции, без ошибки.
** флаг WITH_LOCAL_DISKS отключаем только если хранилище дисков уже общее для обеих нод (shared storage) — тогда --with-local-disks не нужен и Proxmox мигрирует VM без копирования данных.

  1. #!/bin/bash
  2. # Перенос VM на другую ноду кластера (ZFS replication).
  3. # Usage: /scripts/migrate-peer.sh <vmid>
  4.  
  5. set -e
  6.  
  7. # --- настройки ---
  8. NODE1=pve1
  9. NODE2=pve2
  10. REPLICATION_ID=local
  11. ONLINE=1                        # 1 = live migrate, 0 = offline
  12. WITH_LOCAL_DISKS=1    # 1 нужен для online + local-zfs
  13. SSH_OPTS="-o StrictHostKeyChecking=accept-new"
  14. # ---
  15.  
  16. if [ -z "${1:-}" ]; then
  17.         cat >&2 <<EOF
  18. Перенос VM между нодами $NODE1 и $NODE2 (ZFS replication).
  19.  
  20. Использование: $0 <vmid>
  21.  
  22. Пример: $0 100
  23. EOF
  24.         exit 1
  25. fi
  26.  
  27. VMID=$1
  28. if ! [[ $VMID =~ ^[0-9]+$ ]]; then
  29.         echo "Ошибка: vmid должен быть числом, получено: $VMID" >&2
  30.         echo "Использование: $0 <vmid>" >&2
  31.         exit 1
  32. fi
  33.  
  34. if [ -f /etc/pve/nodes/$NODE1/qemu-server/$VMID.conf ]; then
  35.         SRC=$NODE1
  36.         TARGET=$NODE2
  37. elif [ -f /etc/pve/nodes/$NODE2/qemu-server/$VMID.conf ]; then
  38.         SRC=$NODE2
  39.         TARGET=$NODE1
  40. else
  41.         echo "VM $VMID не найдена на $NODE1 / $NODE2" >&2
  42.         exit 1
  43. fi
  44.  
  45. echo "$VMID: $SRC -> $TARGET"
  46.  
  47. ssh_src() {
  48.         ssh $SSH_OPTS "root@$SRC" "$@"
  49. }
  50.  
  51. JOB=$(awk -v id="$VMID" -v pref="$REPLICATION_ID" \
  52.         '$1==(pref ":") && $2 ~ "^"id"-" {print $2; exit}' \
  53.         /etc/pve/replication.cfg 2>/dev/null || true)
  54. if [ -n "$JOB" ]; then
  55.         echo "репликация $JOB..."
  56.         ssh_src "pvesr run --id $JOB --verbose"
  57. fi
  58.  
  59. OPTS=""
  60. [ "$ONLINE" = 1 ] && OPTS="$OPTS --online"
  61. [ "$WITH_LOCAL_DISKS" = 1 ] && OPTS="$OPTS --with-local-disks"
  62.  
  63. ssh_src "qm migrate $VMID $TARGET $OPTS"
  64. echo "OK: VM $VMID на $TARGET"

Как работает скрипт

Сначала скрипт проверяет, что параметр vmid передан и является числом — без этого перенос не начнётся.

Дальше скрипт ищет конфиг VM в /etc/pve/nodes на обеих нодах и сам определяет, где машина находится сейчас, а куда её нужно перенести. Направление миграции указывать вручную не нужно.

Если для VM найдено задание репликации в replication.cfg, скрипт сначала запускает pvesr run — это синхронизирует диски на целевой ноде перед переносом и сокращает время простоя при живой миграции.

После этого собираются опции для qm migrate: --online — для переноса без остановки VM, --with-local-disks — для дисков на local-zfs. Последней командой скрипт запускает саму миграцию Proxmox на целевой ноде.

Скрипт готов к использованию. Достаточно передать ему vmid — и перенос виртуальной машины пройдет автоматически.

# Виртуализация # Серверы
Дмитрий Моск — частный мастер
Был ли вам полезен этот скрипт?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку кластера

Нужна бесплатная консультация?

Скрипты

Пример скрипта для миграции запущенной виртуальной машины Proxmox с ZFS репликацией

Пример манифеста для развертывания Hermes AI в Kubernetes

Пример файла docker-compose для развертывания брокера Kafka

Пример сценария docker-compose для запуска сервера Dependency-Track

Запуск SonarQube Server в контейнере с помощью docker-compose

Пример docker-compose файла для запуска сервера rustdesk в docker

Пример файла docker-compose для запуска Garage S3

Другие скрипты

Все статьи

Нужен скрипт? Опишите его назначение:





Реклама