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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment