Сделать полноценную систему копирования с конфиг файлом состоящим из... списка имён виртуальных машин
Используемый софт
libvirtd (qemu + kvm) для виртуализации
ssh для связи с сервером виртуализации
rdiff-backup для создания резервных копий
bash для создания удобной обёртки
cron для автоматизации всего этого безумия
Реализация
Итак, как было указано выше, в качестве конфига - список имён виртуалок. Учитывая то, что сервер виртуализации один, то его адрес является константой и задаётся в скрипте. Что из себя представляет бэкап виртуальной машины?
Поскольку горячая копия дисков является небезопасной, то предварительно виртуальные машины должны быть выключены (не с помощью 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