Под капотом · Виртуализация · Работа и остановка
Принудительное выключение
Пользователь останавливает ВМ немедленно, не спрашивая гостя. Для этого он вводит команду:
virsh destroy vm1
После выполнения команды гипервизор просто перестаёт исполнять гостя - тот ничего не успевает сбросить.
-
пользователь 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 и должен быть осознанным выбором.