Выберите продукт

QEMU Guest Agent (QGA) в KVM/VDS: graceful shutdown, IP-адрес и fsfreeze для консистентных снапшотов

QEMU Guest Agent (qga) делает гостевую ОС «видимой» для KVM/QEMU: помогает корректно выключать ВМ, получать IP-адреса так, как их видит сама система, и замораживать файловые системы перед снапшотом. Ниже — установка, проверки systemd/канала и готовые команды virsh.
QEMU Guest Agent (QGA) в KVM/VDS: graceful shutdown, IP-адрес и fsfreeze для консистентных снапшотов

QEMU Guest Agent (QGA, пакет qemu-guest-agent) — демон внутри виртуальной машины, который даёт гипервизору KVM/QEMU безопасный канал управления гостевой ОС. На практике он закрывает три типовые задачи админа в KVM/VDS:

  • graceful shutdown — корректное выключение/перезагрузка ВМ, без «обрубания питания»;

  • получение IP — гипервизор/панель видят адреса так, как их видит сама ОС;

  • fsfreeze — заморозка файловых систем перед снапшотом для консистентности на уровне ФС.

Ниже — пошаговая настройка агента в госте, проверка работы канала и готовые команды для shutdown, инвентаризации сети и сценария freeze → snapshot → thaw.

Как устроен QGA и почему без него «не то»

QGA работает через виртуальный канал (чаще всего virtio-serial): на стороне гостя демон слушает устройство или сокет, на стороне хоста QEMU/libvirt отправляет JSON-команды. Из-за этого поведение ВМ для панели и автоматизации становится предсказуемым.

  • Выключение без QGA часто сводится к принудительному power off, что повышает риск fsck после старта и проблем с данными при активной записи.

  • IP без QGA гипервизор пытается «угадать» адрес по косвенным признакам (ARP, DHCP), но в реальных конфигурациях это легко ломается: несколько интерфейсов, статическая адресация, cloud-init, VLAN.

  • Снапшоты без fsfreeze обычно дают краш-консистентность (как после внезапной перезагрузки). Иногда норм, но для нагруженных сервисов лучше хотя бы консистентность на уровне ФС.

Перед тем как использовать fsfreeze в проде, держите в голове два важных ограничения:

  1. fsfreeze обеспечивает консистентность на уровне файловых систем, но не гарантирует консистентность приложений (например, СУБД).

  2. Для критичных баз обычно комбинируют: включают режим бэкапа или flush на уровне БД, затем делают fsfreeze и только потом снимают снапшот.

Воспринимайте fsfreeze как «страховку» от грязных файловых систем и недописанных метаданных, а не как полноценную транзакционную консистентность приложений.

Проверяем: отвечает ли агент со стороны гипервизора (libvirt)

Если у вас есть доступ к KVM-хосту и libvirt, начните с базовой проверки состояния домена:

virsh dominfo vm1
virsh domstate vm1

Ключевая проверка QGA — ping-команда:

virsh qemu-agent-command vm1 '{"execute":"guest-ping"}'

Нормальный результат — корректный JSON-ответ без ошибок. Если видите «Guest agent is not responding» или «channel not found», обычно причина одна из двух: агент не установлен или не запущен в госте, либо в конфигурации ВМ не добавлен канал агента.

Если вы разворачиваете виртуалки под проекты и хотите одинаковое поведение shutdown и снапшотов, проще стандартизировать это на уровне шаблона и сразу выдавать сервисам готовую VDS с включённым QGA.

Если канала агента нет в конфигурации ВМ

В libvirt канал QGA обычно добавляется как virtio-serial channel (в XML домена это блок <channel>). В рамках статьи не приводим «активные» XML-теги, но смысл такой: на хосте создаётся unix-сокет, который мапится внутрь гостя как virtio-port устройство.

На большинстве KVM-шаблонов и панелей канал уже включён «из коробки». Если нет — корректнее включать его на стороне гипервизора или шаблона, а не пытаться «чинить» это внутри ОС.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Чтобы не разбирать каждый кейс вручную, удобный подход — держать один базовый образ с уже включённым каналом QGA и установленным агентом. Так вы получаете одинаковую диагностику и одинаковые команды управления на всём парке ВМ.

