главная - Статьи - Виртуализация
Резервное копирование виртуальных машин KVM без остановки
Дата обновления: 11.06.2024Есть хост 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
Для того, чтобы гостевую виртуальную машину можно было бекапить без ее остановки, нужно сделать несколько шагов:
- указать в конфиге vm агента QEMU
- в гостевой vm установить службу агента QEMU
- убедиться, что хост и агент взаимодействуют.
- делать бекапы.
Готовим виртуальную машину к установке агента 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):
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'/>
Это может быть из-за:
- ошибки запуска агента в гостевой vm1 (например, виртуальная машина не была перезагружена или не были запущены службы QEMU Guest Agent и QEMU Guest Agent VSS Provider);
- из-за включенного SELinux на хосте (попробуйте отключить
"setenforce 0
" и посмотреть, будет connected или нет) - или еще из-за чего-нибудь.
Исправляем и пробуем наконец-то сделать бекап виртуальной машины без ее остановки:
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.
Авторизуйтесь для добавления комментариев!