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

Инкрементальные бэкапы

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

Команда
virsh checkpoint-list vm1
virsh backup-begin vm1 inc.xml
libvirt API virDomainBackupBegin(xml, checkpointXml) + <incremental> QMP blockdev-backup + bitmap

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

  • Команда checkpoint-list показывает имя предыдущей точки;
  • Команда backup-begin с <incremental> берёт её как точку отсчёта;
  • В qcow2 для этого живёт карта изменений.
  • пользователь 1. Пользователь вводит бэкап с чекпоинтом
    virDomainBackupBegin(xml, checkpointXml)

    Чекпоинт создаётся вместе с бэкапом - он и станет точкой отсчёта для следующих.

  • libvirt 2. Демон описывает чекпоинт
    <domaincheckpoint>
      <disks><disk name="vda" checkpoint="bitmap"/></disks>

    Только qcow2 на активном слое: для других форматов инкрементальный бэкап недоступен.

  • диск / RAM 3. В образе включается карта изменений
    bitmaps extension: dirty tracking bitmap
    гранулярность = 1 << granularity_bits (9…31)

    Один бит = «в этот диапазон писали, пока карта включена». Живёт внутри qcow2 - образ нельзя подменять.

  • пользователь 4. Пользователь вводит инкрементальный бэкап
    <domainbackup>
      <incremental>1525889631</incremental>

    push: в файл пишутся только изменения. pull: сервер сам сообщает клиенту, какие участки изменились.

  • QEMU 5. QEMU отдаёт только изменённое
    push → blockdev-backup с картой изменений
    pull → NBD_OPT_SET_META_CONTEXT

    Разница только в том, кто забирает данные; объём одинаковый.

  • libvirt 6. Демон продолжает цепочку
    новый чекпоинт → parent = предыдущий

    Оценить объём изменений можно, но это может быть дорого по времени.