Skip to content
Snippets Groups Projects
Verified Commit 8fa36ec0 authored by nd's avatar nd
Browse files

add support for qcow2 vm images

parent 6c214a23
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,11 @@ set -euo pipefail
SNAPSHOT="/dev/$VG/backup-$DEVICE"
lvremove -f "$SNAPSHOT" > /dev/null 2>&1 || true
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 {
......@@ -35,6 +40,16 @@ set -euo pipefail
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 {
# get a list of disks
DISKS=`virsh domblklist "$DOMAIN" --details \
......@@ -42,7 +57,13 @@ set -euo pipefail
| grep ^block \
| grep -v swap \
| 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
......@@ -58,6 +79,12 @@ set -euo pipefail
lvcreate -L16G -s -n "backup-$DEVICE" "$DISK" > /dev/null
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
virsh dumpxml "$DOMAIN" > "$DOMAIN_MOUNTBASE/config.xml"
......@@ -76,6 +103,21 @@ set -euo pipefail
) 2> /dev/null
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' %}
# restic backend
source /etc/backup-client/restic.env
......@@ -83,6 +125,7 @@ set -euo pipefail
--verbose \
--host "$DOMAIN" \
--exclude-file "/etc/backup-client/vms/$DOMAIN/exclude_files" \
--exclude="$DOMAIN_MOUNTBASE/IMAGECONTAINER_*" \
"$DOMAIN_MOUNTBASE"
{% endif %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment