libvirt-zsh-backup/libvirt-zsh-backup.sh

102 lines
2.5 KiB
Bash
Raw Normal View History

2021-01-06 06:57:50 +00:00
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -v VmName -t TargetHost -d TargetDataset"
echo -e "\t-v Name of the vm to backup"
echo -e "\t-t Backup target host name"
echo -e "\t-s VM source zfs dataset"
echo -e "\t-d Backup target zfs dataset"
exit 1 # Exit script after printing help
}
while getopts "v:t:s:d:" opt
do
case "$opt" in
v ) VM="$OPTARG" ;;
t ) DESTHOST="$OPTARG" ;;
s ) SRCZFS="$OPTARG" ;;
d ) DESTZFS="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$VM" ] || [ -z "$DESTHOST" ] || [ -z "$DESTZFS" ] || [ -z "$SRCZFS" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
2021-01-06 09:18:14 +00:00
DATE=$(date "+%Y%m%d%H%M")
2021-01-06 06:57:50 +00:00
DATE30=$(date -d "-30day" "+%Y%m%d")
2021-01-06 08:24:19 +00:00
SNAPNAME="backup_$DATE"
2021-01-06 06:57:50 +00:00
2021-01-06 08:24:19 +00:00
VMDISKS=$(virsh domblklist $VM | egrep -o vd.)
DISKSPEC=""
for disk in $VMDISKS
do
2021-01-06 08:54:25 +00:00
DISKSPEC+="--diskspec $disk,file=/srv/snapshots/$VM/$VM-$disk-$SNAPNAME.qcow2,snapshot=external "
2021-01-06 08:24:19 +00:00
done
2021-01-06 08:46:28 +00:00
2021-01-06 09:18:14 +00:00
# create snapshot dataset
zfs create tank/snapshots/$VM
virsh snapshot-create-as --domain $VM --name $SNAPNAME --quiesce --atomic --disk-only $DISKSPEC >/dev/null 2>&1
2021-01-06 08:46:28 +00:00
if [ $? -ne 0 ]
then
virsh snapshot-create-as --domain $VM --name $SNAPNAME --disk-only $DISKSPEC >/dev/null 2>&1
if [ $? -ne 0 ]
then
echo "VM snapshot creation failed" >&2
exit 1
else
echo "Snapshot created without --quiesce"
fi
2021-01-06 08:46:28 +00:00
fi
zfs snapshot "$SRCZFS"@"$SNAPNAME"
if [ $? -ne 0 ]
then
echo "ZFS snapshot creation failed" >&2
exit 1
fi
for disk in $VMDISKS
do
virsh blockcommit $VM $disk --pivot --active >/dev/null
done
VMDISKS=$(virsh domblklist $VM | egrep vd.)
for disk in $VMDISKS
do
if [[ $disk == *"snapshot"* ]]
then
echo "Snapshot deletion failed for $disk" >&2
fi
done
2021-01-06 09:18:14 +00:00
virsh snapshot-delete $VM $SNAPNAME --metadata
2021-01-06 09:29:58 +00:00
SUCCESS=$(zfs get backup:success -H -o value $SRCZFS)
if [[ $SUCCESS == "true" ]]
then
LASTBACKUP=$(zfs get backup:date -H -o value $SRCZFS)
LASTSNAP="backup_$LASTBACKUP"
zfs send -i "$SRCZFS"@"$LASTSNAP" "$SRCZFS"@"$SNAPNAME" | pv -L 500M | ssh $DESTHOST sudo zfs recv -F $DESTZFS
else
zfs send "$SRCZFS"@"$SNAPNAME" | pv -L 500M | ssh $DESTHOST sudo zfs recv -F $DESTZFS
fi
2021-01-06 09:18:14 +00:00
if [ $? -eq 0 ]
then
zfs set backup:success="true" $SRCZFS
zfs set backup:date="$DATE" $SRCZFS
else
zfs set backup:success="false" $SRCZFS
zfs set backup:failed="$DATE" $SRCZFS
fi
2021-01-06 06:57:50 +00:00
2021-01-06 09:18:14 +00:00
zfs destroy tank/snapshots/$VM