Сервер в кармане, или просто о сложном!

главная - Статьи - Виртуализация



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

Дата обновления: 11.06.2024

Теги: kvm Windows Linux

Есть хост CentOS 7, KVM, гость vm1 (Windows 7 x64, но что Windows, что Linux, отличаться по сути будет только установка драйвера внутри гостевой vm). Пока виртуальная машина работает, копировать ее диск - идея неправильная. Непонятно, что будет скопировано и непонятно, восстановится ли потом. Идея live backup (т.е. backup без остановки) состоит в следующем - делаем снапшот виртуальной машины, при этом чтение/запись начинает выполняться в этот снапшот. Сразу после создания снапшота исходный диск виртуальной машины уже ничем не занят - все новое копируется в файл снапшота. Можно спокойно скопировать этот диск. Это займет какое-то время, в течении которого vm работает, что-то записывается, удаляется. После того, как мы спокойно скопируем диск, нужно будет дать команду все из снапшота залить в основной диск vm. Снапшот нам нужен был только как временная мера.

Снепшот -> бекап диска -> объединение снепшота с бекапом диска:

# virsh snapshot-create-as --domain vm1 --name vm1-snapshot --disk-only --atomic --quiesce –no-metadata

где

  • --disk-only - снапшот не включает состояние гостевой виртуальной машины;
  • --atomic - если все в порядке, снапшот считается созданным, но если что-то не так - снапшот не считается созданным и не нужно потом в dumpxml разыскивать изменения.
  • --quiesce - libvirt пытается с помощью guest-agent заморозить и разморозить файловую систему гостевой системы. Если это не выходит, создание снапшота прерывается. Эта опция требует ключа --disk-only.
  • --no-metadata - метаданные снапшота отбрасываются, снапшот не помечается как current и откатиться на этот снапшот просто так не выйдет (в данном случае и не нужно).

 

Бекап диска vm1:

# cp /vms/vm1.iso /backup/vms/vm1/

Объединение:

# virsh blockcommit vm1 vda --active --verbose --pivot

где vda - это устройство (сокет системного диска) vm1, на котором установлена гостевая OS:

# virsh domblklist vm1
Target     Source
------------------------------------------------
vda        /vms/vm1.iso
hda        -

Т.е. в работающей vm1 файл диска - /vms/vm1.iso, устройство - vda.

Но прямо с первой команды мы получим ошибку:
error: argument unsupported: QEMU guest agent is not configured

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

  1. указать в конфиге vm агента QEMU
  2. в гостевой vm установить службу агента QEMU
  3. убедиться, что хост и агент взаимодействуют.
  4. делать бекапы.

 

Готовим виртуальную машину к установке агента QEMU

Способ первый (с выключением гостевой виртуальной машины).

В конфигурацию гостевой vm нужно добавить специальное устройство - агент QEMU.

# virsh edit vm1

<devices>
...
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/vm1-win7.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>
...
</devices>

В параметре source указывается имя сокета, которое должно быть уникальным в рамках хоста. Также надо отметить, что при включенном SELinux могут быть проблемы с соединением к этому сокету, из-за чего может возникать ошибка "QEMU guest agent is not connected".

# virsh edit vm1
Domain vm1 XML configuration edited.

Внимание! Выключить и включить гостевую виртуальную машину (перезагрузка может не помочь).

Второй способ (без выключения виртуальной машины):

Этот способ я нашел позднее и не проверял лично, но, тем не менее, он указан в руководстве Red Hat.

Готовим файл agent-win7.xml:

<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/vm1-win7.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>

# virsh attach-device vm1 agent-win7.xml

Применительно к CentOS/RedHat указывать уникальный путь bind не требуется, поэтому шаблон может быть одинаковым для разных vm. Итак, готовим файл agent.xml:

<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>

# virsh attach-device vm1 agent.xml

 

Установка драйверов агента QEMU

... в гостевой виртуальной машине CentOS

# yum install qemu-guest-agent
# systemctl start qemu-guest-agent

... в гостевой виртуальной машине Debian/Ubuntu

# apt install qemu-guest-agent

... в гостевой виртуальной машине Windows (VirtIO Serial driver)

Установить virtio-win драйверы в гостевую vm:

# virsh attach-disk vm1 /usr/share/virtio-win/virtio-win-0.1.171.iso hda --type cdrom --mode readonly
Disk attached successfully

Внутри гостевой виртуальной машины:

1) Установите CD-Drive:\guest-agent\qemu-ga-x64 (или x86).

2) В диспетчере устройств обновите драйвер внутри vm и перезагрузите ее (перезагрузка может и не потребоваться, но надо будет запустить службы QEMU Guest Agent и QEMU Guest Agent VSS Provider):

PCI controller Simple Communications

VirtIO Serial Driver install

VirtIO Serial Driver installed

 

QEMU guest agent is not connected

Убедитесь, что агент в гостевой виртуальной машине действительно взаимодействует с хостом. Иначе при попытке создания снапшота можем получить получить сообщение:

error: Guest agent is not responding: QEMU guest agent is not connected

Если сделать дамп состояния vm1, то видно, что агент не подключен (disconnected):

# virsh dumpxml vm1
...
    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/vm1-win7.agent'/>
      <target type='virtio' name='org.qemu.guest_agent.0' state='disconnected'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
...

А должно быть <target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>

Это может быть из-за:

  1. ошибки запуска агента в гостевой vm1 (например, виртуальная машина не была перезагружена или не были запущены службы QEMU Guest Agent и QEMU Guest Agent VSS Provider);
  2. из-за включенного SELinux на хосте (попробуйте отключить "setenforce 0" и посмотреть, будет connected или нет)
  3. или еще из-за чего-нибудь.

 

Исправляем и пробуем наконец-то сделать бекап виртуальной машины без ее остановки:

1. Снапшот:

# virsh snapshot-create-as --domain vm1 --name vm1.snap --disk-only --atomic --quiesce –no-metadata
Domain snapshot snapshot created

Копия диска:

# cp /vms/vm1.iso /backup/vms/vm1/

Конфиг:

# virsh dumpxml vm1 > /backup/vms/vm1/vm1-dumpxml.xml

Слияние снапшота с копией

# virsh blockcommit vm1 vda --active --verbose --pivot
Block commit: [100 %]
Successfully pivoted

Теперь данные будут записываться в основной диск vm1, а в backup будет копия диска и конфиг, восстановиться из которых можно с помощью virsh create или virsh define.



Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?