#!/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"