Недавно понадобилось автоматизировать создание и сохранение снепшотов виртуальных машин из XenServer. Ничего не найдя по этой теме в русскоязычном сегменте я пошёл в мировой интернет и нашёл статью на ресурсе tecadmin.net, которая мне очень помогла, поэтому я решил разместить её перевод на Хабре. Далее авторский (с адаптацией под нашу речь) перевод исходной статьи:

Я работаю с Citrix XenServer уже много лет, и управление всеми серверами виртуализации через приложение XenCenter, которое установлено на моём компьютере с ОС Windows. До сегодняшнего дня мы регулярно производили резервное копирование виртуальных машин вручную, так же приходилось останавливать сервера для их копирования. Большинство владельцев серверов не могут позволить себе их отключение на длительное время. Поэтому я нашёл способ, как копировать виртуальные машины без их выключения и, соответсвенно, простоя.

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

Ручной бекап запущенной машины

  1. Поиск UUID виртаульной машины

    xe vm-list is-control-domain=false is-a-snapshot=false

    Данна команда покажет список виртуальных машин и их UUID, которые нам нужные для следующего шага.

  2. Создание снепшота

    Параметр uuid необходимо заменить на свой, полученный на первом шаге, убедитесь, что он правильный.

    xe vm-snapshot uuid=8ac95696-94f3-83c1-bc89-8bb2603f832b new-name-label=testvmsnapshot

    А эта команда вернёт uuid снепшота, по которому его можно будет сохранить в файл

    xe template-param-set is-a-template=false ha-always-run=false uuid=b15c0531-88a5-98a4-e484-01bc89131561
    

  3. Сохранение снепшота в файл

    Теперь можно сохранить полученный снепшот в .xva-файл, который можно использовать для восстановления сервера как из командной строки, так и из XenCenter

    xe vm-export vm=b15c0531-88a5-98a4-e484-01bc89131561 filename=vm-backup.xva

  4. Удаление снепшота

    После сохранения .xva-файла можно удалить снепшот из самого XenServer

    xe vm-uninstall uuid=b15c0531-88a5-98a4-e484-01bc89131561 force=true

Скрипт автоматического бекапа запущенных виртуальных машин

Для резервного копирования всех виртуальных машин, работающих на базе xenserver можно использовать следующий bash-скрипт. Данный скрипт создаёт снепшоты и экспортирует их на NFS-диск. У меня этот скрипт работает отлично, чего может не буть у вас, поэтому используйте его на собственный страх и риск.


#!/bin/bash
#
# Written By: Mr Rahul Kumar
# Created date: Jun 14, 2014
# Last Updated: Jan 22, 2016
# Version: 1.2
# Visit: http://tecadmin.net
#

DATE=`date +%d%b%Y`
XSNAME=`echo $HOSTNAME`
MOUNTPOINT=/xenmnt
UUIDFILE=/tmp/xen-uuids.txt
NFS_SERVER_IP="192.168.10.100"

### Create mount point

mkdir -p ${MOUNTPOINT}

### Mounting remote nfs share backup drive

[ ! -d ${MOUNTPOINT} ]  && echo "No mount point found, kindly check"; exit 0
mount -F nfs ${NFS_SERVER_IP}:/backup/citrix/vms ${MOUNTPOINT}

BACKUPPATH=${MOUNTPOINT}/${XSNAME}/${DATE}
mkdir -p ${BACKUPPATH}
[ ! -d ${BACKUPPATH} ]  && echo "No backup directory found"; exit 0


# Fetching list UUIDs of all VMs running on XenServer
xe vm-list is-control-domain=false is-a-snapshot=false | grep uuid | cut -d":" -f2 > ${UUIDFILE}

[ ! -f ${UUIDFILE} ] && echo "No UUID list file found"; exit 0

