From 164a0032e8201039423b7cde931354ca8b22b19b Mon Sep 17 00:00:00 2001 From: doc Date: Fri, 11 Jul 2025 17:35:49 +0000 Subject: initial commit --- coldfreeze.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 coldfreeze.sh (limited to 'coldfreeze.sh') diff --git a/coldfreeze.sh b/coldfreeze.sh new file mode 100755 index 0000000..151552a --- /dev/null +++ b/coldfreeze.sh @@ -0,0 +1,62 @@ +#!/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" <