Перейти к содержимому

Qemu ga что это

  • автор:

Резервное копирование виртуальных машин в среде гипервизора QEMU/KVM

image

Как известно, бэкапы нужно делать, мало того, нужно делать их так, чтобы потом с них можно было развернуться. Особенно это касается виртуальных машин (ВМ). Рассмотрим, как можно сделать бэкап виртуальных дисков машины в среде QCOW/KVM. Основных проблем здесь две: во-первых, нужно получить консистентый (целостный) бэкап, т.е. если у нас есть СУБД или другое ПО, которое активно использует собственный кэш на запись, то перед бэкапом его нужно попросить сбросить кэш и заморозить запись на диск, иначе данные-то в снэпшот попадут, но не те, и при восстановлении СУБД может не понять такой финт. Второй вопрос — производительность ВМ в режиме снэпшота, неплохо было бы, что бы ВМ не слишком тормозила, когда мы снимаем копию, и не зависала бы, когда мы удаляем снэпшот.

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

Итак, чтобы получить консистентный бэкап, не выключая ВМ, нужно использовать гостевой агент для QEMU (не путать с гостевым агентом для QEMU SPICE и паравиртуальными драйверами для QEMU вообще). В репозитории Debian Jessie это пакет qemu-guest-agent, в Wheezy пакет доступен только через wheezy-backports. QEMU guest agent — это небольшая утилита, которая принимает команды от хоста через virio-канал с именем org.qemu.guest_agent.0 и исполняет их в контекста гостя. На стороне гипервизора канал заканчивается unix-сокетом, в который можно писать текстовые команды с помощью утилиты socat. Libvirt, правда, любит сама занимает этот канал, так что в случае, если вы для управления гипервизором используйте Libvirt, общаться с гостем придется через команду “virsh qemu-agent-command”. Команды QEMU guest agent умеет разные, вот, например, мой список:

  • guest-set-vcpus
  • guest-get-vcpus
  • guest-network-get-interfaces
  • guest-suspend-hybrid
  • guest-suspend-ram
  • guest-suspend-disk
  • guest-fstrim
  • guest-fsfreeze-thaw
  • guest-fsfreeze-freeze
  • guest-fsfreeze-status
  • guest-file-flush
  • guest-file-seek
  • guest-file-write
  • guest-file-read
  • guest-file-close
  • guest-file-open
  • guest-shutdown
  • guest-info
  • guest-set-time
  • guest-get-time
  • guest-ping
  • guest-sync
  • guest-sync-delimited

Среди всего списка команд нас интересуют guest-fsfreeze-freeze и guest-fsfreeze-thaw. Как следует из названия, первая из них “замораживает” файловую систему гостя, а вторая “размораживает” ее. Команда (точнее IOCTL) fsfreeze — это не фича QEMU, а способность виртуальной файловой системы гостя, которая появиласть в ядре Linux довольно давно. То есть, замораживать ФС можно не только в виртуальной среде, но и на реальном железе, достаточно воспользоваться утилитой fsfreeze из пакета util-linux. В man-е fsfreeze сказано, что поддерживаются Ext3/4, ReiserFS, JFS, XFS, но у меня fsfreeze “заморозил” и Btrfs. Перед собственно “заморозкой”, но уже после того, как отработали все потоки записи, кодом ядра вызвается sync() (файл fs/super.c, строка 1329), так что за целостность данных можно не беспокоиться. Вообще, “заморозка” ФС нужна ядру для получения целостных снэпшотов LVM-томов, а не для сомнительных забав с системами виртуализации.

Итак, мы знаем, что для получения целостного снэпшота нам нужно из гостя с помощью QEMU guest agent вызвать функцию guest-fsfreeze-freeze. Однако, быть может, мы зря волнуемся и эта функция вызвается при создании снэпшота? Увы, и для Libvirt (2.9), и для Proxmox (ветка pvetest), и для Openstack это не так, а значить, чтобы автоматизировать вызов функции guest-fsfreeze-freeze надо править исходные коды соответствующих продуктов, что выходит за рамки этой статьи.

Libvirt все-таки умеет замораживать гостевую ФС

Как подсказывает уважаемый Infod, оболочке virsh из состава Libvirt можно при создании снэпшота передать параметр —quiesce, который вызовет guest-fsfreeze-freeze при создании снэпшота:

virsh snapshot-create-as myvm snapshot1 "snapshot1 description" --disk-only --atomic --quiesce 

