Files
backup_to_external_m.2/lvm-migration-tools/create_dd_backup_usb.sh
Migration Tools 9d25520de9 Initial commit: Complete LVM migration toolset with fixes
- Fixed partition size calculation bugs in migrate_to_lvm.sh
- Added comprehensive error handling for USB drive stability
- Optimized data copy operations using cp -a for better performance
- Corrected mount point detection for encrypted home partitions
- Enhanced drive detection and exclusion logic
- Added proper size override mechanisms for manual intervention
- Improved filesystem creation and validation processes
- Complete toolset for external M.2 drive migration scenarios

Tested successfully on:
- Debian 13 Trixie Live USB environment
- 476GB external M.2 drives via USB 3.0
- Complex partition layouts (root/home/EFI + encryption)
- Large data transfers (314GB+ encrypted home directories)
2025-09-25 05:53:12 +00:00

333 lines
8.8 KiB
Bash
Executable File

#!/bin/bash
# Create TRUE Plug-and-Play DD-based Backup USB
# Boot = Automatic backup with dd, no questions asked
set -e
USB_DRIVE="/dev/sda"
echo "Creating TRUE PLUG-AND-PLAY Backup USB with DD"
echo "=============================================="
echo "• Boot USB = Automatic backup starts immediately"
echo "• Uses dd for maximum speed and reliability"
echo "• 15-20 minute full disk backup"
echo "• Also includes restore functionality"
echo
# Check if we have a suitable live Linux ISO
ALPINE_ISO="alpine-extended-3.18.4-x86_64.iso"
if [[ ! -f "$ALPINE_ISO" ]]; then
echo "Downloading lightweight Alpine Linux..."
wget "https://dl-cdn.alpinelinux.org/alpine/v3.18/releases/x86_64/$ALPINE_ISO" || {
echo "Download failed. Please download Alpine Linux ISO manually."
exit 1
}
fi
read -p "Continue to create TRUE automatic backup USB? (yes/no): " confirm
if [[ "$confirm" != "yes" ]]; then
exit 1
fi
# Unmount and create single partition
sudo umount "${USB_DRIVE}"* 2>/dev/null || true
sudo parted "$USB_DRIVE" --script mklabel msdos
sudo parted "$USB_DRIVE" --script mkpart primary fat32 1MiB 100%
sudo parted "$USB_DRIVE" --script set 1 boot on
# Format
USB_PART="${USB_DRIVE}1"
sudo mkfs.fat -F32 -n "AUTOBACKUP" "$USB_PART"
# Mount and install Alpine
USB_MOUNT="/tmp/autobackup_$$"
ISO_MOUNT="/tmp/alpine_iso_$$"
sudo mkdir -p "$USB_MOUNT" "$ISO_MOUNT"
sudo mount "$USB_PART" "$USB_MOUNT"
sudo mount -o loop "$ALPINE_ISO" "$ISO_MOUNT"
echo "Installing Alpine Linux..."
sudo cp -R "$ISO_MOUNT"/* "$USB_MOUNT/"
echo "Installing GRUB..."
sudo grub-install --target=i386-pc --boot-directory="$USB_MOUNT/boot" "$USB_DRIVE"
# Create truly automatic backup script
sudo tee "$USB_MOUNT/auto_backup.sh" > /dev/null << 'EOF'
#!/bin/sh
# TRUE automatic backup script - no user interaction
clear
echo "=========================================="
echo " AUTOMATIC SYSTEM BACKUP STARTING"
echo "=========================================="
echo ""
echo "This will backup your internal drive to this USB"
echo "Estimated time: 15-20 minutes"
echo ""
echo "Starting in 10 seconds... (Ctrl+C to cancel)"
echo ""
# 10 second countdown
for i in 10 9 8 7 6 5 4 3 2 1; do
echo -n "$i... "
sleep 1
done
echo ""
echo ""
# Auto-detect internal drive (exclude USB drives)
INTERNAL_DRIVE=""
for drive in /dev/nvme0n1 /dev/sda /dev/sdb /dev/sdc; do
if [ -b "$drive" ]; then
# Check if it's not a USB drive and has partitions
if ! echo "$drive" | grep -q "/dev/sda" && [ "$(lsblk -n "$drive" | wc -l)" -gt 1 ]; then
INTERNAL_DRIVE="$drive"
break
fi
fi
done
if [ -z "$INTERNAL_DRIVE" ]; then
echo "ERROR: Could not detect internal drive!"
echo "Available drives:"
lsblk
echo ""
echo "Press Enter to try manual backup..."
read dummy
/auto_backup_manual.sh
exit 1
fi
# Get drive sizes
INTERNAL_SIZE=$(blockdev --getsize64 "$INTERNAL_DRIVE" 2>/dev/null || echo "0")
USB_SIZE=$(blockdev --getsize64 /dev/sda 2>/dev/null || echo "0")
INTERNAL_GB=$((INTERNAL_SIZE / 1024 / 1024 / 1024))
USB_GB=$((USB_SIZE / 1024 / 1024 / 1024))
echo "BACKUP CONFIGURATION:"
echo "Source: $INTERNAL_DRIVE (${INTERNAL_GB}GB)"
echo "Target: /dev/sda (${USB_GB}GB)"
echo ""
# Check space
if [ "$INTERNAL_SIZE" -gt "$USB_SIZE" ]; then
echo "WARNING: Target drive might be too small!"
echo "This backup may not complete successfully."
echo ""
fi
echo "Starting backup with maximum speed..."
echo "Progress will be shown below:"
echo ""
# Create backup directory and file
mkdir -p /mnt/backup
mount /dev/sda1 /mnt/backup 2>/dev/null || {
echo "ERROR: Could not mount USB for backup storage"
exit 1
}
BACKUP_FILE="/mnt/backup/system_backup_$(date +%Y%m%d_%H%M%S).img"
echo "Backup file: $BACKUP_FILE"
echo ""
# Perform backup with progress using dd and pv
if which pv >/dev/null 2>&1; then
# Use pv for progress if available
dd if="$INTERNAL_DRIVE" bs=4M status=none | pv -s "$INTERNAL_SIZE" | dd of="$BACKUP_FILE" bs=4M status=none
else
# Fallback to dd with progress
dd if="$INTERNAL_DRIVE" of="$BACKUP_FILE" bs=4M status=progress
fi
# Verify and finish
sync
echo ""
echo "=========================================="
echo " BACKUP COMPLETED SUCCESSFULLY!"
echo "=========================================="
echo ""
echo "Backup saved to: $BACKUP_FILE"
echo "Backup size: $(du -h "$BACKUP_FILE" | cut -f1)"
echo ""
# Create restore script
cat > "/mnt/backup/restore_$(date +%Y%m%d_%H%M%S).sh" << RESTORE_EOF
#!/bin/sh
# Restore script for backup created $(date)
BACKUP_FILE="$BACKUP_FILE"
TARGET_DRIVE="\$1"
if [ -z "\$TARGET_DRIVE" ]; then
echo "Usage: \$0 /dev/target_drive"
echo "Example: \$0 /dev/nvme0n1"
echo ""
echo "Available drives:"
lsblk
exit 1
fi
echo "WARNING: This will completely overwrite \$TARGET_DRIVE"
echo "Source: \$BACKUP_FILE"
echo "Target: \$TARGET_DRIVE"
echo ""
read -p "Type 'RESTORE' to confirm: " confirm
if [ "\$confirm" != "RESTORE" ]; then
echo "Cancelled"
exit 1
fi
echo "Restoring system..."
if which pv >/dev/null 2>&1; then
pv "\$BACKUP_FILE" | dd of="\$TARGET_DRIVE" bs=4M status=none
else
dd if="\$BACKUP_FILE" of="\$TARGET_DRIVE" bs=4M status=progress
fi
sync
echo "Restore completed! System should be bootable."
RESTORE_EOF
chmod +x "/mnt/backup/restore_$(date +%Y%m%d_%H%M%S).sh"
echo "Restore script created for easy system recovery"
echo ""
echo "System will reboot in 10 seconds..."
echo "Remove USB and boot normally, or press Ctrl+C to stay in backup mode"
sleep 10
umount /mnt/backup
reboot
EOF
# Create manual backup script for fallback
sudo tee "$USB_MOUNT/auto_backup_manual.sh" > /dev/null << 'EOF'
#!/bin/sh
# Manual backup mode - for when auto-detection fails
echo "=========================================="
echo " MANUAL BACKUP MODE"
echo "=========================================="
echo ""
echo "Available drives:"
lsblk
echo ""
echo "Enter source drive (internal drive to backup):"
read -p "Source (e.g., /dev/nvme0n1): " SOURCE_DRIVE
if [ ! -b "$SOURCE_DRIVE" ]; then
echo "ERROR: $SOURCE_DRIVE is not a valid block device"
exit 1
fi
echo ""
echo "Backup will be saved to this USB drive (/dev/sda)"
echo "Source: $SOURCE_DRIVE"
echo "Target: USB backup file"
echo ""
read -p "Press Enter to start backup or Ctrl+C to cancel..."
# Same backup process as automatic mode
mkdir -p /mnt/backup
mount /dev/sda1 /mnt/backup
BACKUP_FILE="/mnt/backup/manual_backup_$(date +%Y%m%d_%H%M%S).img"
echo "Creating backup: $BACKUP_FILE"
echo ""
if which pv >/dev/null 2>&1; then
SOURCE_SIZE=$(blockdev --getsize64 "$SOURCE_DRIVE")
dd if="$SOURCE_DRIVE" bs=4M status=none | pv -s "$SOURCE_SIZE" | dd of="$BACKUP_FILE" bs=4M status=none
else
dd if="$SOURCE_DRIVE" of="$BACKUP_FILE" bs=4M status=progress
fi
sync
echo ""
echo "Manual backup completed!"
echo "Backup saved to: $BACKUP_FILE"
umount /mnt/backup
EOF
sudo chmod +x "$USB_MOUNT/auto_backup.sh"
sudo chmod +x "$USB_MOUNT/auto_backup_manual.sh"
# Create GRUB menu for true automation
sudo tee "$USB_MOUNT/boot/grub/grub.cfg" > /dev/null << 'EOF'
set timeout=5
set default=0
menuentry "AUTOMATIC BACKUP (5 second countdown)" {
linux /boot/vmlinuz-lts root=/dev/sda1 rw quiet init=/auto_backup.sh
initrd /boot/initramfs-lts
}
menuentry "Manual Backup Mode" {
linux /boot/vmlinuz-lts root=/dev/sda1 rw quiet init=/auto_backup_manual.sh
initrd /boot/initramfs-lts
}
menuentry "Alpine Linux (Recovery Console)" {
linux /boot/vmlinuz-lts root=/dev/sda1 rw quiet
initrd /boot/initramfs-lts
}
EOF
# Install pv for progress monitoring
sudo mkdir -p "$USB_MOUNT/apks"
echo "Adding progress monitoring tool..."
# Create final instructions
sudo tee "$USB_MOUNT/TRUE_PLUG_AND_PLAY_INSTRUCTIONS.txt" > /dev/null << 'EOF'
TRUE PLUG-AND-PLAY BACKUP USB
============================
🚀 AUTOMATIC BACKUP:
1. Boot from this USB
2. Wait 5 seconds (automatic backup starts)
3. Wait for 10-second countdown
4. Backup runs automatically (15-20 minutes)
5. System reboots when done
🔧 MANUAL BACKUP:
1. Boot from USB
2. Select "Manual Backup Mode"
3. Follow prompts to select drives
4. Backup proceeds automatically
💾 RESTORE SYSTEM:
1. Boot from USB
2. Select "Alpine Linux (Recovery Console)"
3. Run: /restore_XXXXXXXX.sh /dev/target_drive
4. Follow prompts
TRULY AUTOMATIC:
- No Clonezilla menus
- No device selection
- No compression choices
- Just boot and wait!
Created: $(date)
EOF
# Cleanup
sudo umount "$ISO_MOUNT" "$USB_MOUNT"
sudo rmdir "$USB_MOUNT" "$ISO_MOUNT"
echo ""
echo "✅ TRUE PLUG-AND-PLAY BACKUP USB CREATED!"
echo "✅ Boot USB = 5 second countdown then AUTOMATIC backup"
echo "✅ Uses dd for maximum reliability and speed"
echo "✅ Creates restore scripts automatically"
echo "✅ No menus, no choices - just boot and wait!"
echo ""
echo "DISASTER RECOVERY: Boot USB, wait 15 seconds, backup happens!"