#!/bin/bash set -euo pipefail echo "=== Coldfreeze: Turn a full Linux install into a VM image backup ===" read -rp "Enter source disk to freeze (e.g., /dev/sdb): " SOURCE_DISK read -rp "Enter destination directory (e.g., /mnt/zfs/legacy-vms): " DEST_DIR # Confirm disk exists if [ ! -b "$SOURCE_DISK" ]; then echo "ERROR: $SOURCE_DISK is not a valid block device." exit 1 fi # Check mountpoints MOUNTED=$(lsblk -no MOUNTPOINT "$SOURCE_DISK" | grep -v '^$' || true) if [ -n "$MOUNTED" ]; then echo "ERROR: $SOURCE_DISK has mounted partitions:" echo "$MOUNTED" echo "Please unmount them before continuing." exit 1 fi # Confirm before starting echo "About to clone $SOURCE_DISK to $DEST_DIR" read -rp "Continue? (yes/no): " CONFIRM [[ "$CONFIRM" != "yes" ]] && echo "Aborted." && exit 0 TIMESTAMP=$(date +%Y%m%d-%H%M%S) OUTFILE="coldfreeze-$(basename "$SOURCE_DISK")-$TIMESTAMP.img" OUTPATH="$DEST_DIR/$OUTFILE" # Run dd echo "[+] Starting dd... This may take a while." sudo dd if="$SOURCE_DISK" of="$OUTPATH" bs=1M status=progress conv=fsync # Compress with zstd echo "[+] Compressing with zstd..." zstd -T0 "$OUTPATH" && rm "$OUTPATH" COMPRESSED_FILE="$OUTPATH.zst" # Write metadata echo "[+] Writing metadata..." cat > "$DEST_DIR/$OUTFILE.txt" <