Допустим, мы нашли способ (например, самописным скриптом), “замораживать” ФС гостя перед снятием снэпшота. Теперь перед нами стоит следующая задача — оповестить гостевое ПО непосредственно перед заморозкой. QEMU guest agent поддерживает параметр -F, который говорит о том, что перед “заморозкой” и после “разморозки” нужно вызвать скрипт /etc/qemu/fsfreeze-hook и параметрами freeze и thaw соответственно. Поэтому в Debian скрипт запуска агента (/etc/init.d/qemu-guest-agent) придется поправить: DAEMON_ARGS=”-F”. Имейте в виду, что если скрипт завершится с ошибкой, “заморозки” ФС не произойдет.

Для MySQL сервера первый пришедший на ум, но неработающий скрипт может выглядеть примерно так:

#!/bin/bash USER PASSWORD case "$1" in freeze ) /usr/bin/mysql -u $USER -p$PASSWORD -e "FLUSH TABLES WITH READ LOCK;" exit $? ;; thaw ) /usr/bin/mysql -u $USER -p$PASSWORD -e "UNLOCK TABLES;" exit $? ;; * ) logger Fsfreeze script has activated with unknown parameter: $1 exit 1 ;; esac exit 1 

На самом деле блокировка с базы будет снята сразу по завершении команды

mysql -u $USER -p$PASSWORD -e "FLUSH TABLES WITH READ LOCK" 

из-за того, что все блокировки в MySQL работают лишь пока пользователь, поставивший их, присутствует в системе. Для правильного бэкапа придется писать дополнительный небольшой сервис (например, на Python) который будет открывать базу MySQL и ставить блокировку по команде freeze, а затем не закрывать базу и ждать команду thaw.

А как обстоят дела с Windows в роли гостя?

Надо сказать, что для Windows и MS SQL эта же процедура не требует никаких теложвижений — QEMU guest agent автоматически вызывает соответствующую функцию службы теневого копирования тома VSS, VSS информирует всех подписчиков о том, что вот-вот начнется бэкап и неполохо было бы “сброситься” на диск и т.п.

Итак, мы заблокировали MySQL-таблицы и “заморозили” ФС гостя, пришла пора снимать бэкап. Предположим, что мы храним образа дисков ВМ в файлах формата qcow2, а не, например, в виде LVM-томов. Даже в этом случае нам предлагается множество вариантов, неплохо бы в них разобраться.

Internal QEMU snapshot External QEMU snapshot QEMU backup Снэпшот LVM-тома с файлами qcow2 Снэпшот ФС Brtfs с файлами qcow2
Средство QEMU QEMU QEMU ОС ОС
Команда QEMU savevm/snapshot_blkdev_internal snapshot_blkdev drive_backup
Команда libvirt/virsh snapshot-create/snapshot-create-as snapshot-create/snapshot-create-as
Команда ОС lvcreate btrfs subvolume snapshot
Вид Записи внутри образа диска Отдельный файл — образ диска Отдельный файл — образ диска Блочное устройство ФС (каталог) с образами дисков
Область действия Конкретная ВМ Конкретная ВМ Конкретная ВМ Всё хранилище Всё хранилище
Технология Перенаправление записи в другую область того же файла Перенаправление записи в другой файл Полное копирование дисков машины в другой файл Копирование оригинальных данных на устройство снэпшота при их изменении Перенаправление записи в другую область файловой системы
Копирование снэпшота в хранилище резервных копий qemu-nbd/nbd-client Копирование файла Копирование файла Монтирование снэпшота, копирование файла Копирование файла
Быстродействие дисков ВМ на запись, когда снэпшот создан Среднее (на каждую запись нужно сделать два sync(), опция qcow2:lazy refcounts улучшает ситуацию) Высокое Высокое Ниже обычного примерно в 2 раза Высокое
Нагрузка на хранилище при удалении (commit) снэпшота Ниже средней (нужно перезаписать метаданные) Высокая (нужно скопировать данные в исходный образ и перезаписать метаданные) Низкая (нужно удалить файл) Низкая (нужно удалить блочное устройство) Ниже средней (нужно перезаписать метаданные)
Нагрузка на хранилище при откате (rollback) на снэпшот Ниже средней (нужно перезаписать метаданные) Низкая (нужно удалить файл) Низкая для Libvirt (нужно заменить файл), высокая для Proxmox (нужно распаковать файл из архива) Высокая (нужно скопировать данные на исходное блочное устройство) Ниже средней (нужно перезаписать метаданные)

