#!/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