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

Принудительное выключение

Пользователь останавливает ВМ немедленно, не спрашивая гостя. Для этого он вводит команду:

Команда
virsh destroy vm1
libvirt API virDomainDestroy(dom) QMP quit

После выполнения команды гипервизор просто перестаёт исполнять гостя - тот ничего не успевает сбросить.

  • пользователь 1. Пользователь вводит команду остановки
    virDomainDestroy(dom)

    Это не «SIGKILL гостю», а остановка виртуальной машины на уровне гипервизора.

  • libvirt 2. Демон завершает QEMU
    {"execute":"quit"}
    при необходимости - завершение процесса

    quit - штатный путь: QEMU успевает закрыть файлы и сокеты.

  • QEMU 3. QEMU закрывает дескрипторы
    exit → close(vcpu_fd), close(vm_fd)

    Гостевые процессы не получают шанса дописать данные - ACPI-рукопожатия не было.

  • KVM 4. Ядро освобождает ресурсы VM
    последняя ссылка на fd → VM освобождена

    Жизнь VM привязана к последней ссылке на дескриптор: лишние dup/fork задерживают освобождение.

  • libvirt 5. Демон убирает следы
    cgroup удалён, TAP удалён, метки сняты
    state → shut off

    Для libvirt результат тот же, что у shutdown - но данные могли не дойти до диска.

  • диск / RAM 6. Файловая система может быть грязной
    журнал не дописан → fsck/журнал при следующей загрузке

    Ровно поэтому destroy не эквивалентен shutdown и должен быть осознанным выбором.