Files
backup_to_external_m.2/old_scripts/fix_grub_lvm_boot.sh
root 56c07dbe49 Complete rewrite: Single working LVM block-level backup script
- Removed 40+ broken/messy scripts, moved to old_scripts/
- Created lvm_block_backup.sh - proper block-level LVM snapshot backup
- Uses dd for block-level cloning instead of file-level rsync
- Successfully tested: 462GB backup in 33 minutes
- Creates exact, bootable clone of internal drive to external drive
- Proper LVM snapshot management with cleanup
- Clear documentation in README_BACKUP.md
- Clean, minimal solution that actually works
2025-09-30 17:35:22 +02:00

138 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# Fix GRUB Boot for LVM System - External M.2
# This script fixes GRUB configuration to boot from the external LVM system instead of internal drive
set -e
LOG_FILE="/tmp/grub_fix_$(date +%Y%m%d_%H%M%S).log"
EXTERNAL_ROOT="/tmp/external-root"
EXTERNAL_BOOT="/tmp/external-boot"
echo "🔧 GRUB LVM Boot Fix - Starting at $(date)" | tee "$LOG_FILE"
echo "==========================================" | tee -a "$LOG_FILE"
# Function to cleanup mounts on exit
cleanup() {
echo "🧹 Cleaning up mounts..." | tee -a "$LOG_FILE"
sudo umount "$EXTERNAL_ROOT/proc" 2>/dev/null || true
sudo umount "$EXTERNAL_ROOT/sys" 2>/dev/null || true
sudo umount "$EXTERNAL_ROOT/dev/pts" 2>/dev/null || true
sudo umount "$EXTERNAL_ROOT/dev" 2>/dev/null || true
sudo umount "$EXTERNAL_ROOT/boot" 2>/dev/null || true
sudo umount "$EXTERNAL_ROOT" 2>/dev/null || true
sudo umount "$EXTERNAL_BOOT" 2>/dev/null || true
sudo rmdir "$EXTERNAL_ROOT" "$EXTERNAL_BOOT" 2>/dev/null || true
}
trap cleanup EXIT
# Check if LVM is active
echo "📋 Checking LVM status..." | tee -a "$LOG_FILE"
if ! sudo lvs system-vg/root &>/dev/null; then
echo "❌ LVM system-vg/root not found. Please ensure the external M.2 is connected." | tee -a "$LOG_FILE"
exit 1
fi
# Create mount points
sudo mkdir -p "$EXTERNAL_ROOT" "$EXTERNAL_BOOT"
# Mount the external LVM system
echo "💾 Mounting external LVM system..." | tee -a "$LOG_FILE"
sudo mount /dev/system-vg/root "$EXTERNAL_ROOT" | tee -a "$LOG_FILE"
sudo mount /dev/system-vg/boot "$EXTERNAL_ROOT/boot" | tee -a "$LOG_FILE"
# Bind mount system directories for chroot
echo "🔗 Setting up chroot environment..." | tee -a "$LOG_FILE"
sudo mount --bind /proc "$EXTERNAL_ROOT/proc"
sudo mount --bind /sys "$EXTERNAL_ROOT/sys"
sudo mount --bind /dev "$EXTERNAL_ROOT/dev"
sudo mount --bind /dev/pts "$EXTERNAL_ROOT/dev/pts"
# Show current GRUB configuration issue
echo "🔍 Current GRUB issue:" | tee -a "$LOG_FILE"
if sudo mount /dev/system-vg/boot "$EXTERNAL_BOOT" 2>/dev/null; then
WRONG_ENTRIES=$(sudo grep -c "nvme0n1p1" "$EXTERNAL_BOOT/grub/grub.cfg" 2>/dev/null || echo "0")
echo " - Found $WRONG_ENTRIES entries pointing to internal drive (nvme0n1p1)" | tee -a "$LOG_FILE"
sudo umount "$EXTERNAL_BOOT"
fi
# Get the correct UUID for the LVM root
ROOT_UUID=$(sudo blkid /dev/system-vg/root | grep -o 'UUID="[^"]*"' | cut -d'"' -f2)
echo " - External LVM root UUID: $ROOT_UUID" | tee -a "$LOG_FILE"
# Update GRUB configuration from within the external system
echo "🔄 Regenerating GRUB configuration..." | tee -a "$LOG_FILE"
# First, ensure EFI partition is mounted in the chroot
EFI_PARTITION=$(lsblk -rno MOUNTPOINT,FSTYPE | grep vfat | head -1 | cut -d' ' -f1)
if [ -n "$EFI_PARTITION" ]; then
echo "📁 Mounting EFI partition: $EFI_PARTITION" | tee -a "$LOG_FILE"
sudo mkdir -p "$EXTERNAL_ROOT/boot/efi"
sudo mount "$EFI_PARTITION" "$EXTERNAL_ROOT/boot/efi" || true
fi
# Update fstab to reflect LVM UUIDs
echo "📝 Updating /etc/fstab with correct UUIDs..." | tee -a "$LOG_FILE"
sudo chroot "$EXTERNAL_ROOT" bash -c "
# Get UUIDs for all LVM volumes
ROOT_UUID=\$(blkid /dev/system-vg/root | grep -o 'UUID=\"[^\"]*\"' | cut -d'\"' -f2)
BOOT_UUID=\$(blkid /dev/system-vg/boot | grep -o 'UUID=\"[^\"]*\"' | cut -d'\"' -f2)
HOME_UUID=\$(blkid /dev/system-vg/home | grep -o 'UUID=\"[^\"]*\"' | cut -d'\"' -f2)
SWAP_UUID=\$(blkid /dev/system-vg/swap | grep -o 'UUID=\"[^\"]*\"' | cut -d'\"' -f2)
# Backup original fstab
cp /etc/fstab /etc/fstab.backup
# Create new fstab with LVM UUIDs
cat > /etc/fstab << EOF
# LVM-based fstab generated by fix_grub_lvm_boot.sh
UUID=\${ROOT_UUID} / ext4 errors=remount-ro 0 1
UUID=\${BOOT_UUID} /boot ext4 defaults 0 2
UUID=\${HOME_UUID} /home ext4 defaults 0 2
UUID=\${SWAP_UUID} none swap sw 0 0
# EFI System Partition
/dev/disk/by-label/SYSTEM-EFI /boot/efi vfat umask=0077 0 1
EOF
echo '✅ Updated /etc/fstab with LVM UUIDs'
"
# Install GRUB to EFI
echo "🛠️ Installing GRUB to EFI..." | tee -a "$LOG_FILE"
sudo chroot "$EXTERNAL_ROOT" bash -c "
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu-lvm --recheck 2>&1
echo '✅ GRUB installed to EFI'
"
# Update GRUB configuration
echo "📝 Updating GRUB configuration..." | tee -a "$LOG_FILE"
sudo chroot "$EXTERNAL_ROOT" bash -c "
update-grub 2>&1
echo '✅ GRUB configuration updated'
"
# Verify the fix
echo "✅ Verifying GRUB fix..." | tee -a "$LOG_FILE"
sudo mount /dev/system-vg/boot "$EXTERNAL_BOOT"
NEW_ENTRIES=$(sudo grep -c "system-vg-root" "$EXTERNAL_BOOT/grub/grub.cfg" 2>/dev/null || echo "0")
OLD_ENTRIES=$(sudo grep -c "nvme0n1p1" "$EXTERNAL_BOOT/grub/grub.cfg" 2>/dev/null || echo "0")
echo " - LVM entries found: $NEW_ENTRIES" | tee -a "$LOG_FILE"
echo " - Internal drive entries: $OLD_ENTRIES" | tee -a "$LOG_FILE"
if [ "$NEW_ENTRIES" -gt 0 ]; then
echo "✅ SUCCESS: GRUB now configured to boot from external LVM system!" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"
echo "🚀 Next steps:" | tee -a "$LOG_FILE"
echo " 1. Reboot your system" | tee -a "$LOG_FILE"
echo " 2. In GRUB menu, select 'ubuntu-lvm' or Ubuntu entries" | tee -a "$LOG_FILE"
echo " 3. System should now boot from external M.2 LVM" | tee -a "$LOG_FILE"
echo "" | tee -a "$LOG_FILE"
echo "📋 Log saved to: $LOG_FILE"
else
echo "⚠️ Warning: No LVM entries found in new GRUB config. Manual check required." | tee -a "$LOG_FILE"
echo " Check $LOG_FILE for details."
fi
echo "" | tee -a "$LOG_FILE"
echo "🔧 GRUB LVM Boot Fix completed at $(date)" | tee -a "$LOG_FILE"