воскресенье, 11 марта 2012 г.

Simple DNAT function


makednat() {
[ "$#" != "3" ] && return 1
iptables -t nat -I PREROUTING -p tcp --dport $1 -j DNAT --to-dest $2:$3
iptables -I FORWARD -s $2 -j ACCEPT
iptables -I FORWARD -d $2 -j ACCEPT
}

makednat 8686 10.80.140.1 22 #desktop

Libvirtd virtual machines backup



Задача

Сделать полноценную систему копирования с конфиг файлом состоящим из... списка имён виртуальных машин

Используемый софт

  1. libvirtd (qemu + kvm) для виртуализации
  2. ssh для связи с сервером виртуализации
  3. rdiff-backup для создания резервных копий
  4. bash для создания удобной обёртки
  5. 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