Initial commit: Add interactive Borg vault and QCOW2 mounting scripts
This commit is contained in:
138
mount_backup.sh
Executable file
138
mount_backup.sh
Executable 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"
|
||||
Reference in New Issue
Block a user