#!/bin/bash set +x trap clean_exit EXIT function clean_exit() { [[ -f /tmp/backup-running ]] && rm -f /tmp/backup-running } # Path, where backups should be stored DST=/srv/backup/kvm # Path, where temporary snapshots should be created SNAP=/var/backups/snapshots test -d ${DST} || mkdir -p ${DST} test -d $SNAP || mkdir -p $SNAP date=$(date +"%Y%m%d") if [[ -f /tmp/backup-running ]]; then exit 1 fi touch /tmp/backup-running #mount /dev/sda1 ${DST} >/dev/null 2>&1 #if [[ "$?" -ne 0 ]]; then # echo "Unable to mount backup drive!" # exit 1 #fi rm -f ${DST}/LATEST_* for VM in $(virsh list --name); do echo "Backup KVM guest ${VM}" if [[ -f ${DST}/${VM}.img ]]; then echo "Remove old backup guest image..." rm -f ${DST}/${VM}.img fi if [[ -f ${DST}/${VM}.xml ]]; then echo "Remove old backup guest XML definition..." rm -f ${DST}/${VM}.xml fi echo "Create Snapshot..." virsh snapshot-create-as ${VM} "backup-${VM}" \ --diskspec vda,file=${SNAP}/backup-snapshot-${VM}.qcow2 \ --disk-only \ --atomic \ --quiesce \ --no-metadata echo "Copy guest image to backup drive..." cp --sparse=always /var/lib/libvirt/images/${VM}.img ${DST}/ echo "Copy XML to backup drive..." cp /etc/libvirt/qemu/${VM}.xml ${DST}/ echo "Merge snapshot with guest image..." virsh blockcommit ${VM} vda --wait --active --verbose --pivot # Make sure, snapshot merging was successfull current_disk=$(virsh domblklist ${VM} --details | grep vda | awk '{ print $4; }' | cut -d "/" -f -5) if [[ "$current_disk" == "/var/lib/libvirt/images" ]]; then echo "Remove snapshot..." rm -f ${SNAP}/backup-snapshot-${VM}.qcow2 fi touch ${DST}/LATEST_$date done #echo "Syncing disk..." #sync #umount /mnt rm -f /tmp/backup-running exit 0