Initial commit: Add interactive Borg vault and QCOW2 mounting scripts

This commit is contained in:
root
2025-10-07 10:39:13 +02:00
commit 5c9a8cc619
2 changed files with 182 additions and 0 deletions

138
mount_backup.sh Executable file
View File

@@ -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"