У каждого способа есть свои плюсы и минусы. Так, способ «Internal» является, по-сути, стандартом в утилите Virt-Manager и среде Proxmox, и получение снэпшотов такого формата автоматизировано. Однако для того, чтобы «выдернуть» снэпшот из файла, нужно поднять NBD-сервер на базе qemu-nbd и подключить файл образа к нему. В способе «External» готовый для копирования файл с резервной копей получается в процессе создания снэпшота, но процесс удаления снэпшота непрост и предусматривает «возвращение» (block-commit) записанных данных из файла снэпшота в базовый образ, что сопровождается кратным увеличением нагрузки на запись в процессе удаления снэпшота. К примеру, VMWare ESXi в такой же ситуации «проседает» по производительности на запись в 5 раз.. Надо сказать, что есть еще и другой способ удаления снэпшота типа «External» — копирование всех блоков из исходного образа в снэпшот. Способ этот называется block-stream, о целесообразности применения его в продакшене судить не берусь, но, очевидно, для хранилища это будет неплохой бенчмарк.

Снэпшот LVM-тома вызвает падение производительности основного тома на запись, так что его лучше использовать тогда, когда мы уверены, что во время существования снэпшота на диск не будут интенсивно писать.

Большие перспективы открывает использование в качестве файловой системы для хранилища образов дисков файловой системы BTRFS, поскольку в этом случае снэпшоты, сжатие и дедупликация обеспечиваются самой архитектурой ФС. Минусы — Btrfs нельзя использовать в качестве разделяемой ФС в кластерной среде, кроме того, Btrfs — относительно новая ФС и, возможно, она менее надежна, чем связка LVM и ext4.

Метод получения бекапов командой drive_backup хорош тем, что можно сразу создать резервную копию на примонтированном удаленном хранилище, однако в этом случае он создает большую нагрузку на сеть. Для остальных же способов можно предусмотреть передачу только измененных блоков с помощью rsync. К сожалению, QEMU backup не поддерживает передачу только “грязных” (измененных с момента последнего бэкапа) блоков, как это реализовано, например, в механизме VMWare CBT. Обе попытки реализовать такой механизм — livebackup и in-memory dirty bitmap не были приняты в основную ветку QEMU, судя по всему, первый — из-за архитектуры (добавляется лишний демон и отдельный сетевой протокол только для этой операции), второй — из-за очевидных ограничений в применении: карта “грязных” блоков может храниться только в оперативной памяти.

В заключение рассмотрим ситуацию, при которой ВМ имеет несколько подключенных образов дисков. Очевидно, для такой ВМ нужно создавать снэпшоты всех дисков одновременно. Если вы используйте Libvirt, то волноваться вам нечего — библиотека берет все заботы по синхронизации снэпшотов на себя. Но, если вы хотите выполнить эту операцию на «чистом» QEMU, то существует два способа сделать это: остановить ВМ командой stop, получить снэпшоты, а затем продолжить исполнение ВМ командой cont или же использовать механизм транзакционного выполнения команд, имеющийся в QEMU. Нельзя использовать для этой цели только гостевой агент QEMU и команды guest-fsfreeze-freeze/guest-fsfreeze-thaw, поскольку хоть агент и «замораживает» все смонтированные ФС за одну команду, однако делает это не одновременно, а последовательно, так что возможна рассинхронизация между томами.

Если вы нашли в статье ошибку, или же вам есть, что сказать — прошу в комментарии.

Делайте бэкапы, господа!

Как проверить и восстановить работу QEMU Guest Agent?

QEMU Guest Agent — это программа-демон, которая устанавливается на ВМ. QEMU Guest Agent обеспечивает выполнение команд на ВМ и обмен информацией между ВМ и узлом кластера.

VMmanager использует QEMU Guest Agent чтобы изменять сетевые настройки ВМ без перезагрузки. Если QEMU Guest Agent недоступен для платформы в течение пяти минут, VMmanager перезагрузит ВМ для применения настроек.

Чтобы управлять ВМ с ОС CentOS, в QEMU Guest Agent должна быть включена функция guest-exec.

Чтобы избежать незапланированного перезапуска ВМ, вы можете проверить статус QEMU Guest Agent перед изменением настроек. Это можно сделать на ВМ или узле кластера.

