summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordoc <doc@filenotfound.org>2025-07-11 17:35:49 +0000
committerdoc <doc@filenotfound.org>2025-07-11 17:35:49 +0000
commit164a0032e8201039423b7cde931354ca8b22b19b (patch)
tree0a946671e627dcfafa321b6b0b73ee7b9732b850
initial commitHEADmaster
-rwxr-xr-xcoldfreeze.sh62
1 files changed, 62 insertions, 0 deletions
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" <<EOF
+Coldfreeze Backup
+
+Source Disk: $SOURCE_DISK
+Saved As: $COMPRESSED_FILE
+Created: $TIMESTAMP
+Run from Host: $(hostname)
+Disk Size: $(lsblk -dn -o SIZE "$SOURCE_DISK")
+Note: Created with coldfreeze.sh – raw dd clone of full disk for virtualization or file recovery.
+
+To restore or mount:
+1. zstd -d $OUTFILE.zst
+2. Use qemu-img convert to make a Proxmox disk
+3. Or loop-mount with losetup + kpartx
+
+EOF
+
+echo "[✓] Disk frozen, compressed, and metadata written to:"
+echo " $COMPRESSED_FILE"