Thank you for reading this post, don't forget to subscribe!
Хочется сразу отметить, что как таковых удобных инструментов для резервного копирования под KVM нет, и каждый администратор использует свои варианты, скрипты и костыли. Есть 2 сценария бэкапа ВМ в KVM: с остановкой ВМ (самый простой, но используется крайне редко) и без остановки виртуальной машины.
Прежде всего хочется отметить, что особенности резервного копирования в вашем KVM сильно зависят от типа используемых виртуальных дисков: LVM, RAW (IMG) или qcow2. На моих серверах KVM диски виртуальных машин имеют формат qcow2. Я считаю, что данный формат выигрывает у остальных по двум причинам:
- Размер диска всегда имеет размер по занимаемому пространству внутри машины, его достаточно просто увеличить и уменьшить;
- Данный формат поддерживает снапшоты.
Поэтому виртуальные диски в формате qcow2 для меня бэкапить проще всего.
Создание резервных копий в KVM с остановкой виртуальной машины
Если ваш проект допускает кратковременную остановку виртуальной машины, то можно воспользоваться самым простым способом создания резервной копии. Для того, чтобы у вас всегда под рукой были актуальные резервные копии, вам нужно скопировать файл диска и конфигурационный файл самой виртуальной машины (на случай если меняется конфигурация).
С помощью virsh выведем список виртуальных машин в KVM:
# virsh list
1 2 3 4 |
Id Name State ---------------------------------------------------- 1 test-centos running 4 generic running |
Так же у меня есть директория, куда я планирую сохранять резервные копии виртуальных машин:
# df -h | grep backup
1 |
/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.
Либо можете воспользоваться небольшим и простым скриптом:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/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 {} \; |
[/codesyntax]
Добавьте данный скрипт в крон и выполняйте так часто, как вам это требуется. Скрипт автоматически останавливает виртуальную машину, бэкапит файл диска и файл конфигурации, после чего автоматически запускает виртуальную машину.
В результате выполнения скрипта, у вас будут созданы директории для каждой виртуальной машины и в них помещены файл диска и дамп конфигурации, а также удалены старые резервные копии (количество дней укажите сами):
# ls -la test-centos
1 2 |
-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).
Совет. Если не установить настроить агент для гостевые ВМ, при создании снапшота будет появляться ошибка:
1 |
error: argument unsupported: QEMU guest agent is not configured |
Не забудьте добавить конфигурационный XML файл виртуальной машины следующий блок:
1 2 3 4 5 |
<channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel> |
Добавляется он в секцию “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 '{print $1}'
Я переделав предыдущий скрипт бэкапа с остановкой виртуальных машин. Теперь резервное копирование запускается по cron с созданием снапшотов и объединением его с диском виртуальной машины:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/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 {} \; |
[/codesyntax]
Данный скрипт выполнит резервное копирование подобно первому варианту, только без остановки виртуальной машины (работает корректно, протестировано на виртуальных серверах с postgresql, mariadb и nginx с php-fpm). Конечный результат будет точно такой же, у вас будет бэкап конфигурационного файла и файла диска.
Для хранения резервных копий вы можете использовать удаленные сервера (можно копировать данные через Rsync) или хранилища