Под капотом · Виртуализация · Обслуживание

Наведение порядка в цепочке образов

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

Команда
virsh blockcommit vm1 vda --active --pivot
virsh blockpull vm1 vda --wait
libvirt API virDomainBlockCommit / virDomainBlockPull QMP block-commit / block-stream

После выполнения команд цепочка становится короче:

  • Команда blockcommit вливает оверлеи в базу и переключает на неё живой процесс;
  • Команда blockpull подтягивает данные из backing в активный слой;
  • Промежуточные файлы после этого невалидны и удаляются вручную.
  • пользователь 1. Пользователь вводит команду слияния
    virDomainBlockCommit(disk, base, top, …)
    # или virDomainBlockPull(disk, …)

    Commit: оверлеи → в базу. Pull (stream): база → в активный слой.

  • QEMU 2. QEMU выполняет job в фоне
    {"execute":"block-commit",
     "arguments":{"device":"node-D","top":"d.qcow2","base":"a.qcow2"}}

    ВМ продолжает работать; прогресс виден в query-block-jobs.

  • QEMU 3. Для активного слоя нужна вторая фаза
    {"event":"BLOCK_JOB_READY"}
    → block-job-complete

    Только active commit требует подтверждения; остальные job завершаются сами.

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

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

  • диск / RAM 5. После stream - наоборот
    stream: промежуточные образы остаются валидными

    Их можно использовать как основу для новых оверлеев - разница принципиальная.

  • libvirt 6. Файлы сами не удаляются
    QEMU не удаляет слитые файлы
    → удалять вручную

    Отсюда «место не освободилось» после успешного слияния.