From 5c9a8cc61984b005f1deb30ccacf093919e5f612 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Oct 2025 10:39:13 +0200 Subject: [PATCH] Initial commit: Add interactive Borg vault and QCOW2 mounting scripts --- mount_backup.sh | 138 +++++++++++++++++++++++++++++++++++++++++++++++ umount_backup.sh | 44 +++++++++++++++ 2 files changed, 182 insertions(+) create mode 100755 mount_backup.sh create mode 100755 umount_backup.sh diff --git a/mount_backup.sh b/mount_backup.sh new file mode 100755 index 0000000..acd9fd0 --- /dev/null +++ b/mount_backup.sh @@ -0,0 +1,138 @@ +#!/bin/bash + +# Script to mount Borg backup vault and qcow2 disk image +# Created: 2025-10-07 + +set -e # Exit on error + +BORG_REPO="/data_storage/Backup/borg/srvfs01" +BORG_MOUNT="/mnt/restore" +QCOW2_MOUNT="/mnt/qcow2" +QCOW2_FILE="vm-105-disk-3.qcow2" + +# Function to format date from backup folder name +format_date() { + local folder=$1 + # Extract date from folder name (e.g., vm105-20250904-145444 or vm105-20251006-020001) + if [[ $folder =~ vm[0-9]+-([0-9]{4})([0-9]{2})([0-9]{2})-([0-9]{6}) ]]; then + local year=${BASH_REMATCH[1]} + local month=${BASH_REMATCH[2]} + local day=${BASH_REMATCH[3]} + local time=${BASH_REMATCH[4]} + local hour=${time:0:2} + local minute=${time:2:2} + + # Convert month number to German month name + case $month in + 01) month_name="Januar" ;; + 02) month_name="Februar" ;; + 03) month_name="März" ;; + 04) month_name="April" ;; + 05) month_name="Mai" ;; + 06) month_name="Juni" ;; + 07) month_name="Juli" ;; + 08) month_name="August" ;; + 09) month_name="September" ;; + 10) month_name="Oktober" ;; + 11) month_name="November" ;; + 12) month_name="Dezember" ;; + esac + + echo "$day. $month_name $year - $hour:$minute Uhr" + else + echo "$folder" + fi +} + +echo "=== Mounting Borg Backup Vault ===" +# Mount the Borg vault +borg mount "$BORG_REPO" "$BORG_MOUNT" +echo "✓ Borg vault mounted to $BORG_MOUNT" +echo "" + +# Scan for backup folders +echo "=== Scanning for available backups ===" +mapfile -t backups < <(ls -1 "$BORG_MOUNT" | sort -r) + +if [ ${#backups[@]} -eq 0 ]; then + echo "Error: No backups found in $BORG_MOUNT" + borg umount "$BORG_MOUNT" + exit 1 +fi + +echo "Available backups:" +echo "" +for i in "${!backups[@]}"; do + backup_date=$(format_date "${backups[$i]}") + printf "%2d) %s\n" $((i+1)) "$backup_date" +done + +echo "" +read -p "Select backup number (1-${#backups[@]}) or [Enter] for latest: " selection + +# Default to latest (first in sorted list) +if [ -z "$selection" ]; then + selection=1 +fi + +# Validate selection +if ! [[ "$selection" =~ ^[0-9]+$ ]] || [ "$selection" -lt 1 ] || [ "$selection" -gt ${#backups[@]} ]; then + echo "Error: Invalid selection" + borg umount "$BORG_MOUNT" + exit 1 +fi + +selected_backup="${backups[$((selection-1))]}" +selected_date=$(format_date "$selected_backup") + +echo "" +echo "✓ Selected backup: $selected_date" +echo "" + +# Find the qcow2 file in the selected backup +echo "=== Searching for QCOW2 file ===" +qcow2_path=$(find "$BORG_MOUNT/$selected_backup" -name "$QCOW2_FILE" 2>/dev/null | head -n 1) + +if [ -z "$qcow2_path" ]; then + echo "Error: Could not find $QCOW2_FILE in backup" + borg umount "$BORG_MOUNT" + exit 1 +fi + +echo "✓ Found: $qcow2_path" +echo "" + +echo "=== Mounting QCOW2 Disk Image ===" +# Load NBD kernel module +modprobe nbd max_part=8 +echo "✓ NBD module loaded" + +# Connect qcow2 image to NBD device in read-only mode +qemu-nbd --connect=/dev/nbd0 --read-only "$qcow2_path" +echo "✓ QCOW2 connected to /dev/nbd0" + +# Wait a moment for device to be ready +sleep 2 + +# Scan for LVM volumes +pvscan > /dev/null 2>&1 +vgscan > /dev/null 2>&1 +echo "✓ LVM volumes scanned" + +# Create mount point if it doesn't exist +mkdir -p "$QCOW2_MOUNT" + +# Mount the logical volume in read-only mode without journal recovery +mount -t ext4 -o ro,noload /dev/vgdata/lvshare "$QCOW2_MOUNT" +echo "✓ Filesystem mounted to $QCOW2_MOUNT" + +echo "" +echo "=== Mount Summary ===" +echo "Borg vault: $BORG_MOUNT" +echo "Selected: $selected_date" +echo "QCOW2 disk: $QCOW2_MOUNT" +echo "" +df -h "$BORG_MOUNT" "$QCOW2_MOUNT" + +echo "" +echo "Done! To unmount, run: /data_storage/Backup/borg/umount_backup.sh" diff --git a/umount_backup.sh b/umount_backup.sh new file mode 100755 index 0000000..ad07bec --- /dev/null +++ b/umount_backup.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Script to unmount QCOW2 disk image and Borg backup vault +# Created: 2025-10-07 + +BORG_MOUNT="/mnt/restore" +QCOW2_MOUNT="/mnt/qcow2" + +echo "=== Unmounting Backup System ===" + +# Unmount QCOW2 filesystem +if mountpoint -q "$QCOW2_MOUNT"; then + echo "Unmounting $QCOW2_MOUNT..." + umount "$QCOW2_MOUNT" + echo "✓ QCOW2 filesystem unmounted" +else + echo "ℹ $QCOW2_MOUNT is not mounted" +fi + +# Deactivate LVM volume group +if vgs vgdata &>/dev/null; then + echo "Deactivating LVM volume group..." + vgchange -an vgdata 2>/dev/null || true + echo "✓ LVM volume group deactivated" +fi + +# Disconnect NBD device +if [ -b /dev/nbd0 ]; then + echo "Disconnecting NBD device..." + qemu-nbd --disconnect /dev/nbd0 + echo "✓ NBD device disconnected" +fi + +# Unmount Borg vault +if mountpoint -q "$BORG_MOUNT"; then + echo "Unmounting Borg vault..." + borg umount "$BORG_MOUNT" + echo "✓ Borg vault unmounted" +else + echo "ℹ Borg vault is not mounted" +fi + +echo "" +echo "Done! All backups unmounted."