97 lines
2.4 KiB
Bash
97 lines
2.4 KiB
Bash
|
#!/bin/bash
|
||
|
# Copyright (c) 2022 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
|
||
|
|
||
|
# This is for backing up Rados Block Device (Ceph) storage.
|
||
|
|
||
|
# The pool in Ceph that you would like to backup.
|
||
|
POOL="libvirt"
|
||
|
# Pull images in pull from rbd driver.
|
||
|
IMAGES=$(rbd -p $POOL ls)
|
||
|
# The borg repository we're backing up to.
|
||
|
export BORG_REPO='/media/Storage/Backup/kvm'
|
||
|
# If you have a passphrase for your repository,
|
||
|
# set it here or you can use bash to retrieve it.
|
||
|
# export BORG_PASSPHRASE=''
|
||
|
|
||
|
for IMAGE in $IMAGES; do
|
||
|
# Export volume to borg backup.
|
||
|
echo "Creating backup for $IMAGE"
|
||
|
rbd export $POOL/$IMAGE - | pv | borg create \
|
||
|
--verbose \
|
||
|
--stats \
|
||
|
--show-rc \
|
||
|
"::$IMAGE-{now}" -
|
||
|
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo "Failed to backup $IMAGE"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# If you want to prune backups, you can set the prune options.
|
||
|
echo "Pruning backups for $IMAGE"
|
||
|
borg prune --list \
|
||
|
--show-rc \
|
||
|
--glob-archives "$IMAGE-*" \
|
||
|
--keep-daily 7 \
|
||
|
--keep-weekly 4 \
|
||
|
--keep-monthly 6
|
||
|
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo "Failed prune $IMAGE"
|
||
|
exit 1
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# I save the status in a temporary file so I can error out and exit if a failure occurs.
|
||
|
DOMLIST_STATUS_TMP="/tmp/backup-rbd-domlist-tmp"
|
||
|
while read -r line; do
|
||
|
# Extract the domain name from the line.
|
||
|
DOMAIN=$(echo $line | awk '{print $2}')
|
||
|
|
||
|
# Backup the domain info.
|
||
|
echo "Backing up $DOMAIN xml"
|
||
|
virsh dumpxml "$DOMAIN" | borg create \
|
||
|
--verbose \
|
||
|
--stats \
|
||
|
--show-rc \
|
||
|
"::$DOMAIN-xml-{now}" -
|
||
|
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo "Failed to backup $DOMAIN"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Prune if options are configured.
|
||
|
if [ -n "$PRUNE_OPTIONS" ]; then
|
||
|
echo "Pruning backups for $IMAGE"
|
||
|
borg prune --list \
|
||
|
--show-rc \
|
||
|
--glob-archives "$DOMAIN-xml-*" \
|
||
|
$PRUNE_OPTIONS
|
||
|
|
||
|
if [ $? -ne 0 ]; then
|
||
|
echo "Failed to prune $DOMAIN"
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
done < <(
|
||
|
virsh list --all | tail -n +3
|
||
|
echo $? >$DOMLIST_STATUS_TMP
|
||
|
)
|
||
|
|
||
|
# Get status from the domain listing.
|
||
|
status=1
|
||
|
if [ -f $DOMLIST_STATUS_TMP ]; then
|
||
|
status=$(cat $DOMLIST_STATUS_TMP)
|
||
|
rm $DOMLIST_STATUS_TMP
|
||
|
fi
|
||
|
|
||
|
# If status has an error, exit.
|
||
|
if [ $status -ne 0 ]; then
|
||
|
echo "Domain listing failed"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Shrink repo.
|
||
|
borg compact
|