Проверка ответа QEMU Guest Agent командой guest-ping

Установка QEMU Guest Agent в гостевой ОС

Внутри виртуальной машины ставим пакет и включаем systemd-сервис. Почти везде он называется одинаково: qemu-guest-agent.

Debian/Ubuntu

apt update
apt install -y qemu-guest-agent
systemctl enable --now qemu-guest-agent
systemctl status qemu-guest-agent

RHEL/AlmaLinux/Rocky

dnf install -y qemu-guest-agent
systemctl enable --now qemu-guest-agent
systemctl status qemu-guest-agent

Логи и быстрые признаки проблем

Если сервис активен, но с хоста не отвечает, смотрим журналы в госте:

journalctl -u qemu-guest-agent -b --no-pager

Чаще всего виновато одно из этого:

  • в госте не появилось устройство virtio-serial канала (демон запущен, но «подключаться некуда»);

  • демон не стартует автоматически (в сильно урезанных образах, без systemd);

  • после клонирования образа сервис отключён или замаскирован.

Graceful shutdown и reboot через QGA

Самый практичный сценарий — корректно выключить или перезагрузить ВМ перед обслуживанием хоста, миграцией или бэкапом. С QGA это выглядит как нормальная команда выключения изнутри ОС, а не «power off».

Через libvirt

Иногда достаточно штатной команды (если libvirt настроен использовать агент):

virsh shutdown vm1

Чтобы задействовать QGA наверняка, отправьте команду напрямую:

virsh qemu-agent-command vm1 '{"execute":"guest-shutdown"}'

Перезагрузка через агент:

virsh qemu-agent-command vm1 '{"execute":"guest-shutdown","arguments":{"mode":"reboot"}}'

Что считать успешным «мягким» выключением

  • systemd успевает корректно остановить сервисы;

  • файловые системы размонтируются чисто (без «recovery after crash» при следующем старте);

  • в логах нет признаков внезапного отключения питания.

Как получить IP-адреса ВМ через QGA

Главная команда — guest-network-get-interfaces. Она возвращает интерфейсы, MAC и IP-адреса (IPv4/IPv6), которые видит гостевая ОС:

virsh qemu-agent-command vm1 '{"execute":"guest-network-get-interfaces"}'

Вывод — JSON, удобно фильтровать его на хосте. Пример: вытащить только IPv4-адреса:

virsh qemu-agent-command vm1 '{"execute":"guest-network-get-interfaces"}' | jq -r '..|.ip_addresses? // empty | .[]? | select(.ip_address_type=="ipv4") | .ip_address'

Если в автоматизации вы выбираете «основной» интерфейс по маршруту по умолчанию или ждёте сетевую готовность после старта ВМ, удобно дополнять это таймерами systemd. По теме может пригодиться материал: cron vs systemd timers: как перевести задачи на таймеры.

Почему IP «не тот», хотя агент работает

  • вы фильтруете не тот тип адреса (ищете IPv4, а в ответе только IPv6);

  • несколько сетей или интерфейсов, а вам нужен конкретный (исключайте lo, выбирайте по MAC или по дефолтному маршруту);

  • после старта ВМ сеть ещё не поднялась (DHCP/NetworkManager/networkd не завершили конфигурацию).

Fsfreeze: консистентные снапшоты (freeze → snapshot → thaw)

Команды QGA для заморозки:

  • guest-fsfreeze-freeze — заморозить файловые системы (запись будет блокироваться);

  • guest-fsfreeze-thaw — разморозить;

  • guest-fsfreeze-status — проверить состояние (frozen/thawed).

Типовой сценарий на хосте

Сам принцип всегда один: сначала freeze, затем моментальный снимок, затем thaw:

virsh qemu-agent-command vm1 '{"execute":"guest-fsfreeze-freeze"}'
virsh snapshot-create-as vm1 snap1 "fsfreeze snapshot" --disk-only --atomic
virsh qemu-agent-command vm1 '{"execute":"guest-fsfreeze-thaw"}'

Опции снапшота зависят от хранилища (qcow2, LVM, Ceph и т.д.). Даже если вы делаете снимок не через libvirt, а средствами хранилища, порядок действий сохраняется: QGA freeze перед операцией и thaw сразу после.

