Под капотом · Виртуализация · Бэкапы

Резервная копия (push)

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

Команда
virsh backup-begin vm1 backup.xml
virsh domjobinfo vm1
libvirt API virDomainBackupBegin(xml, checkpointXml) QMP blockdev-backup

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

  • Команда backup-begin запускает запись копии с момента старта;
  • Команда domjobinfo показывает прогресс и статус задачи;
  • ВМ всё это время продолжает работать.
  • пользователь 1. Пользователь вводит команду бэкапа
    virDomainBackupBegin(xml, null)

    Иногда перед этим замораживают I/O гостя, чтобы копия была согласованной, а не «как при сбое питания». Без заморозки копия crash-consistent; fsfreeze даёт согласованность файловой системы, но не приложения.

  • libvirt 2. Демон разбирает описание бэкапа
    <domainbackup mode='push'>
      <disks>
        <disk name='vda' type='file'>
          <target file='/backup/vda.qcow2'/>
        </disk>
      </disks>
    </domainbackup>

    Для push-режима target с путём обязателен: без него libvirt сгенерирует имя сам, добавив метку времени.

  • QEMU 3. QEMU запускает block job
    {"execute":"blockdev-backup",
     "arguments":{"device":"node-D","target":"node-E","sync":"full"}}

    Точка во времени фиксируется на старте команды, а не на её завершении.

  • диск / RAM 4. Чтение идёт из зафиксированного состояния
    QEMU читает цепочку → пишет в target
    гость продолжает писать в активный слой

    Поэтому простой не нужен: копируется уже зафиксированный срез.

  • QEMU 5. Job завершается
    {"event":"BLOCK_JOB_COMPLETED"}

    После этого ресурсы job освобождаются.

  • libvirt 6. Демон закрывает бэкап
    virDomainBackupEnd()

    Память в такую копию не входит: это бэкап дисков, а не «снимок ВМ».