From daa5647bad87bcc5ef37527df23c250332e1ceb8 Mon Sep 17 00:00:00 2001 From: hhf Date: Mon, 9 Dec 2024 00:26:37 +0530 Subject: [PATCH] Add raid_bootloader_install.sh --- raid_bootloader_install.sh | 167 +++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 raid_bootloader_install.sh diff --git a/raid_bootloader_install.sh b/raid_bootloader_install.sh new file mode 100644 index 0000000..20506f6 --- /dev/null +++ b/raid_bootloader_install.sh @@ -0,0 +1,167 @@ +#!/bin/bash + +# Configuration variables +RAID_DEVICE="/dev/md0" +EFI_PARTITIONS=( + "/dev/sdd2" + "/dev/sdb2" + "/dev/nvme2n1p2" + "/dev/sdc2" + "/dev/nvme1n1p2" + "/dev/sda2" +) +MOUNT_POINT="/mnt/efi" +BACKUP_DIR="/tmp/efi_backup" +LOG_FILE="/var/log/raid_bootloader_install.log" + +# Logging function with timestamp +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') : $1" | tee -a "$LOG_FILE" +} + +# Error handling function +handle_error() { + log "ERROR: $1" + exit 1 +} + +# Check if running with root privileges +check_root() { + if [ "$(id -u)" != "0" ]; then + handle_error "This script must be run as root" + fi +} + +# Ensure mount point is unmounted +ensure_unmounted() { + if mountpoint -q "$MOUNT_POINT"; then + umount "$MOUNT_POINT" || handle_error "Failed to unmount $MOUNT_POINT" + fi +} + +# Mount partition safely +safe_mount() { + local partition=$1 + local mount_point=$2 + mount "$partition" "$mount_point" || handle_error "Failed to mount $partition on $mount_point" +} + +# Unmount partition safely +safe_unmount() { + local mount_point=$1 + umount "$mount_point" || handle_error "Failed to unmount $mount_point" +} + +# Generic bootloader installation function +install_bootloader() { + local partition=$1 + local bootloader=$2 + local install_cmd=$3 + + log "Installing $bootloader on $partition" + safe_mount "$partition" "$MOUNT_POINT" + eval "$install_cmd" || handle_error "Failed to install $bootloader on $partition" + safe_unmount "$MOUNT_POINT" + log "$bootloader successfully installed on $partition" +} + +# Install GRUB +install_grub() { + install_bootloader "$1" "GRUB" "grub-install --target=x86_64-efi --efi-directory=$MOUNT_POINT --bootloader-id=GRUB --recheck" +} + +# Install systemd-boot +install_systemd_boot() { + install_bootloader "$1" "systemd-boot" "bootctl --path=$MOUNT_POINT install" +} + +# Install rEFInd +install_refind() { + install_bootloader "$1" "rEFInd" "refind-install --root $MOUNT_POINT" +} + +# Install Limine +install_limine() { + install_bootloader "$1" "Limine" "limine-install $MOUNT_POINT" +} + +# Install LILO +install_lilo() { + install_bootloader "$1" "LILO" "lilo -M $1" +} + +# Copy EFI contents +copy_efi_contents() { + local partition=$1 + log "Copying EFI contents to $partition" + safe_mount "$partition" "$MOUNT_POINT" + cp -r /boot/efi/* "$MOUNT_POINT/" || handle_error "Failed to copy EFI contents to $partition" + safe_unmount "$MOUNT_POINT" + log "EFI contents successfully copied to $partition" +} + +# Backup EFI partition +backup_efi() { + local partition=$1 + mkdir -p "$BACKUP_DIR" + log "Backing up EFI partition from $partition" + safe_mount "$partition" "$MOUNT_POINT" + cp -r "$MOUNT_POINT/"* "$BACKUP_DIR/" || handle_error "Failed to backup EFI contents from $partition" + safe_unmount "$MOUNT_POINT" + log "EFI partition backup completed" +} + +# Restore EFI contents to RAID +restore_efi() { + log "Restoring EFI contents to RAID array" + safe_mount "$RAID_DEVICE" "$MOUNT_POINT" + cp -r "$BACKUP_DIR/"* "$MOUNT_POINT/" || handle_error "Failed to restore EFI contents to RAID" + safe_unmount "$MOUNT_POINT" + log "EFI contents restored to RAID array" +} + +main() { + # Check root privileges + check_root + + # Create mount point if it doesn't exist + mkdir -p "$MOUNT_POINT" + + # Stop existing RAID array + log "Stopping RAID array $RAID_DEVICE" + mdadm --stop "$RAID_DEVICE" || handle_error "Failed to stop RAID array" + + # Ensure mount point is unmounted + ensure_unmounted + + # Install bootloaders on each partition + for partition in "${EFI_PARTITIONS[@]}"; do + log "Processing partition: $partition" + install_grub "$partition" + install_systemd_boot "$partition" + install_refind "$partition" + install_limine "$partition" + install_lilo "$partition" + copy_efi_contents "$partition" + done + + # Backup EFI contents from first partition + backup_efi "${EFI_PARTITIONS[0]}" + + # Create new RAID array with metadata 1.0 + log "Creating new RAID1 array with metadata 1.0" + mdadm --create --verbose "$RAID_DEVICE" --level=1 --raid-devices=${#EFI_PARTITIONS[@]} \ + --metadata=1.0 "${EFI_PARTITIONS[@]}" || handle_error "Failed to create RAID array" + + # Restore EFI contents to RAID + restore_efi + + # Mount RAID array to /boot/efi + log "Mounting RAID array to /boot/efi" + mount "$RAID_DEVICE" /boot/efi || handle_error "Failed to mount RAID array to /boot/efi" + + log "Bootloader installation and RAID array rebuild completed successfully" +} + +# Execute main function +main \ No newline at end of file