Диагностика на ВМ

  1. Подключитесь к ВМ по SSH.
  2. Определите статус QEMU Guest Agent:
systemctl status qemu-guest-agent

Примеры ответов:
QEMU Guest Agent запущен

● qemu-guest-agent.service - QEMU Guest Agent Loaded: loaded (/usr/lib/systemd/system/qemu-guest-agent.service; enabled; vendor preset: enabled) Active: active (running) since Вт 2021-08-10 05:25:54 UTC; 1 weeks 3 days ago

QEMU Guest Agent остановлен

● qemu-guest-agent.service - QEMU Guest Agent Loaded: loaded (/usr/lib/systemd/system/qemu-guest-agent.service; enabled; vendor preset: enabled) Active: inactive (dead) since Пт 2021-08-20 06:27:16 UTC; 2s ag

QEMU Guest Agent не установлен

Unit qemu-guest-agent.service could not be found.

Диагностика на узле кластера

  1. Подключитесь к узлу кластера по SSH.
  2. Определите статус QEMU Guest Agent:
virsh qemu-agent-command _ '>'

Пояснения к команде

_ — имя файла ВМ, содержащее id и имя ВМ. Например, для ВМ с id 12 и именем test-vm имя файла должно быть 12_test_vm

Если QEMU Guest Agent запущен, вы получите ответ вида:
Фрагмент ответа в JSON
Если QEMU Guest Agent не запущен или остановлен, вы получите ответ вида:

ошибка: Guest agent is not responding: QEMU guest agent is not connected
virsh qemu-agent-command _ '' --pretty | grep -B1 "guest-exec"

Пояснения к команде

_ — имя файла ВМ, содержащее id и имя ВМ. Например, для ВМ с id 12 и именем test-vm имя файла должно быть 12_test_vm

Фрагмент ответа, если функция включена

"enabled": true, "name": "guest-exec",

Фрагмент ответа, если функция выключена

"enabled": false, "name": "guest-exec",

Восстановление работы

Если QEMU Guest Agent не установлен

  1. Подключитесь к ВМ по SSH.
  2. Установите QEMU Guest Agent:
yum install qemu-guest-agent

ОС Debian, Ubuntu

apt install qemu-guest-agent
systemctl enable --now qemu-guest-agent
systemctl status qemu-guest-agent
sestatus
  1. Отключите SELinux. Для этого замените в файле /etc/selinux/config строку
SELINUX=enforcing
SELINUX=disabled
BLACKLIST_RPC=guest-file-open,guest-file-close,guest-file-read,guest-file-write,guest-file-seek,guest-file-flush,guest-exec,guest-exec-status
  1. Закомментируйте или удалите эту строку.
  2. Перезапустите QEMU Guest Agent:
systemctl restart qemu-guest-agent

Если QEMU Guest Agent остановлен

  1. Подключитесь к ВМ по SSH.
  2. Запустите QEMU Guest Agent:
systemctl start qemu-guest-agent

Если функция guest-exec отключена

  1. Подключитесь к ВМ по SSH.
  2. Выполните команду:
sed -i '/BLACKLIST_RPC=/cBLACKLIST_RPC=' /etc/sysconfig/qemu-ga
systemctl restart qemu-guest-agent

Автоматическая установка QEMU Guest Agent

Если VMmanager обнаружит проблемы с работой QEMU Guest Agent на ВМ, в статусе ВМ появится сообщение Проблема с Guest Agent. Чтобы восстановить работу QEMU Guest Agent автоматически, нажмите на сообщение Проблема с Guest Agent → кнопка Установить GA и перезапустить VM.

При восстановлении QEMU Guest Agent в ОС семейства Windows ВМ может быть неактивной в течение продолжительного времени. В некоторых случаях период восстановления может быть более 30 минут. Это происходит из-за того, что при восстановлении платформа создаёт резервную копию диска ВМ.

Как подключить qemu-guest-agent на VM в Proxmox

Proxmox

Сегодня расскажу как подключить на виртуальную машину (ВМ) в Proxmox утилиту qemu-guest-agent для просмотра IP-адреса через WEB-интерфейс и правильной завершении работы ВМ.

