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

Удаление снимка

Пользователь удаляет ненужный снимок. Для этого он вводит команду:

Команда
virsh snapshot-delete vm1 snap1
libvirt API virDomainSnapshotDelete(snap, flags)

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

  • пользователь 1. Пользователь вводит команду удаления снимка
    virDomainSnapshotDelete(snap, flags)

    Флаги решают, что делать с дочерними снимками и с дисковыми метаданными.

  • libvirt 2. Демон выбирает стратегию
    внутренний → убрать запись из таблицы qcow2
    внешний  → слить сегмент цепочки (blockcommit)

    Удаление снимка - не всегда «удалить файл»: сначала данные надо влить в базу.

  • QEMU 3. QEMU выполняет слияние
    block-commit / merge → BLOCK_JOB_COMPLETED

    Пока job идёт, снимок нельзя считать удалённым.

  • диск / RAM 4. Цепочка укорачивается
    [A] ← [B] ← [C]  →  [A] ← [C]

    Промежуточный образ после слияния невалиден: новые оверлеи на нём строить нельзя.

  • libvirt 5. Если операция прервалась
    <snapshotDeleteInProgress/>
    # образы несогласованы - удаление надо довести

    С 9.0 такой элемент в XML - сигнал «не трогай руками», иначе повреждение образа.