У даній статті ми розглянемо кілька варіантів резервного копіювання віртуальних машин на гіпервізора KVM, а так сценарії відновлення з резервних копій. Хочеться відразу відзначити, що як таких зручних інструментів для резервного копіювання під KVM немає, і кожен адміністратор використовує свої варіанти, скрипти і милиці. Є 2 сценарії бекапа ВМ в KVM: з зупинкою ВМ (найпростіший, але використовується вкрай рідко) і без зупинки віртуальної машини.

  • Створення резервних копій в KVM з зупинкою віртуальної машини
  • 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

резервних копія віртуальної машини в kvm

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

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

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

бекап ВМ в kvm

# ls -la test-centos

-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 файл віртуальної машини наступний блок:

<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

Для створення снашшотов ВМ з Windows потрібно встановити virtio-win.

Для створення снапшотов ВМ використовується наступна команда:

# virsh snapshot-create-as --domain VM snapshot --disk-only --atomic --quiesce –no-metadata

де В.М. – це ім’я віртуальної машини. Далі потрібно створити бекап файлу диска:

# 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). Кінцевий результат буде точно такий же, у вас буде бекап конфігураційного файлу та файлу диска. бекап конфігураційного файлу і образу диска kvm

Для зберігання резервних копій ви можете використовувати віддалені сервера (можна копіювати дані через Rsync) або сховища. В одній зі статей ми налаштовували підключення до популярних хмарних сервісів, таким чином ви можете заощадити дисковий простір на своєму сервері.

Leave a Reply

Your email address will not be published. Required fields are marked *