Под капотом · Виртуализация · Снимки

Снимок диска (внутренний)

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

Команда
virsh snapshot-create-as vm1 snap1 --disk-only \
  --diskspec vda,snapshot=internal
libvirt API virDomainSnapshotCreateXML(xml, DISK_ONLY) · <disk snapshot=internal/>

После выполнения команды новых файлов нет - qcow2 переключает таблицу, но гость на это время замирает.

  • пользователь 1. Пользователь вводит команду внутреннего снимка
    snapshot="internal"

    Так умеет только qcow2: несовместимо с внешним data-файлом.

  • QEMU 2. QEMU копирует активную L1-таблицу
    copy active L1 → snapshot L1
    refcount++ для всех L2 и кластеров

    Гость начинает видеть другой набор хостовых кластеров - это и есть «точка во времени».

  • диск / RAM 3. Запись идёт через COW
    write → COW → старая версия видна только снапшоту

    Файл растёт только на объём изменений, а не на весь размер диска.

  • диск / RAM 4. В заголовке появляется запись
    snapshot table entry:
      L1 offset, время, name/ID, VM state size

    Поле VM state означает, что внутренний снимок может содержать и память.

  • гость 5. Гость чувствует паузу
    внутренние снимки в QEMU: «lengthy downtime»

    Для живых ВМ это плохой выбор: пауза несовместима с заморозкой I/O.