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

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

Так же у меня есть дирек­то­рия, куда я пла­ни­рую сохра­нять резерв­ные копии вир­ту­аль­ных машин:

# df -h | grep 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"]

[/codesyntax]

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

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

# ls -la test-centos

KVM: резервное копирование без остановки виртуальной машины

Есте­ствен­но, в боль­шин­стве слу­чае адми­ни­стра­то­ры хотят исполь­зо­вать вари­ант “живо­го” резерв­но­го копи­ро­ва­ния вир­ту­аль­ных машин KVM без оста­нов­ки. Он немно­го слож­нее пер­во­го вари­ан­та и тре­бу­ет допол­ни­тель­ных дей­ствий. В дан­ном вари­ан­те исполь­зу­ет­ся созда­ние снап­шо­та и после­ду­ю­щее его объ­еди­не­ние с фай­лом дис­ка вир­ту­аль­ной маши­ны. В самом нача­ле ста­тьи я писал, что исполь­зую фор­мат дис­ков qcow2 и как раз это и поз­во­ля­ет создать живой бэкап. Для того, что­бы вы мог­ли кор­рект­но создать копию вир­ту­аль­ной маши­ны, в ВМ дол­жен быть добав­лен Channel Device с име­нем org.qemu.guest_agent.0 (мож­но доба­вить через кон­фи­гу­ра­ци­он­ный файл или virt-manager).

Совет. Если не уста­но­вить настро­ить агент для госте­вые ВМ, при созда­нии снап­шо­та будет появ­лять­ся ошибка:

Не забудь­те доба­вить кон­фи­гу­ра­ци­он­ный XML файл вир­ту­аль­ной маши­ны сле­ду­ю­щий блок:

Добав­ля­ет­ся он в сек­цию “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

Где 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"]

[/codesyntax]

Дан­ный скрипт выпол­нит резерв­ное копи­ро­ва­ние подоб­но пер­во­му вари­ан­ту, толь­ко без оста­нов­ки вир­ту­аль­ной маши­ны (рабо­та­ет кор­рект­но, про­те­сти­ро­ва­но на вир­ту­аль­ных сер­ве­рах с postgresql, mariadb и nginx с php-fpm). Конеч­ный резуль­тат будет точ­но такой же, у вас будет бэкап кон­фи­гу­ра­ци­он­но­го фай­ла и фай­ла диска.

Для хра­не­ния резерв­ных копий вы може­те исполь­зо­вать уда­лен­ные сер­ве­ра (мож­но копи­ро­вать дан­ные через Rsync) или хранилища