Archive for May 12th, 2008

O script anterior foi atualizado contando com algumas melhorias sugeridas pelos seus usuários, como:

- Agora ele é escrito em Inglês, para maior portabilidade com outros usuários do xen ao redor do mundo;

- Você pode fazer backup de somente uma máquina específica, não é mais necessário esperar todo o laço terminar para ver o resultado do mesmo;

- Script parametrizado e funcões sub-divididas e

- Pequenos problemas corrigidos.

#!/bin/bash
# Backup of Xen VM's
# Tiago Cruz - tiagocruz@everlinux.com
# v 1.0 Mar/2008 - Initial version, just backup all VM's
# v 1.1 May/2008 - Now we have functions and parameters

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
BACK="_snap"
LOG=/var/log/backup.`date +%Y%m%d`
# root partition to backup ("/")
# usually the second it's swap
ROOT="1"

[ ! -d "/mnt/back" ] && mkdir -p /mnt/back
[ ! -d "/data/backup" ] && mkdir -p /data/backup

function showHelp() {
echo " "
echo "Use the following parameters: "
echo " help = Show this help"
echo " all = Backup of all VM's"
echo " list = List all VM's from this domain"
echo " = Backup one specific VM”
echo ” ”
echo “ex: back_xen.sh tomcat_shop”
echo ” ”
exit 1
}

function listVM() {
echo “List of VM’s avaliables:”
/usr/sbin/xm list | awk ‘{print $1}’ | egrep -v ‘(Name|Domain-0)’
echo ” ”
}

function backXen () {
echo “Backuping machine $i…”
echo “Please, look the progress on $LOG”
listVM | grep $i >/dev/null
if [ $? -ne 0 ]; then
echo “Machine $i does not exist, aborting!”
exit 2
fi
backup
if [ $? -eq 0 ]; then
echo “Backup of $i completed successfully!!!”
echo “Backup finalized on `date` with load `cat /proc/loadavg | cut -c 1-14`” >> $LOG
echo “==============================================” >> $LOG
echo “==============================================” >> $LOG
fi
}

function backAll () {
VMS=`xm list | awk ‘{print $1}’ | egrep -v ‘(Name|Domain-0)’`
for i in $VMS; do
backup
done
echo “Backup finalized on `date` with load `cat /proc/loadavg | cut -c 1-14`” >> $LOG
echo “==============================================” >> $LOG
echo “==============================================” >> $LOG
}

function backup () {
echo “==============================================” >> $LOG
echo “Backup $i started on `date` with load `cat /proc/loadavg | cut -c 1-14`” >> $LOG
DEVICE=`grep ^disk /etc/xen/$i | awk -F “Vol_LVM” ‘{print $2}’ | cut -d / -f 2 | cut -d , -f 1`
echo “Virtual Machine $i uses $DEVICE as storage device” >> $LOG

lvcreate –snapshot -L 15G -n $i$BACK /dev/Vol_LVM/$DEVICE >> $LOG 2>&1
[ $? -ne 0 ] && echo “Error $i: creating LVM $i$BACK” >> $LOG

kpartx -a /dev/mapper/Vol_LVM-$i$BACK >> $LOG 2>&1
mount /dev/mapper/Vol_LVM-$i$BACK$ROOT /mnt/back/ >> $LOG 2>&1
[ $? -ne 0 ] && echo “Error $i: mounting $i$BACK$ROOT” >> $LOG

SIZE1=`df -hP /mnt/back/ | awk ‘{print $3}’ | grep -v Used`
SIZE2=`df -hP /mnt/back/ | awk ‘{print $2}’ | grep -v Size`
echo “Backup of /dev/mapper/Vol_LVM-$i$BACK$ROOT - $SIZE1 of $SIZE2 used” >> $LOG
tar zcf /data/backup/$i-xen.tar.gz /mnt/back >> $LOG
[ $? -ne 0 ] && echo “Error $i: creating /LVM/backup/$i.tar.gz” >> $LOG

SIZE3=`ls -lh /LVM/backup/$i-xen.tar.gz | awk ‘{print $5}’`
echo “Created /LVM/backup/$i-xen.tar.gz with $SIZE3″ >> $LOG

sleep 1
umount /mnt/back/ >> $LOG 2>&1
[ $? -ne 0 ] && echo “Error $i: umounting $i$BACK” >> $LOG
kpartx -d /dev/mapper/Vol_LVM-$i$BACK >> $LOG 2>&1
[ $? -ne 0 ] && echo “Error $i: deleting partition mappings $i$BACK” >> $LOG

echo “Removing snapshot already backuped $i$BACK” >> $LOG
lvremove /dev/Vol_LVM/$i$BACK -f >> $LOG 2>&1
}

if [ “$#” -eq 0 ]; then
showHelp

fi

case “$1″ in
list) listVM ;;
all ) backAll ;;
help) showHelp ;;
* ) i=$1; backXen ;;
esac

Caso tenha problemas com o copy-past, você pode pegar o mesmo aqui: back_xen.sh.txt.