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);
Внимание! При этом если ВМ выключена и установлен параметр saveState=yes, то бэкапирование происходить не будет, так как невозможно сохранить состояние оперативной памяти |
[править] Если виртуальная машина имеет хоть один жесткий диск в файле
или явно установлен параметр shutdownGuest=yes, делается холодный бэкап дисков виртуальной машины и ее xml определение.
- Бэкап будет включать в себя:
- образы всех жестких дисков с расширением .lzo;
- определение домена с расширением .xml (делается всегда);
Внимание! Внутри Linux гостей должна быть выставлена переменная kernel.sysrq = 1, также на «ноде виртуализации» libvirtd должен быть настроен с опцией save_image_format = "lzop", чтобы снимки памяти сжимались через lzop. |
Бэкапы будут лежать по пути: $backupDest/ИмяВиртуальнойМашины/ГодМесяцДень_Час:Минута
.
Внимание! Если скрипт отработал без ошибок — вернёт 0, ошибка — 1, не удалось забекапить какой либо виртуальный диск — 255. |
Все параметры могут быть явно заданы в самом скрипте или переопределены в файле конфигурации. В качестве единственного аргумента выступает имя файла со списком переопределенных параметров. Ниже приведен возможный список параметров:
# Путь к лог файлу 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 — скрипт на Perl для резервного копирования виртуальных машин;
[править] Материалы по виртуализации, паравиртуализации и эмуляции на Xgu.ru
- Управление ресурсами * cgroups
- Контейнеры * LXC * OpenVZ * VServer
- Паравиртуализация * Xen (Windows XP в Xen, FreeBSD в Xen) * lguest * UML
- Виртуализация * KVM * Hyper-V * VMware ESX Server * bhyve
- Эмуляция * QEMU * PEMU * Dynamips