Под капотом · Виртуализация · Обслуживание

Перенос ВМ на другой хост

Пользователь переносит работающую ВМ на другой хост. Для этого он вводит команду:

Команда
virsh migrate --live vm1 qemu+ssh://host2/system
libvirt API virDomainMigrate(dom, …) QMP migrate

После выполнения команды память уезжает по сети, диски либо общие, либо копируются - ABI гостя должен совпасть.

  • пользователь 1. Пользователь вводит команду миграции
    virsh migrate --live vm1 qemu+ssh://dest/system

    Транспорт бывает «родной» (быстрее) или туннелированный (проще с firewall, но лишние копии).

  • libvirt 2. Демон проверяет совместимость
    модель CPU + machine type (ABI гостя)
    иначе гость на приёмнике не продолжится

    Host-passthrough удобен, но проверить совместимость заранее нельзя.

  • QEMU 3. Память передаётся с догоняющими кругами
    копия RAM → передача «грязных» страниц → …
    пока хвост не станет малым

    Та же идея, что карта изменений для дисков: переносим только изменённое.

  • QEMU 4. Финальная остановка
    stop vCPU → передача остатка
    → запуск на приёмнике

    Это и есть те самые секунды простоя; всё остальное время гость работал.

  • диск / RAM 5. Что с дисками
    общее хранилище → не копируем
    --copy-storage-all / --copy-storage-inc → NBD-копия

    Для варианта «только верхний слой» образы на приёмнике надо создать заранее - пустые qcow2 с тем же backing, иначе миграция упадёт.

  • libvirt 6. Что с конфигурацией
    --undefinesource → удалить описание на источнике
    --persistent     → создать на приёмнике

    /etc/libvirt нельзя делить между хостами - это прямое требование документации.