Skip to content

Instantly share code, notes, and snippets.

@dguerri
Created September 23, 2013 09:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dguerri/6668397 to your computer and use it in GitHub Desktop.
Save dguerri/6668397 to your computer and use it in GitHub Desktop.
Simple LibVirt//KVM backup with memory dump.
#!/bin/bash
#
# VirSH Simple Backup (davide.guerri@gmail.com)
#
# Version 1.0.1 - 20130301 (1362127750)
#
VIRSH="/usr/bin/virsh"
QEMU_IMG="/usr/bin/qemu-img"
backup_dir="/backups"
tmp_dir="/tmp"
user_domain_names="$1"
snapshot_name="$2"
running_domain_names=$(virsh list | tail -n+3 | awk '{print $2;}')
if [ -z "$user_domain_names" -o -z "$snapshot_name" ]; then
echo "Usage: $0 '<domain name(s)>|all' <snapshot name>"
exit 1
fi
domain_names=""
if [ "$user_domain_names" == 'all' ]; then
echo "Domain list:"
domain_names=$running_domain_names
echo "$domain_names"
else
for domain_name in $user_domain_names; do
for running_domain_name in $running_domain_names; do
if [ "$running_domain_name" == "$domain_name" ]; then
domain_names="$domain_name $domain_names"
break
fi
done
done
fi
echo "Backing up: $domain_names"
for domain_name in $domain_names; do
echo "Backing up domain '$domain_name'"
server_backup_dir="$backup_dir/$snapshot_name/$domain_name"
if [ -d "$server_backup_dir" ]; then
echo "Directory '$server_backup_dir' already exist skipping"
continue
fi
mkdir -p $server_backup_dir
if [ $? -ne 0 ]; then
echo "Failed to create directory '$server_backup_dir'"
exit 2
fi
echo "Dumping domain XML for '$domain_name'"
$VIRSH dumpxml $domain_name > $server_backup_dir/$domain_name.xml
if [ $? -ne 0 ]; then
echo "Domain dump failed for '$domain_name'"
exit 2
fi
echo "Saving domain '$domain_name' memory and CPU state"
date_start=$(date +"%s")
$VIRSH save $domain_name $tmp_dir/$domain_name.save >/dev/null
if [ $? -ne 0 ]; then
echo "Domain dump failed for '$domain_name'"
exit 2
fi
echo "Creating disk snapshot for '$domain_name'"
$VIRSH snapshot-create-as $domain_name $snapshot_name "Automatic snapshot by backup system - $snapshot_name" >/dev/null
if [ $? -ne 0 ]; then
echo "Domain dump failed for '$domain_name'"
exit 2
fi
echo "Restoring '$domain_name'"
$VIRSH restore $tmp_dir/$domain_name.save >/dev/null
if [ $? -ne 0 ]; then
echo "Domain dump failed for '$domain_name'"
exit 2
fi
date_stop=$(date +"%s")
date_diff=$(($date_stop - $date_start))
echo "$(($date_diff / 60)) minutes and $(($date_diff % 60)) seconds elapsed."
echo "Moving memory and CPU state for '$domain_name' to '$server_backup_dir'"
mv $tmp_dir/$domain_name.save $server_backup_dir/$domain_name.save
disk_images=$(cat $server_backup_dir/$domain_name.xml | awk '/source file/ {match($0, /source file='"'(.+)'"'\/>/, a); print substr($0, a[1, "start"], a[1, "length"])}')
echo "Copying disk images snapshots"
result=0
for image in $disk_images; do
backing_file=`$QEMU_IMG info $image | awk '/backing file/ { print $3}'`
if [ -z "$backing_file" ]; then
$QEMU_IMG convert -f qcow2 -O qcow2 -s $snapshot_name $image $server_backup_dir/$(basename $image) >/dev/null
else
echo "Using backing file '$backing_file'"
$QEMU_IMG convert -f qcow2 -O qcow2 -B $backing_file -s $snapshot_name $image $server_backup_dir/$(basename $image) >/dev/null
fi
if [ $? -ne 0 ]; then
echo "Snapshot extraction failed for image '$image'"
result=1
fi
done
echo "Deleting snapshots for '$domain_name'"
if [ $result -eq 0 ]; then
$VIRSH snapshot-delete $domain_name $snapshot_name
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment