Задача
Сделать полноценную систему копирования с конфиг файлом состоящим из... списка имён виртуальных машинИспользуемый софт
- libvirtd (qemu + kvm) для виртуализации
- ssh для связи с сервером виртуализации
- rdiff-backup для создания резервных копий
- bash для создания удобной обёртки
- cron для автоматизации всего этого безумия
Реализация
Итак, как было указано выше, в качестве конфига - список имён виртуалок.Учитывая то, что сервер виртуализации один, то его адрес является константой и задаётся в скрипте.
Что из себя представляет бэкап виртуальной машины?
- Его конфиг в xml
- Все его виртуальные диски
Как получить всю эту радость
XML описание
echo “virsh dumpxml $machine” | ssh root@$remotehost &1>$backupdir$machine.xmlСписок дисков
egrep -o \/.*\”(img|qcow|qcow2)\”” $backupdir$machine.xml &1>/tmp/$machine.disk.list.$$Скорость создания бэкапа
Поскольку горячая копия дисков является небезопасной, то предварительно виртуальные машины должны быть выключены (не с помощью destroy, а с помощью shutdown). Следовательно операционная система должна поддерживать работу с ACPI.Если время в течении которого виртуальная машина выключена критично, то оптимальный алгоритм выглядит следующим образом
#!/bin/bash REMOTEHOST=10.80.1.120 set -x [ -n "$1" ] || exit 1 MACHINES="/etc/rdiff-backup/machine" BACKUPDIR="/storage/backup/$1/" SSH="ssh root@$REMOTEHOST" [ -f "$MACHINES" ] || exit 2 if [ ! -w "$BACKUPDIR" -o ! -d "$BACKUPDIR" ]; then mkdir "$BACKUPDIR" || exit 3 fi echo "Start time: $(date +%H:%M:%S)" while read machine; do # паузим виртуалку echo "virsh dumpxml $machine" | $SSH 1>$BACKUPDIR$machine.xml cat $BACKUPDIR$machine.xml echo "virsh shutdown $machine" | $SSH # ждём пока она вырубится while true; do echo "virsh shutdown $machine" | $SSH echo "virsh list" | $SSH | grep "$machine" [ $? = 0 ] && sleep 10 || break done # получаем список дисков list=$(egrep -o "/.*(img|qcow|qcow2)" $BACKUPDIR$machine.xml) for i in $list; do # копируем их на удаленном хосте в temp echo $i echo "cp -f $i /tmp/${i##*/}" | $SSH done # стартуем виртуалку чтобы не простаивала echo "virsh start $machine" | $SSH # забираем rdiff'ом for i in $list; do rdir="/tmp/" ldir="$BACKUPDIR$machine" [ -d "$ldir" ] || mkdir "$ldir" [ -d "$ldir" -a -w "$ldir" ] || exit 4 pattern="${i##*/}" echo -n "$REMOTEHOST:${rdir}${pattern} > $ldir"... rdiff-backup --create-full-path --exclude-symbolic-links --exclude-sockets --exclude-special-files --exclude-fifos --exclude-device-files --include-regexp ".*($pattern)" \ --exclude $rdir $REMOTEHOST::$rdir $ldir echo '... Done!' rm -f $rdir$pattern done done < $MACHINES echo "End time: $(date +%H:%M:%S)"
Автоматизация
Я автоматизировал бэкапы по крону, сделав три конфига:- daily
- weekly
- monthly
Нужный кусок кронтаба выглядит следующим образом:
#TODO
Комментариев нет:
Отправить комментарий