Миграция ВМ между серверами

SSH ключи: Желательно, чтобы между серверами был настроен вход по SSH ключам, иначе при передаче больших объемов сессия может отвалиться по таймауту, пока вы вводите пароль.

Сеть: Если диски NVMe, а сеть между серверами 1 Гбит/с, то передача 100 ГБ займет примерно 15-20 минут.

  1. Выяснить номер виртуальной машины
  2. qm list

    Предполодим, нам нужно машина 301

  3. Выяснить имя диска
  4. zfs list

    Предположим, диск называется rpool/data/vm-301-disk-0

  5. Копирование конфига
  6. scp /etc/pve/qemu-server/301.conf root@pretendetn.mlp.pp.ua:/etc/pve/qemu-server/

    Важно, что бы не было ВМ с номером 301 на конечном сервере. Иначе переименовать конфиг

    scp /etc/pve/qemu-server/301.conf root@pretendetn.mlp.pp.ua:/etc/pve/qemu-server/331.conf

    Если вы меняете ID (с 301 на 331) Если вы переименовываете конфиг при копировании (301.conf -> 331.conf), вам нужно обязательно отредактировать этот файл на целевом сервере:

    Внутри файла 331.conf нужно заменить все упоминания старого диска vm-301-disk-0 на новое имя vm-331-disk-0.

    ZFS датасет на втором сервере тогда тоже должен называться rpool/data/vm-331-disk-0.

    Алгоритм

    Чтобы перенос прошел без проблем, лучше всего сделать это в два этапа:

    1. передать основной объем данных на живую

    2. остановить ВМ и быстро дослать изменения.

  7. Создадим «свежий» снапшот диска виртуалки 301.
  8. Это позволит передать 99% данных, пока пользователи еще работают.

    zfs snapshot rpool/data/vm-301-disk-0@migration

  9. Перенос данных на Сервер 2
  10. Ключ -v покажет прогресс, а -C включит сжатие для ускорения

    zfs send -v rpool/data/vm-301-disk-0@migration | ssh root@pretendetn.mlp.pp.ua zfs receive rpool/data/vm-301-disk-0

    Чтобы увидеть прогресс в реальном времени, скорость и расчетное время (ETA), нужно использовать утилиту pv (Pipe Viewer). Она вставляется в середину «конвейера» (pipe).

    apt install pv Важно: убрать ключ -v

    zfs send rpool/data/vm-201-disk-0@migration_ovpn | pv -s 1540M | ssh root@pretendetn.mlp.pp.ua "zfs receive rpool/data/vm-201-disk-0"

  11. Финальный перенос (с остановкой)
  12. 1. Останавливаем ВМ на srv1

    qm stop 301

    2. Делаем инкрементальный снапшот

    zfs snapshot rpool/data/vm-301-disk-0@final

    3. Отправляем только разницу (delta)

    zfs send -v -i rpool/data/vm-301-disk-0@migration rpool/data/vm-301-disk-0@final | ssh root@all1 zfs receive -F rpool/data/vm-301-disk-0

    Ключ -F (Force) откатывает диск на приемнике к состоянию снапшота @migration перед тем, как наложить на него изменения из @final

О снапшотах

rpool/data/vm-301-disk-0 @ migration
|______________________|   |_________|
           |                    |
    Путь к датасету        Имя снапшота