Date created: Wednesday, March 16, 2011 7:45:06 PM. Last modified: Sunday, March 26, 2017 11:18:12 AM

Backup VirtualBox Machines

A script wich grabs the name of the first .vdi file for the VM specified, makes a copy of it in a local folder and then rsync's the local .vdi archive to a remote server.

#!/bin/bash
# script to stop the VM specified, copy its first .vdi hard drive file and then start the VM again
# arguments: ./this_script_name VM_Name Local_VM_Archive_Path Receiver_Email_Address remoteuser@remotehost:/remote/backup/path

#VARIABLES:
VM=$1
# Grab the .vdi location of the first drive, drive 0,0
vdiPath=$(VBoxManage showvminfo $1 | grep "`VBoxManage showvminfo $1 | grep "Storage Controller Name (0)" | awk '{print $5}'` Controller (0, 0)" | awk '{print $5}')
# Build the backup path
backupPath=$2/`date +%Y-%m-%d--%H-%M-%S`-`basename $vdiPath` # 2010-25-12--17-30-00-my_drive.vdi
emailAddress=$3 # reports@mydomain.tld
rsyncDest=$4 # backupuser@backupfileserver:/backups/VMs

# Prep the email assuming success
MailSubject="VM Backup Succeeded"
MailTo="$emailAddress"
MailMessage="/tmp/vm_mail_tmp"
echo "VM guest $VM was successfully copied from $vdiPath to $backupPath" > $MailMessage

# Shutdown the virtual machine and give it time to make sure it has shut down
VBoxManage controlvm $VM acpipowerbutton &
sleep 30

# Make sure we don't have too many archives of the VM taking up all our space!
find /pfSense-Archive -maxdepth 1 -type f -mtime +6 | xargs rm

# Copy the VM vdi
result=`cp $vdiPath $backupPath 2>&1`
# If the copy failed (didn't exit with a status of 0)
if [ $? -ne 0 ]; then
        echo "There was a problem with the copy"

        # Adjust the email to be sent
        MailSubject="VM Backup Failed"
        echo "VM guest $VM was not backed up from $vdiPath to $backupPath" > $MailMessage
        echo "$result" >> $MailMessage
fi

# Start the VM
VBoxHeadless -s $VM -v off &

# Sync the local VM archive with the backup destination
result=`rsync -vhrP $2 $rsyncDest 2>&1`
# If rsync failed
if [ $? -ne 0 ]; then
        echo "There was a problem with rsync"

        # Adjust the email to be sent
        MailSubject="VM Backup Failed"
        echo "The local VM archive was not sync'd to $rsyncDest" >> $MailMessage
        echo "$result" >> $MailMessage
fi

ssh vmbackup@vmhost "find /pfSense-Archive -maxdepth 1 -type f -mtime +29 | xargs rm"

space=/tmp/space_tmp
df -hT > $space
echo "Remaining drive space:" >> $MailMessage
cat $space >> $MailMessage
rm $space

# Email the result
cat $MailMessage | mail -s "$MailSubject" "$MailTo"

rm $MailMessage

Previous page: IOS-XRv Example