This handy bash script I wrote, enables Xen Server Administrators to create On-Line backups (Importing the VM into.xva file) while the backed up virtual machine is up and running.
I found this extremely useful for big production environments - where lots of VM's require an appropriate & efficient back-up solution and downtime is not an option.
The script is very simple and user friendly, it's executed as root from the dom0 machine and used as follows:
In order to list all the available VM's on the system:
#./xen_onlinebackup.sh -l
In order to back up a VM:
#./xen_onlinebackup.sh -p /path/to/backupdir -s vm-name
The script supports both interactive and unattended mode (-u flag), the later designed to be built into scripts as an automation solution for large production environments.
For any help/usage, just run:
#./xen_onlinebackup.sh -h
Tested succesefully on XenServer 5.6 FP1 & XenServer 5.6 SP2.
Any comments, feed-backs or suggestions for improvements are very welcomed.
#!/bin/bash
#
#This
script used to create XenServer VM's online backup #Importing the VM into .xva
file #Written by Paul Podolny - July 2011
#Variables
COUNT=0
AUTO=0 #Used for unattended mode
VMLIST=`xe vm-list
is-control-domain=false |grep -i name-label|awk -F": " '{print $2}'`
#Functions
list() {
echo
"====================================="
echo "Listing available VM's
on $HOSTNAME..."
echo
"====================================="
for i in $VMLIST;do
echo
$i;let COUNT+=1
done
echo
"================================="
echo "Total $COUNT Virtual
Machines"
echo
"================================="
exit 0
}
usage() {
cat << EOF
This script will backup your Xen
VMs on-line:
------
Usage:
------
-h
Help/Usage.
-l List VM's.
-u Run in unattended mode (No
questions asked).
-s Server Name (Backed Up VM).
-p Path to backup.
--------
Example:
--------
$0
-s server01 -p /nfs/backupdir/ -u
EOF
exit 0
}
check_dir() {
echo "=============================================================="
echo "XenServer Online Backup"
echo "=============================================================="
if
[ -e ${BACKUPPATH}/${VMNAME} ];then
echo "Directory ${VMNAME} on path
${BACKUPPATH} seem to exist, will use it."
else
echo
"Creating dir. ${VMNAME} on backup path: ${BACKUPPATH}"
mkdir
${BACKUPPATH}/${VMNAME}
fi
echo "`date +%H:%M` Backing Up
${VMNAME}, please hold on...Do NOT interrupt with CTRL+C !!!"
echo
"================================================="
}
################################
#MAIN
Prog
################################
while getopts "s:p:lhu"
flag ; do
case $flag in
l ) list;;
s ) VMNAME=$OPTARG;;
p) BACKUPPATH=$OPTARG;;
h ) usage;;
u) AUTO=1;;
*) usage;;
esac
done
#Sanity
check - Make sure backup path + VM name
specificed if [ -z ${VMNAME} ] || [ -z ${BACKUPPATH} ];then echo "Error:Both backup path AND VM name must
be specified, exiting..."
echo "Use $0 -h for help"
exit 1
fi
#If
running in interactive mode
if [ ${AUTO} != "1"
];then
echo
"Going to back-up ${VMNAME} to ${BACKUPPATH} ,is this OK? [y/n]"
read
ANSWER
if
[ ${ANSWER} != "y" ] && [ ${ANSWER} != "Y" ];then
echo
"Exiting by users request..."
exit
1
fi
fi
fi
fi
#else
proceed with main program...
else
check_dir
TEMPUUID=$(xe
vm-snapshot vm=$VMNAME new-name-label=snap_tmp_`date +%F`)
xe
template-param-set is-a-template=false ha-always-run=false uuid=$TEMPUUID
xe
vm-export vm=${TEMPUUID}
filename=${BACKUPPATH}/${VMNAME}/${VMNAME}_backup_`date +%F`.xva
echo
"Removing Temporary Snapshot....(DO NOT PANIC!)"
xe
vm-uninstall uuid=${TEMPUUID} force=true
echo
"==============================================================="
echo
"### Back Up of ${VMNAME} Completed!###"
echo "`date +%H:%M`"
#END
OF SCRIPT