Найти в Дзене
Записки сисадмина

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

Есть три вида админов: те, кто еще не делает бэкапов, те, кто их делает и те, кто их уже проверяет. Для кого-то это звучит как очередной анекдот, а у кого-то перед глазами пробегут те самые события, из-за которых появились первые седые волосы на голове. Резервные копии для админа - то же самое, что перцовый баллончик у девочки из неблагоприятного района: оно тебе может никогда не пригодиться, но в случае тотального ахтунга спасет тебя. Ранее я уже писал, что Qemu-KVM гибок и прост. Но как обстоят дела с резервными копиями виртуальных машин на гипервизоре? В теории, мы знаем, где находятся образы виртуалок, с помощью менеджера virsh мы можем их останавливать, копировать их образы и снова запускать. Рабочая схема? Да вроде не очень. Давайте разбираться, как бэкапить наши виртуалки в режиме реального времени, так сказать «на лету». Если канала qemu-ga нет, он создается только на выключенной виртуальной машине. virsh list virsh domblklist $ИмяВМ virsh dumpxml $ИмяВМ > /var/lib/libvirt/ba

Есть три вида админов: те, кто еще не делает бэкапов, те, кто их делает и те, кто их уже проверяет. Для кого-то это звучит как очередной анекдот, а у кого-то перед глазами пробегут те самые события, из-за которых появились первые седые волосы на голове.

Резервные копии для админа - то же самое, что перцовый баллончик у девочки из неблагоприятного района: оно тебе может никогда не пригодиться, но в случае тотального ахтунга спасет тебя.

Ранее я уже писал, что Qemu-KVM гибок и прост. Но как обстоят дела с резервными копиями виртуальных машин на гипервизоре?

В теории, мы знаем, где находятся образы виртуалок, с помощью менеджера virsh мы можем их останавливать, копировать их образы и снова запускать. Рабочая схема? Да вроде не очень.

Давайте разбираться, как бэкапить наши виртуалки в режиме реального времени, так сказать «на лету».

  • Заранее создадим папку для наших резервных копий /var/lib/libvirt/backups/
  • На хосте у нас должен быть установлен qemu-kvm и запущен демон libvitd
  • На виртуальной машине устанавливаем пакет qemu-guest-agent и создаем канал qemu-ga (в новых версиях qemu-kvm канал на ВМ создается автоматически):
-2

Если канала qemu-ga нет, он создается только на выключенной виртуальной машине.

  • Проверяем, какие ВМ у нас запущены:
virsh list
-3

  • Получаем список дисков виртуальной машины:
virsh domblklist $ИмяВМ
-4

  • Делаем отдельно бэкап конфигурации ВМ:
virsh dumpxml $ИмяВМ > /var/lib/libvirt/backups/$ИмяФайла.xml

  • Создаем snapshot виртуальной машины (делаем снимок ее состояния перед копией):
virsh snapshot-create-as --domain $ИмяВМ snapshot --disk-only --atomic --quiesce --no-metadata
-5

  • Для сжатия образа виртуальной машины используем утилиту pigz. Пока наша виртуальная машина заморожена, выполняем:
pigz -c $ОбразВМ > /var/lib/libvirt/backups/$ИмяОбраза.gz

  • Видим, что после снятия snapshot, образ диска у нас подменился, поэтому вносим коммит, указывая вместо диска имя снэпшота и размораживая нашу виртуальную машину:
virsh blockcommit $ИмяВМ $disk --active --verbose --pivot
-6
  • В конце обязательно удаляем файл snapshot (будет блокировать бэкап в следующий раз).
rm /var/lib/libvirt/images/$ИмяВМ.snapshot

  • Итого мы можем записать все команды в один скрипт и добавить его в планировщик cron:
#!/bin/bash
# Дата бэкапа
backup_date=`date +%Y-%m-%d`
# Директория с бэкапами
backup_dir=/var/lib/libvirt/backups
# Имя виртуальной машины
vm_name=ubuntu22.04
# Дамп конфигурации виртуальной машины
virsh dumpxml $vm_name > $backup_dir/$vm_name.xml
# Получения полного пути до образа виртуальной машины
disk_path=`virsh domblklist $vm_name | grep vd | awk '{print $2}'`
# Снятие снэпшота и заморозка виртуальной машины
virsh snapshot-create-as --domain $vm_name snapshot --disk-only --atomic --no-metadata
# Бэкап образа виртуальной машины
pigz -c $disk_path > $backup_dir/$vm_name+$backup_date.gz
# Получение полного пути снэпшота
snap_path=`virsh domblklist $vm_name | grep vd | awk '{print $2}'`
# Комми снэпшота и разморозка виртуальной машины
virsh blockcommit $vm_name $snap_path --active --verbose --pivot
# Удаление снэпшота
rm $snap_path