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

Резервная копия на внешний сервер (pull)

Пользователь отдаёт диски внешнему серверу, чтобы копию забирал он. Для этого он вводит команды:

Команда
virsh backup-begin vm1 backup-pull.xml
virsh domjobinfo vm1
libvirt API virDomainBackupBegin(xml mode="pull") QMP blockdev-backup (mode=pull)

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

  • Команда backup-begin с mode=pull поднимает NBD-сервер;
  • Команда domjobinfo показывает адрес экспорта и прогресс;
  • На время операции нужен временный файл под scratch.
  • пользователь 1. Пользователь вводит команду pull-бэкапа
    <domainbackup mode="pull">
      <server transport="unix" socket="/run/bk.sock"/>

    Порт при необходимости выделяется из диапазона в /etc/libvirt/qemu.conf.

  • libvirt 2. Демон готовит временное хранилище
    <disk name="vda" type="file">
      <scratch file="/var/tmp/vda.scratch"/>

    Файл создаёт и удаляет libvirt; блочное устройство должно существовать заранее и быть отформатировано.

  • QEMU 3. QEMU поднимает NBD-сервер
    экспорты: vda, vdb …
    на момент старта бэкапа

    Клиент видит стабильный снимок, хотя гость продолжает писать.

  • диск / RAM 4. Внешняя система читает данные
    NBD read → хранилище бэкапов
    # здесь проходит основное время

    В этом и смысл: тяжёлое чтение не нагружает гипервизор.

  • libvirt 5. Демон закрывает операцию
    virDomainBackupEnd()
    scratch удалён, NBD остановлен

    Если клиент отвалился, job надо закрыть корректно - иначе временные файлы останутся.