while read VMUUID
do
    VMNAME=`xe vm-list uuid=$VMUUID | grep name-label | cut -d":" -f2 | sed 's/^ *//g'`

    SNAPUUID=`xe vm-snapshot uuid=$VMUUID new-name-label="SNAPSHOT-$VMUUID-$DATE"`

    xe template-param-set is-a-template=false ha-always-run=false uuid=${SNAPUUID}

    xe vm-export vm=${SNAPUUID} filename="$BACKUPPATH/$VMNAME-$DATE.xva"

    xe vm-uninstall uuid=${SNAPUUID} force=true

done < ${UUIDFILE}

umount ${MOUNTPOINT}

P.S. Не знаю, почему у автора возникли проблемы с бекапом запущенных машин — XenCenter позволяет создавать снепшоты и сохранять их в файл, не выключая машину (конечно, если на ней установлен XenTools. А вот его скрипт автоматизации мне очень помог, кроме этого его можно изменить под различные условия, например монтировать не NFS, а SMB или просто внешний диск
Как вы делаете бекапы виртуальных машин?

Проголосовало 36 человек. Воздержалось 12 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (6)


  1. D1abloRUS
    11.12.2016 23:17
    +1

    Есть у меня роль ansible, https://github.com/D1abloRUS/xenserver-backupvm, бэкапит вм из списка на стордж подключенный, можете переписать как вам угодно. На стордж, потому что время восстановления из бэкапа меньше 5 сек, так же там есть в репе есть роль, которая апдейты на ксен накатывает разных версий, тож ansible и нотификации шлет если новый апдейт вышел, вроде как работает начиная с версия ксена 6.2 и по 7


  1. ifaustrue
    12.12.2016 11:22

    А только я ловил проблемы при использовании снепшотов в XenServer?

    В том плане, что вот такой подход в итоге привел меня к тому, что производительность диска VM оочень замедлилась, а краткое расследование показало наличие десятков дельта файлов, которые Xen никак не мог смёржить с основным разделом и делал снепшоты один поверх другого, с каждой новой итерацией «поедая» драгоценные IOPS.
    В итоге конечно всё решилось — пара часов машина полежала выключенной и всё смёржилось, но осадочек остался.


    1. iriswind
      12.12.2016 13:37

      Также сталкивался с подобной проблемой. При типе хранилища lvm, если диск VM большой в объеме и свободного места в хранилище мало, то удалить снепшот была задача нетривиальная.


  1. iriswind
    12.12.2016 12:07

    Продолжительное время использую скрипт Andy Burton.
    http://www.andy-burton.co.uk/blog/.


  1. xxz
    12.12.2016 17:13

    XenCenter позволяет создавать снепшоты и сохранять их в файл, не выключая машину (конечно, если на ней установлен XenTools.

    Это vm-snapshot-with-quiesce зависит от установленных xentools, а для vm-snapshot этого не требуется.

    Мы раньше бэкапили не все запущенные виртуалки, а только с тэгом backup:
    xe vm-list tags:contains=backup ...
    

    Добавляешь к виртуалке тэг — она начинает бэкапится, убираешь — перестает. Нам так было удобнее.

    Позднее, чтобы ничего не запускать на хостнодах и не монтировать всякие NFS, вынесли бэкапы на отдельный хост, который общается с xen'ом через XenAPI. Пример получения списка виртуалок для бэкапа:
            ...
            all_vms = xen_session.xenapi.VM.get_all_records()
            for vm in all_vms:
                record = all_vms[vm]
                if not record["is_control_domain"] and                     not record["is_a_template"] and                     record["power_state"] == "Running" and                     not 'Transfer' in record["name_label"] and                     "backup" in record["tags"]:
                    backup_vms.append((vm, record["name_label"]))
                    logging.info("%s added for backup" % record["name_label"])
            ...
    


    Бэкапить надо не только сами виртуалки, но еще и метаданные пула и сами хостноды.

    Сейчас переходим на vdi-export, поскольку это позволяет в каких-то случаях исключать из бэкапа ненужные диски, а так же делает возможным делать incremental-бэкапы, как это реализовано в XO.


  1. bravo-ej
    13.12.2016 11:24

    Кто бы сделал доброе дело и написал бы просто про Xen, свободно распространяемый.