add support for qcow2 vm images

This commit is contained in:
nd 2021-03-27 00:12:19 +01:00
parent 6c214a2330
commit 8fa36ec049
No known key found for this signature in database
GPG key ID: 21B5CD4DEE3670E9

View file

@ -20,6 +20,11 @@ set -euo pipefail
SNAPSHOT="/dev/$VG/backup-$DEVICE" SNAPSHOT="/dev/$VG/backup-$DEVICE"
lvremove -f "$SNAPSHOT" > /dev/null 2>&1 || true lvremove -f "$SNAPSHOT" > /dev/null 2>&1 || true
done done
for i in $DISKS_QCOW2; do
extract_lvm_qcow2
SNAPSHOT="/dev/$VG/backup-$DEVICE"
lvremove -f "$SNAPSHOT" > /dev/null 2>&1 || true
done
} }
function cleanup_vmmount { function cleanup_vmmount {
@ -35,6 +40,16 @@ set -euo pipefail
LV=`lvs --noheadings -o lv_name "$DISK" | tr -d ' '` LV=`lvs --noheadings -o lv_name "$DISK" | tr -d ' '`
} }
function extract_lvm_qcow2 {
DISK=`echo $i | awk -F, '{print $1}'`
DEVICE=`echo $i | awk -F, '{print $2}'`
DEVICEPATH=`df "$DISK" | awk '{print $1}' | tail -n1`
MOUNTPOINT=`df "$DISK" | awk '{print $6}' | tail -n1`
RELIMAGEPATH="${DISK#$MOUNTPOINT}"
VG=`lvs --noheadings -o vg_name "$DEVICEPATH" | tr -d ' '`
LV=`lvs --noheadings -o lv_name "$DEVICEPATH" | tr -d ' '`
}
function backup_vm { function backup_vm {
# get a list of disks # get a list of disks
DISKS=`virsh domblklist "$DOMAIN" --details \ DISKS=`virsh domblklist "$DOMAIN" --details \
@ -42,7 +57,13 @@ set -euo pipefail
| grep ^block \ | grep ^block \
| grep -v swap \ | grep -v swap \
| awk '{printf "%s,%s ",$4, $3}'` | awk '{printf "%s,%s ",$4, $3}'`
echo "backing up $DOMAIN: $DISKS" DISKS_QCOW2=`virsh domblklist "$DOMAIN" --details \
| sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' \
| grep ^file \
| grep -v swap \
| grep '.qcow2' \
| awk '{printf "%s,%s ",$4, $3}'`
echo "backing up $DOMAIN: $DISKS $DISKS_QCOW2"
trap "unfreeze_vm || true; delete_snapshots" INT TERM EXIT trap "unfreeze_vm || true; delete_snapshots" INT TERM EXIT
@ -58,6 +79,12 @@ set -euo pipefail
lvcreate -L16G -s -n "backup-$DEVICE" "$DISK" > /dev/null lvcreate -L16G -s -n "backup-$DEVICE" "$DISK" > /dev/null
done done
# create snapshots of all volumes containing qcow2 images
for i in $DISKS_QCOW2; do
extract_lvm_qcow2
lvcreate -L16G -s -n "backup-$DEVICE" "$DEVICEPATH" > /dev/null
done
# dump vm config # dump vm config
virsh dumpxml "$DOMAIN" > "$DOMAIN_MOUNTBASE/config.xml" virsh dumpxml "$DOMAIN" > "$DOMAIN_MOUNTBASE/config.xml"
@ -76,6 +103,21 @@ set -euo pipefail
) 2> /dev/null ) 2> /dev/null
done done
# mount qcow2 disk images backing storage
for i in $DISKS_QCOW2; do
extract_lvm_qcow2
SNAPSHOT="/dev/$VG/backup-$DEVICE"
fsck -y "$SNAPSHOT" > /dev/null 2> /dev/null
(
mkdir "$DOMAIN_MOUNTBASE/IMAGECONTAINER_$DEVICE"
# to be able to run fsck inside the vm we have to mount the containers r/w
mount -o rw "$SNAPSHOT" "$DOMAIN_MOUNTBASE/IMAGECONTAINER_$DEVICE"
mkdir "$DOMAIN_MOUNTBASE/$DEVICE"
guestmount -m /dev/sda -a "$DOMAIN_MOUNTBASE/IMAGECONTAINER_$DEVICE/$RELIMAGEPATH" "$DOMAIN_MOUNTBASE/$DEVICE"
) 2> /dev/null
done
{% if backup_backend == 'restic' %} {% if backup_backend == 'restic' %}
# restic backend # restic backend
source /etc/backup-client/restic.env source /etc/backup-client/restic.env
@ -83,6 +125,7 @@ set -euo pipefail
--verbose \ --verbose \
--host "$DOMAIN" \ --host "$DOMAIN" \
--exclude-file "/etc/backup-client/vms/$DOMAIN/exclude_files" \ --exclude-file "/etc/backup-client/vms/$DOMAIN/exclude_files" \
--exclude="$DOMAIN_MOUNTBASE/IMAGECONTAINER_*" \
"$DOMAIN_MOUNTBASE" "$DOMAIN_MOUNTBASE"
{% endif %} {% endif %}