Created
September 23, 2013 09:43
-
-
Save dguerri/6668397 to your computer and use it in GitHub Desktop.
Simple LibVirt//KVM backup with memory dump.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# VirSH Simple Backup ([email protected]) | |
# | |
# 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