Таймауты и защита от «вечной заморозки»

Самая неприятная авария — вы заморозили ФС и не разморозили из-за ошибки в автоматизации. Минимальный набор страховок:

  • перед freeze проверяйте, что статус thawed;

  • после freeze задавайте короткий дедлайн на создание снапшота;

  • в обработчике ошибок всегда выполняйте thaw.

Проверка статуса:

virsh qemu-agent-command vm1 '{"execute":"guest-fsfreeze-status"}'
Виртуальный хостинг FastFox
Виртуальный хостинг для сайтов
Универсальное решение для создания и размещения сайтов любой сложности в Интернете от 95₽ / мес

Если вы предоставляете виртуалки клиентам или командам разработки, заранее продумайте, где будут храниться снапшоты и как быстро они создаются. На практике стабильнее, когда ВМ живут на предсказуемом тарифе и ресурсах, а сами бэкапы снимаются по единому регламенту.

Схема freeze → snapshot → thaw для консистентного снапшота

systemd и qemu-guest-agent: проверки для надёжности

На системах с systemd обычно достаточно включить сервис, но в реальной эксплуатации полезно иметь короткий набор команд для диагностики:

systemctl is-enabled qemu-guest-agent
systemctl status qemu-guest-agent
journalctl -u qemu-guest-agent -b --no-pager

Если вы делаете кастомные образы, логичный шаг — включить QGA в базовый шаблон. Тогда graceful shutdown, инвентаризация IP и fsfreeze будут работать одинаково на всём парке виртуалок.

Типовые проблемы и быстрые решения

Агент установлен, но «не отвечает» с хоста

  • проверьте, что у ВМ действительно есть канал QGA на стороне гипервизора;

  • проверьте логи в госте: journalctl -u qemu-guest-agent -b;

  • убедитесь, что сервис не замаскирован: systemctl is-enabled qemu-guest-agent.

fsfreeze «висит» или занимает слишком много времени

  • слишком активная запись на диск: переносите снапшоты на менее нагруженное окно;

  • оптимизируйте саму операцию снапшота (чем она быстрее, тем меньше эффект «подвисания» приложений);

  • в автоматизации обязательно делайте thaw в обработчике ошибок.

IP возвращается, но не подходит для подключения

  • фильтруйте по типу адреса (ipv4/ipv6) и исключайте lo;

  • если сетей несколько, определяйте «основную» по дефолтному маршруту уже внутри гостя, а QGA используйте как источник инвентаризации.

Итоги

QEMU Guest Agent — маленькая деталь, которая заметно повышает управляемость KVM/VDS: корректные выключения, понятная инвентаризация IP и возможность делать более предсказуемые снапшоты через fsfreeze. Если вы строите бэкапы на основе снапшотов, QGA — практический минимум, который стоит включить в стандартный образ ВМ.

Следующий шаг после внедрения — протестировать восстановление из снапшота на отдельной виртуалке и зафиксировать стандартный сценарий freeze → snapshot → thaw в вашей автоматизации.

Поделиться статьей

Вам будет интересно

Nginx proxy_cache: cache_key, Vary и как поднять hit ratio без утечек приватных данных OpenAI Статья написана AI (GPT 5)

Nginx proxy_cache: cache_key, Vary и как поднять hit ratio без утечек приватных данных

Низкий hit ratio в Nginx proxy_cache чаще связан не с размером кеша, а с неправильным proxy_cache_key и игнорированием Vary. Разбе ...
inotify ENOSPC в Linux: увеличиваем лимиты watches/instances для IDE, watch и CI OpenAI Статья написана AI (GPT 5)

inotify ENOSPC в Linux: увеличиваем лимиты watches/instances для IDE, watch и CI

inotify ENOSPC часто появляется в VS Code, PhpStorm, webpack/vite watch и на CI runners: системе не хватает лимитов watches/instan ...
Kubernetes на VDS: conntrack, nf_conntrack_max и всплески dport scan OpenAI Статья написана AI (GPT 5)

Kubernetes на VDS: conntrack, nf_conntrack_max и всплески dport scan

Если на Kubernetes-нодах появляются «nf_conntrack: table full» и «dport scan», чаще виноваты малые лимиты conntrack и поток коротк ...