kvm backup

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

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

Написано (переделано) по мотивам: https://github.com/Win2ix/vmsnapshot/blob/master/vmsnapshot

Сам скрипт: Файл:Vmsnapshot.txt.

Скрипт использует команду virsh, тоисть с чистым kvm не работает. За раз бэкапит одну машину, работает в двух режимах:

[править] Если все диски виртуальной машины находятся на lvm томах

делается снимок ее оперативной памяти (при этом она сама переходит в состояние suspend ), далее делаются снапшоты всех lvm томов и виртуальная машина снова переходит в рабочее состояние с последующим снятием резервной копии со снапшотов.

  • Бэкап будет включать в себя:
    • образы всех жестких дисков с расширением .lzo;
    • снимок памяти с расширением .vmstate;
    • определение домена с расширением .xml (если dumpDomain=yes);


[править] Если виртуальная машина имеет хоть один жесткий диск в файле

или явно установлен параметр shutdownGuest=yes, делается холодный бэкап дисков виртуальной машины и ее xml определение.

  • Бэкап будет включать в себя:
    • образы всех жестких дисков с расширением .lzo;
    • определение домена с расширением .xml (делается всегда);


Бэкапы будут лежать по пути: $backupDest/ИмяВиртуальнойМашины/ГодМесяцДень_Час:Минута.


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

# Путь к лог файлу
logPath=/var/log/vmbackup 
# Делать снимок оперативной памяти
saveState=yes 
# Имя виртуальной машины
guest="test_10" 
# Размер снапшота lvm, суммарно в группе томов должно быть свободно
# n*snapshotSize, где n — количество виртуальных дисков vm
snapshotSize=5G 
# Кому слать сообщения об ошибках
email=root 
# Опции для команды dd( менять не нужно)
ddOptions="bs=100M conv=notrunc" 
# Папка куда делать бэкап
backupDest="/opt/backup/vm_states" 
# Имя команды для сжатия образа жесткого диска с опциями
lzop="lzop -c -1" 
# Сохранять xml описание домена
dumpDomain=yes 
# Выключать ВМ перед сохранением резервной копии
shutdownGuest=no
# Команда через которую будет осуществляться выключение ВМ, если не определено
# используется virsh shutdown vm_name
shutdownCommand=""
# Включать ВМ после бэкапа, имеет смысл только при shutdownGuest=yes 
startGuestAfterBackup=yes  
# Таймаут времени перед повторной проверкой состояния ВМ 
# после отправки команды на выключение
sleepShutdown=30 
# Важно!
# Максимальное количество попыток проверки выключилась ли ВМ.
# Тоесть после выполнения команды virsh shutdown скрипт будет ждать 
# sleepShutdown*sleepCount секунд, чтобы она выключилась и если результат отрицательный
# -прекратит свою работу.
sleepCount=5 
# Запускать гостя после холодного бэкапа
startGuestAfterBackup=yes
# Диски ВМ, которые не будут сохраняться в резервной копии
# формат строго один диск на строчку
# Пример:
# excludeDisk="
# /dev/sda
# /dev/sdb
# "
excludeDisk="
"

[править] Восcтановление виртуальной машины из резервной копии снятой скриптом vmsnapshot

[править] Автоматическое восстановление ВМ

Cкрипт восстановления: Файл:Vmrestore.txt.

Скрипт предназначен только для восстановления 1 к 1 бэкапов созданных скриптом vmsnapshot ( xml файл конфигурации домена должен присутствовать в бэкапе, по умолчанию так и есть, из него берется имя ВМ и типы дисков), lvm группы томов должны существовать в системе на которой происходит восстановление( сами тома или папка где храниться raw образ диска ВМ могут быть созданы автоматически при указании force=yes ). Параметры задаются в самом скрипте или в конфиге( любой переданный первым аргументом файл содержащий список переменных):

# Путь к лог файлу
logPath=/var/log/vmrestore 
# Кому слать сообщения об ошибках
email=root 
# Путь до бэкапа созданного скриптом vmsnapshot
srcRestore="/opt/backup/vm_states/test_30/20130808_11:28" 
# Создавать lv и папки где храняться диски ВМ. Если не существуют
force=yes 
# Запускать ВМ после востановленя, актуально только для холодного бэкапа,
# Виртуалки снятые на «горячую» запустяться с восстановлением памяти
startAfterRestore=yes 

[править] Ручное восстановление ВМ

[править] С холодного бэкапа

Восстанавливаем диски вм в нужное место , пример:

lzop -dc disk1.lzo > /new/path/disk1.img
lzop -dc disk1.lzo > /dev/vg_name/vm_disk1

меняем путь до соответствующего диска в xml определении домена( используя nano, vim, mcedit) и если мы поменялии тип диска ( был в файле стало lvm или наоборот) меняем тип диска и source ( type='file', source file= для диска в файле и type='block', source dev= для диск на блочном устройстве)

Пример: Преносим вм из файла(/opt/vm/disk1.img) на lvm (/dev/vg_system/disk1)

было:

<disk type='file' device='disk'> 
 <driver name='qemu' type='raw' io='native'/> 
 <source file='/opt/vm/disk1.img'/> 
 <target dev='vda' bus='virtio'/> 
 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 
</disk> 

стало:

<disk type='block' device='disk'> 
 <driver name='qemu' type='raw' io='native'/> 
 <source dev='/dev/vg_system/disk1'/> 
 <target dev='vda' bus='virtio'/> 
 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 
</disk> 

Определяем домен из xml конфигурации

virsh define domain.xml

Если все сделано правильно, можем запустить ВМ

visrsh start vm_name

Если не запускается — смотрим /var/log/messages

[править] С горячего бэкапа

Восстанавливаем диски вм в нужное место , пример:

lzop -dc disk1.lzo > /new/path/disk1.img
lzop -dc disk1.lzo > /dev/vg_name/vm_disk1

меняем путь до соответствующего диска в xml определении домена( используя nano, vim, mcedit) и если мы поменялии тип диска ( был в файле стало lvm или наоборот) меняем тип диска и source ( type='file', source file= для диска в файле и type='block', source dev= для диск на блочном устройстве)

Пример: Преносим вм из файла(/opt/vm/disk1.img) на lvm (/dev/vg_system/disk1)

было:

<disk type='file' device='disk'> 
 <driver name='qemu' type='raw' io='native'/> 
 <source file='/opt/vm/disk1.img'/> 
 <target dev='vda' bus='virtio'/> 
 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 
</disk> 

стало:

<disk type='block' device='disk'> 
 <driver name='qemu' type='raw' io='native'/> 
 <source dev='/dev/vg_system/disk1'/> 
 <target dev='vda' bus='virtio'/> 
 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> 
</disk> 

Восстанавливаем домен из снимка памяти:

visrh restore vm_name.vmstate --xml domain.xml 

Если не восстанавливаеться — смотрим /var/log/messages. При этом важно чтобы на хост системе был доступен объем памяти указанный для виртуальной машины, и хост система максимально повторяла хост систему на которой стояла резервируемая виртуальная машина. Дампим новое определение домена и восстаналиваем его:

virsh dumpxml /tmp/domain.xml

Восстанавливаем определение домена:

virsh define  /tmp/domain.xml

[править] См. также

  • virt-backup.pl Github.png — скрипт на Perl для резервного копирования виртуальных машин;

[править] Материалы по виртуализации, паравиртуализации и эмуляции на Xgu.ru

Источник — «http://xgu.ru/wiki/kvm_backup»