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"
|
2021-01-06 10:07:05 +00:00
|
|
|
echo -e "\t-l Limit Bandwith"
|
2021-01-06 06:57:50 +00:00
|
|
|
exit 1 # Exit script after printing help
|
|
|
|
}
|
|
|
|
|
2021-01-06 10:07:05 +00:00
|
|
|
while getopts "v:t:s:d:l:" opt
|
2021-01-06 06:57:50 +00:00
|
|
|
do
|
|
|
|
case "$opt" in
|
|
|
|
v ) VM="$OPTARG" ;;
|
|
|
|
t ) DESTHOST="$OPTARG" ;;
|
|
|
|
s ) SRCZFS="$OPTARG" ;;
|
|
|
|
d ) DESTZFS="$OPTARG" ;;
|
2021-01-06 10:07:05 +00:00
|
|
|
l ) LIMIT="$OPTARG" ;;
|
2021-01-06 06:57:50 +00:00
|
|
|
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Print helpFunction in case parameters are empty
|
2021-01-06 10:07:05 +00:00
|
|
|
if [ -z "$VM" ] || [ -z "$DESTHOST" ] || [ -z "$DESTZFS" ] || [ -z "$SRCZFS" ] || [ -z "$LIMIT" ]
|
2021-01-06 06:57:50 +00:00
|
|
|
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
|
|
|
|
|
2021-01-06 09:50:06 +00:00
|
|
|
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
|
2021-01-06 09:50:06 +00:00
|
|
|
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"
|
2021-01-06 10:12:19 +00:00
|
|
|
echo "Sending incremental snapshot from $LASTSNAP"
|
2021-01-06 10:19:01 +00:00
|
|
|
zfs send -R -i "$SRCZFS"@"$LASTSNAP" "$SRCZFS"@"$SNAPNAME" | pv -L $LIMIT | ssh $DESTHOST sudo zfs recv -F $DESTZFS
|
2021-01-06 09:29:58 +00:00
|
|
|
else
|
2021-01-06 10:12:19 +00:00
|
|
|
echo "Sending full snapshot"
|
2021-01-06 10:19:01 +00:00
|
|
|
zfs send -R "$SRCZFS"@"$SNAPNAME" | pv -L $LIMIT | ssh $DESTHOST sudo zfs recv -F $DESTZFS
|
2021-01-06 09:29:58 +00:00
|
|
|
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
|