- Резервное копирование виртуальных машин KVM без остановки
- Готовим виртуальную машину к установке агента QEMU
- Установка драйверов агента QEMU
- QEMU guest agent is not connected
- Резервное копирование виртуальных машин в KVM
- Создание резервных копий в KVM с остановкой виртуальной машины
- KVM: резервное копирование без остановки виртуальной машины
Резервное копирование виртуальных машин KVM без остановки
Есть хост 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
# cp /vms/vm1.iso /backup/vms/vm1/
# virsh blockcommit vm1 vda —active —verbose —pivot
где vda — это устройство (сокет системного диска) vm1, на котором установлена гостевая OS:
Т.е. в работающей vm1 файл диска — /vms/vm1.iso, устройство — vda.
Но прямо с первой команды мы получим ошибку:
error: argument unsupported: QEMU guest agent is not configured
Для того, чтобы гостевую виртуальную машину можно было бекапить без ее остановки, нужно сделать несколько шагов:
- указать в конфиге vm агента QEMU
- в гостевой vm установить службу агента QEMU
- убедиться, что хост и агент взаимодействуют.
- делать бекапы.
Готовим виртуальную машину к установке агента QEMU
Способ первый (с выключением гостевой виртуальной машины).
В конфигурацию гостевой vm нужно добавить специальное устройство — агент QEMU.
В параметре source указывается имя сокета, которое должно быть уникальным в рамках хоста. Также надо отметить, что при включенном SELinux могут быть проблемы с соединением к этому сокету, из-за чего может возникать ошибка «QEMU guest agent is not connected».
# virsh edit vm1
Domain vm1 XML configuration edited.
Внимание! Выключить и включить гостевую виртуальную машину (перезагрузка может не помочь).
Второй способ (без выключения виртуальной машины):
Этот способ я нашел позднее и не проверял лично, но, тем не менее, он указан в руководстве Red Hat.
Готовим файл agent-win7.xml:
# virsh attach-device vm1 agent-win7.xml
Применительно к CentOS/RedHat указывать уникальный путь bind не требуется, поэтому шаблон может быть одинаковым для разных vm. Итак, готовим файл agent.xml:
# 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):
- ошибки запуска агента в гостевой vm1 (например, виртуальная машина не была перезагружена или не были запущены службы QEMU Guest Agent и QEMU Guest Agent VSS Provider);
- из-за включенного SELinux на хосте (попробуйте отключить «setenforce 0 » и посмотреть, будет connected или нет)
- или еще из-за чего-нибудь.
Исправляем и пробуем наконец-то сделать бекап виртуальной машины без ее остановки:
# 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.
Авторизуйтесь для добавления комментариев!
Резервное копирование виртуальных машин в KVM
21.04.2020
VyacheslavK
CentOS, KVM, Linux, Виртуализация
комментариев 6
В данной статье мы рассмотрим несколько вариантов резервного копирования виртуальных машин на гипервизоре KVM, а так сценарии восстановления из бэкапов. Хочется сразу отметить, что как таковых удобных инструментов для резервного копирования под KVM нет, и каждый администратор использует свои варианты, скрипты и костыли. Есть 2 сценария бэкапа ВМ в KVM: с остановкой ВМ (самый простой, но используется крайне редко) и без остановки виртуальной машины.
Прежде всего хочется отметить, что особенности резервного копирования в вашем KVM сильно зависят от типа используемых виртуальных дисков: LVM, RAW (IMG) или qcow2. На моих серверах KVM диски виртуальных машин имеют формат qcow2. Я считаю, что данный формат выигрывает у остальных по двум причинам:
Поэтому виртуальные диски в формате qcow2 для меня бэкапить проще всего.
Создание резервных копий в KVM с остановкой виртуальной машины
Если ваш проект допускает кратковременную остановку виртуальной машины, то можно воспользоваться самым простым способом создания резервной копии. Для того, чтобы у вас всегда под рукой были актуальные резервные копии, вам нужно скопировать файл диска и конфигурационный файл самой виртуальной машины (на случай если меняется конфигурация).
С помощью virsh выведем список виртуальных машин в KVM:
Id Name State ---------------------------------------------------- 1 test-centos running 4 generic running
Так же у меня есть директория, куда я планирую сохранять резервные копии виртуальных машин:
/dev/sda1 1.8T 77M 1.7T 1% /backup
Конфигурационный файл виртуальной машины, можно скопировать следующей командой:
# virsh dumpxml VM > /backup/VM.xml
Где VM – это имя вашей виртуальной машины.
Теперь, чтобы создать резервную копию диска виртуальной машины, нужно остановить виртуальную машину и скопировать образ диска в целевой каталог:
# virsh shutdown test-centos
# cp /vz/disk/test-centos.img /backup/
После того, как диск полностью скопировался, нужно запустить виртуальную машину:
Для каждой виртуальной машины, можно создавать отдельную директорию и автоматизировать процесс создания копий, добавив команды скрипт и настроить задания в cron. Ранее мы размещали статью о резервном копировании в Linux с помощью скриптов. Вы можете использовать скрипты под свои нужды, адаптировав их для KVM.
Либо можете воспользоваться небольшим и простым скриптом:
#!/bin/bash
data=`date +%Y-%m-%d`
backup_dir=/backup
vm=`virsh list | grep . | awk »| sed 1,2d | tr -s ‘\n’ ‘ ‘`
for activevm in $vm
do
mkdir -p $backup_dir/$activevm
# Бэкапим конфигурацию XML для виртуальной машины
virsh dumpxml $activevm > $backup_dir/$activevm/$activevm-$data.xml
# Адрес дисков виртуальных машин
disk_path=`virsh domblklist $activevm | grep vd | awk »`
# Останавливаем рабочую машин
virsh shutdown $activevm
sleep 2
for path in $disk_path
do
# Убираем имя файла из пути
filename=`basename $path`
# Создаем бэкап диска
gzip -c $path > $backup_dir/$activevm/$filename-$data.gz
sleep 2
virsh start $activevm
sleep 2
done
done
/usr/bin/find /backup/ -type f -mtime +7 -exec rm -rf <> \;
Добавьте данный скрипт в крон и выполняйте так часто, как вам это требуется. Скрипт автоматически останавливает виртуальную машину, бэкапит файл диска и файл конфигурации, после чего автоматически запускает виртуальную машину.
В результате выполнения скрипта, у вас будут созданы директории для каждой виртуальной машины и в них помещены файл диска и дамп конфигурации, а также удалены старые резервные копии (количество дней укажите сами):
-rw-r--r-- 1 root root 5440 Feb 19 12:17 test-centos-2020-02-19.xml -rw-r--r-- 1 root root 38609784 Feb 19 12:18 test-centos.img.gz
KVM: резервное копирование без остановки виртуальной машины
Естественно, в большинстве случае администраторы хотят использовать вариант “живого” резервного копирования виртуальных машин KVM без остановки. Он немного сложнее первого варианта и требует дополнительных действий. В данном варианте используется создание снапшота и последующее его объединение с файлом диска виртуальной машины. В самом начале статьи я писал, что использую формат дисков qcow2 и как раз это и позволяет создать живой бэкап. Для того, чтобы вы могли корректно создать копию виртуальной машины, в ВМ должен быть добавлен Channel Device с именем org.qemu.guest_agent.0 (можно добавить через конфигурационный файл или virt-manager).
Совет. Если не установить настроить агент для гостевые ВМ, при создании снапшота будет появляться ошибка:
error: argument unsupported: QEMU guest agent is not configured
Не забудьте добавить конфигурационный XML файл виртуальной машины следующий блок:
Добавляется он в секцию “Device”, после чего нужно сохранить конфигурацию и выполнить ребут машины.
Затем в гостевой ОС нужно установить пакет qemu-guest-agent (установите его через yum/dnf):
# yum install qemu-guest-agent -y
Для создания снапшота ВМ используется следующая команда:
# virsh snapshot-create-as —domain VM snapshot —disk-only —atomic —quiesce –no-metadata
Где VM — это имя виртуальной машины. Далее нужно создать бэкап файла диска:
# gzip -c VM > /backup/VM/VM.gz После того, как диск виртуальной машины будет скопирован, нужно выполнить объединение его со снапшотом:
# virsh blockcommit VM vda —active —verbose —pivot
Где vda – это результат выполнения команды:
# virsh domblklist VM | grep vd | awk »
Я переделав предыдущий скрипт бэкапа с остановкой виртуальных машин. Теперь резервное копирование запускается по cron с созданием снапшотов и объединением его с диском виртуальной машины:
#!/bin/bash
data=`date +%Y-%m-%d`
backup_dir=/backup
vm=`virsh list | grep . | awk »| sed 1,2d | grep -vf /root/bin/exclude | tr -s ‘\n’ ‘ ‘`
for activevm in $vm
do
mkdir -p $backup_dir/$activevm
# Бэкапим конфигурацию XML для виртуальной машины
virsh dumpxml $activevm > $backup_dir/$activevm/$activevm-$data.xml
# Список дисков виртуальных машин
disk_list=`virsh domblklist $activevm | grep vd | awk »`
# Адрес дисков виртуальных машин
disk_path=`virsh domblklist $activevm | grep vd | awk »`
# Создаем снапшот диcков
virsh snapshot-create-as —domain $activevm snapshot —disk-only —atomic —quiesce —no-metadata
sleep 3
for path in $disk_path
do
# Убираем имя файла из пути
filename=`basename $path`
# Создаем бэкап диска
gzip -c $path > $backup_dir/$activevm/$filename-$data.gz
sleep 3
done
for disk in $disk_list
do
# Определяем путь до снепшота
snapshot=`virsh domblklist $activevm | grep $disk | awk »`
# Объединяем снапшот с диском
virsh blockcommit $activevm $disk —active —verbose —pivot
sleep 2
# Удаляем снепшот
rm -rf $snapshot
done
done
/usr/bin/find /backup/ -type f -mtime +7 -exec rm -rf <> \;
Данный скрипт выполнит резервное копирование подобно первому варианту, только без остановки виртуальной машины (работает корректно, протестировано на виртуальных серверах с postgresql, mariadb и nginx с php-fpm). Конечный результат будет точно такой же, у вас будет бэкап конфигурационного файла и файла диска.
Для хранения резервных копий вы можете использовать удаленные сервера (можно копировать данные через Rsync) или хранилища . В одной из статей мы настраивали подключения к популярным облачным сервисам, таким образом вы можете сэкономить дисковое пространство на своем сервере.
Предыдущая статья Следующая статья