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

Снимок диска (внешний)

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

Команда
virsh snapshot-create-as vm1 snap1 --disk-only --atomic
libvirt API virDomainSnapshotCreateXML(xml, DISK_ONLY | ATOMIC) QMP blockdev-snapshot-sync

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

  • пользователь 1. Пользователь вводит команду внешнего снимка
    virDomainSnapshotCreateXML(xml,
      VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY |
      VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC)

    DISK_ONLY - без памяти; ATOMIC - это тот самый --atomic в CLI: не оставлять полуготовый снимок. Без предварительного virDomainFSFreeze снимок crash-consistent - как после внезапного выключения.

  • libvirt 2. Демон описывает, что снимать
    <domainsnapshot>
      <disks><disk name="vda" snapshot="external"/></disks>

    Можно исключить диск (snapshot="no") или задать имя нового файла через <source file=…>.

  • QEMU 3. QEMU создаёт оверлей
    {"execute":"blockdev-snapshot-sync",
     "arguments":{"node-name":"node-A",
       "snapshot-file":"b.qcow2","format":"qcow2"}}

    Это примитив блочного слоя: новый слой поверх текущего образа, без копирования данных.

  • диск / RAM 4. Цепочка образов изменилась
    [base qcow2] ← [overlay qcow2]  ← сюда пишет QEMU

    Оригинальный файл стал доступен только для чтения - это и есть «состояние на момент снимка».

  • libvirt 5. Активная конфигурация переключилась
    active XML: source file → /path/to/new
    <state>running</state>, creationTime

    Поэтому «изменился путь к диску» - ВМ действительно работает уже на другом файле.

  • диск / RAM 6. Главное, что стоит запомнить
    точка во времени - это цепочка, а не файл
    состояние «до» = base, а не «файл с датой в имени»

    Имя файла вводит в заблуждение: данные того момента лежат во всей цепочке ниже.

  • пользователь 7. Пользователь видит снимок в дереве
    virsh snapshot-list vm1 --tree

    Снимки образуют дерево parent/child; ветки появляются после откатов.