Содержание

  1. 1. Что такое qemu-guest-agent
  2. 2. Установка qemu-guest-agent
    1. 2.1. На Proxmox
    2. 2.2. На Linux VM
    3. 2.3. На Windows VM

    Что такое qemu-guest-agent

    qemu-guest-agent – это вспомогательный демон, который устанавливается в гостевой системе. Он используется для обмена информацией между хостом и гостем, а также для выполнения команды в госте.

    В Proxmox VE qemu-guest-agent используется в основном для двух вещей:

    1. Чтобы правильно завершить работу гостя, вместо того чтобы полагаться на команды ACPI или политики Windows
    2. Чтобы заморозить гостевую файловую систему при создании резервной копии (в Windows используйте службу теневого копирования томов VSS).

    Установка qemu-guest-agent

    На Proxmox

    Вы должны установить гостевой агент в каждой виртуальной машине, а затем включить его, вы можете сделать это в веб-интерфейсе Proxmox VE (GUI).

    qm set VMID --agent 1

    На Linux VM

    В Linux вам нужно просто установить пакет qemu-guest-agent .

    Здесь мы покажем команды для систем на базе Debian/Ubuntu и Redhat:

    В системах на Debian/Ubuntu выполняем следующие команды:

    sudo apt install qemu-guest-agent

    На системах на базе Redhat:

    yum install qemu-guest-agent

    На Windows VM

    Сначала вы должны скачать драйвер virtio-win iso (см. Windows VirtIO Drivers).

    Затем установите драйвер virtio-serial:

    1. Прикрепите ISO к виртуальной машине Windows (virtio-*.iso)
    2. Перейдите в Диспетчер устройств Windows
    3. Найдите “PCI Simple Communications Controller
    4. Щелкните правой кнопкой мыши ->Обновить драйвер и выберите на смонтированном iso DRIVE:\vioserial\\ where is your Windows Version – ваша версия Windows (например, W7 для Windows 7)

    После этого необходимо установить qemu-guest-agent:

    1. Перейти к смонтированному ISO в проводнике
    2. Установщик гостевого агента находится в каталоге гостевой агент
    3. Запустите установщик двойным щелчком (либо qemu-ga-x86_64.msi (64-разрядная версия), либо qemu-ga-i386.msi (32-разрядная версия)

    После этого qemu-guest-agent должен быть запущен.

    Если он не запущен, вы можете использовать панель управления Службами, чтобы запустить его и убедиться, что он запустится автоматически при следующей загрузке.

    Настройка qemu-guest-agent в Linux

    В зависимости от дистрибутива гостевой агент может не запускаться автоматически после установки. Для запуска воспользуемся следующими командами:

    sudo systemctl enable qemu-guest-agent sudo systemctl start qemu-guest-agent

    Проверка того, что связь с гостевым агентом работает

    Связь с гостевым агентом происходит через сокет unix, расположенный в /var/run/qemu-server/.qga Вы можете проверить связь агента qm в proxmox:

    qm agent ping 

    если qemu-guest-agent правильно запущен в виртуальной машине, он выдаст пустое сообщения.

    Если есть вопросы, то пишем в комментариях в Телеграмм и ВК.

    Ссылки в шапке страницы.
    Заранее всем спасибо.

    RSS

    • Как запустить команду в фоне в Linux
    • Ошибка несоответствие размеров GPT PMBR
    • nginx: [warn] protocol options redefined
    • Как включить поддержку linux в windows 11
    • Запускаем скрипт после запуска сети Ubuntu 22.04

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    kvm-logo

    Сегодня в статье установим и настроим KVM сервер на операционной системе Ubuntu Server 20.04 LTS. KVM — это программное обеспечения Читать

    linux-logo

    Сегодня в статье рассмотрим пример устранения ошибки “You need to install openssh-askpass or similar to connect to this host» выдаваемой Читать

    kvm-logo

    Сегодня поговорим о ошибке при установки виртуальной машины KVM. Ошибка появляется на этапе установке самой операционной системы

    kvm-logo

    Сегодня рассмотрим пример переноса виртуальной машины с VirtualBox в KVM виртуализацию. Возможно, у вас есть несколько важных гостевых машин на Читать

    Назначение опции qemu-guest-agent в параметрах ВМ

    Для чего нужна опция qemu-guest-agent и обязателен ли ее выбор в параметрах ВМ для гостевой ОС? Необходима ли установка SPICE-VDAgent для Linux в качестве гостевой ОС?

    Ответ

    Ответ доступен с подключенной услугой «Техническая поддержка».

    Внимание! Для авторизации используйте учетные данные Личного кабинета

    Если учетная запись от новой версии личного кабинета отсутствует, просим писать на почту lk@astralinux.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *