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

Снимок с памятью (полный)

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

Команда
virsh snapshot-create-as vm1 snap1 \
  --memspec file=/var/lib/libvirt/save/vm1.snap1.mem,snapshot=external \
  --diskspec vda,snapshot=external,file=/var/lib/libvirt/images/vm1.snap1.qcow2 \
  --atomic
libvirt API virDomainSnapshotCreateXML(xml, 0)

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

  • пользователь 1. Пользователь вводит команду полного снимка
    virDomainSnapshotCreateXML(xml, 0)
    // без флагов = full system snapshot

    Отличие от снимка диска - ровно в наличии памяти.

  • libvirt 2. Демон уточняет, куда писать память
    <memory snapshot="internal"/>   # внутрь qcow2
    <memory snapshot="external" file="/path/vm1.mem"/>

    Для выключенной ВМ и для снимка без памяти допустимо только snapshot="no".

  • QEMU 3. Сначала сохраняется память
    память + состояние устройств

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

  • QEMU 4. Затем снимаются диски
    снимок диска (оверлей или запись в qcow2)

    Иначе диск уйдёт вперёд памяти и состояние будет противоречивым.

  • диск / RAM 5. На диске появляется результат
    оверлей + файл памяти  |  или qcow2 + запись VM state

    Для внешнего варианта файл памяти надо беречь вместе с цепочкой образов.

  • libvirt 6. Демон фиксирует состояние
    <state>running</state>
    <domain>…конфигурация на момент снимка…</domain>

    При откате состояние берётся из снимка, если не переопределено флагами.

  • гость 7. После отката
    процессы живы, окна на месте
    TCP-соединения могли истечь

    Документация прямо говорит: файлы и процессы не теряются, но сеть могла отвалиться.