diff options
author | doc <doc@filenotfound.org> | 2025-07-11 17:35:49 +0000 |
---|---|---|
committer | doc <doc@filenotfound.org> | 2025-07-11 17:35:49 +0000 |
commit | 164a0032e8201039423b7cde931354ca8b22b19b (patch) | |
tree | 0a946671e627dcfafa321b6b0b73ee7b9732b850 |
-rwxr-xr-x | coldfreeze.sh | 62 |
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" |