#!/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!"