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

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

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

  • Размер диска всегда имеет размер по занимаемому пространству внутри машины, его достаточно просто увеличить и уменьшить ;
  • Данный формат поддерживает снапшоты.

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

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

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

С помощью virsh выведем список виртуальных машин в KVM:

# virsh list

Id Name State ---------------------------------------------------- 1 test-centos running 4 generic running

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

# df -h | grep backup

/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/

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

# virsh start test-centos

Для каждой виртуальной машины, можно создавать отдельную директорию и автоматизировать процесс создания копий, добавив команды скрипт и настроить задания в cron . Ранее мы размещали статью о резервном копировании в Linux с помощью скриптов . Вы можете использовать скрипты под свои нужды, адаптировав их для KVM.

Либо можете воспользоваться небольшим и простым скриптом:

#!/bin/bash
data=`date +%Y-%m-%d`
backup_dir=/backup
vm=`virsh list | grep . | awk '{print $2}'| 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 '{print $2}'`
# Останавливаем рабочую машин
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 {} ;

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

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

# ls -la test-centos

-rw-r--r-- 1 root root 5440 Feb 19 12:17 test-centos-2020-02-19.xml_x000D_-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 файл виртуальной машины следующий блок:

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

Добавляется он в секцию “Device”, после чего нужно сохранить конфигурацию и выполнить ребут машины.

Затем в гостевой ОС нужно установить пакет qemu-guest-agent (установите его через yum /dnf):

# yum install qemu-guest-agent -y

Для создания снашшотов ВМ с Windows нужно установить virtio-win.

Для создания снапшота ВМ используется следующая команда:

# 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 '{print $1}'

Я переделав предыдущий скрипт бэкапа с остановкой виртуальных машин. Теперь резервное копирование запускается по cron с созданием снапшотов и объединением его с диском виртуальной машины:
#!/bin/bash
data=`date +%Y-%m-%d`
backup_dir=/backup
vm=`virsh list | grep . | awk '{print $2}'| 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 '{print $1}'`
# Адрес дисков виртуальных машин
disk_path=`virsh domblklist $activevm | grep vd | awk '{print $2}'`
# Создаем снапшот ди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 '{print $2}'`
# Объединяем снапшот с диском
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 ) или хранилища . В одной из статей мы настраивали подключения к популярным облачным сервисам , таким образом вы можете сэкономить дисковое пространство на своем сервере.

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 месяца ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 месяца ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 месяца ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 месяца ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 месяца ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 месяца ago