Бэкап linux виртуальных машин

Резервное копирование виртуальных машин 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

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

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

Готовим виртуальную машину к установке агента 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:

Читайте также:  Установка google chrome arch linux

# 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):

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

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

# 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

date

21.04.2020

user

VyacheslavK

directory

CentOS, KVM, Linux, Виртуализация

comments

комментариев 6

В данной статье мы рассмотрим несколько вариантов резервного копирования виртуальных машин на гипервизоре KVM, а так сценарии восстановления из бэкапов. Хочется сразу отметить, что как таковых удобных инструментов для резервного копирования под KVM нет, и каждый администратор использует свои варианты, скрипты и костыли. Есть 2 сценария бэкапа ВМ в KVM: с остановкой ВМ (самый простой, но используется крайне редко) и без остановки виртуальной машины.

Прежде всего хочется отметить, что особенности резервного копирования в вашем KVM сильно зависят от типа используемых виртуальных дисков: LVM, RAW (IMG) или qcow2. На моих серверах KVM диски виртуальных машин имеют формат qcow2. Я считаю, что данный формат выигрывает у остальных по двум причинам:

Поэтому виртуальные диски в формате qcow2 для меня бэкапить проще всего.

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

Если ваш проект допускает кратковременную остановку виртуальной машины, то можно воспользоваться самым простым способом создания резервной копии. Для того, чтобы у вас всегда под рукой были актуальные резервные копии, вам нужно скопировать файл диска и конфигурационный файл самой виртуальной машины (на случай если меняется конфигурация).

Читайте также:  Astra linux точка восстановления системы

С помощью 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/

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

резевная копия виртуальной машины в kvm

Для каждой виртуальной машины, можно создавать отдельную директорию и автоматизировать процесс создания копий, добавив команды скрипт и настроить задания в 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 <> \;

Добавьте данный скрипт в крон и выполняйте так часто, как вам это требуется. Скрипт автоматически останавливает виртуальную машину, бэкапит файл диска и файл конфигурации, после чего автоматически запускает виртуальную машину.

В результате выполнения скрипта, у вас будут созданы директории для каждой виртуальной машины и в них помещены файл диска и дамп конфигурации, а также удалены старые резервные копии (количество дней укажите сами):

бэкап ВМ в kvm

-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).

Читайте также:  Linux bash экранирование кавычек

Совет. Если не установить настроить агент для гостевые ВМ, при создании снапшота будет появляться ошибка:

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 »

бэкап конфигурационного файла и образа диска kvm

Я переделав предыдущий скрипт бэкапа с остановкой виртуальных машин. Теперь резервное копирование запускается по 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) или хранилища . В одной из статей мы настраивали подключения к популярным облачным сервисам, таким образом вы можете сэкономить дисковое пространство на своем сервере.

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Источник

Оцените статью
Adblock
detector