Skip to content

Instantly share code, notes, and snippets.

@hurbeana
Last active January 13, 2024 13:22
Show Gist options
  • Save hurbeana/18e6d782a648cf7335a7d4577dc279ad to your computer and use it in GitHub Desktop.
Save hurbeana/18e6d782a648cf7335a7d4577dc279ad to your computer and use it in GitHub Desktop.
minegrub
RES="2560x1440"
GRUB="/etc/default/grub"
GRUB_BACKUP="/etc/default/grub.bak"
SERVICE_NAME="update-theme"
MINEGRUB_DEST="/boot/grub/themes/minegrub"
MOUNT_DIR="/mnt/efi_temp"
GRUB_CUSTOM_FILE="/etc/grub.d/09_custom_windows"
# Backup GRUB configuration
sudo cp "$GRUB" "$GRUB_BACKUP"
# Setup minegrub
cd /tmp
rm -rf minegrub-theme
if ! git clone https://github.com/Lxtharia/minegrub-theme.git; then
echo "Failed to clone minegrub-theme repository."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
sudo mkdir -p /boot/grub/themes/
sudo cp -ru minegrub-theme/minegrub "$MINEGRUB_DEST"
sudo cp minegrub-theme/background_options/* "$MINEGRUB_DEST/backgrounds"
# Update GRUB settings
if ! sudo sed -i -n -e'/^GRUB_THEME=/!p;$aGRUB_THEME=\/boot\/grub\/themes\/minegrub\/theme\.txt' "$GRUB" ||
! sudo sed -i -n -e'/^GRUB_TIMEOUT_STYLE=/!p;$aGRUB_TIMEOUT_STYLE=menu' "$GRUB" ||
! sudo sed -i -n -e'/^GRUB_TIMEOUT=/!p;$aGRUB_TIMEOUT=5' "$GRUB" ||
! sudo sed -i -n -e'/^GRUB_GFXMODE=/!p' -e"\$aGRUB_GFXMODE=$RES,auto" "$GRUB" ||
! sudo sed -i -n -e'/^GRUB_TERMINAL_OUTPUT=/!p;$aGRUB_TERMINAL_OUTPUT=gfxterm' "$GRUB"; then
echo "Failed to update GRUB settings."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
# Setup splash update theme service
if ! sudo apt install -y neofetch ||
! sudo tee /etc/systemd/system/$SERVICE_NAME.service >/dev/null << EOF
[Unit]
Description=Update Grub Theme
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /boot/grub/themes/minegrub/update_theme.py
WorkingDirectory=/boot/grub/themes/minegrub
[Install]
WantedBy=multi-user.target
EOF
then
echo "Failed to install neofetch or setup the update-theme service."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
if ! sudo systemctl daemon-reload ||
! sudo systemctl enable $SERVICE_NAME.service ||
! sudo systemctl start $SERVICE_NAME.service; then
echo "Failed to setup the update-theme service."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
# Setup windows entry
EFI_PARTITION=$(sudo blkid -t PARTLABEL="EFI system partition" -o device)
if [ -z "$EFI_PARTITION" ]; then
echo "EFI partition not found."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
sudo mkdir -p "$MOUNT_DIR"
sudo mount "$EFI_PARTITION" "$MOUNT_DIR"
BOOTMGR_PATH=$(sudo find "$MOUNT_DIR" -name bootmgfw.efi)
if [ -z "$BOOTMGR_PATH" ]; then
echo "Windows Boot Manager not found."
sudo umount "$MOUNT_DIR"
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
sudo umount "$MOUNT_DIR"
BOOTMGR_REL_PATH=$(echo "$BOOTMGR_PATH" | sed 's,'"$MOUNT_DIR"',,g')
EFI_UUID=$(sudo blkid -o value -s UUID "$EFI_PARTITION")
if ! sudo tee "$GRUB_CUSTOM_FILE" >/dev/null <<EOF
#!/bin/sh
exec tail -n +3 $0
menuentry 'Windows' --class windows --class os $menuentry_id_option 'osprober-efi-$EFI_UUID' {
insmod part_gpt
insmod fat
search --no-floppy --fs-uuid --set=root $EFI_UUID
chainloader $BOOTMGR_REL_PATH
}
EOF
then
echo "Failed to create custom GRUB entry for Windows."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
# Disable os-prober to prevent auto-adding of OS entries
if ! sudo sed -i -n -e'/^GRUB_DISABLE_OS_PROBER=/!p;$aGRUB_DISABLE_OS_PROBER=true' "$GRUB"; then
echo "Failed to update GRUB os-prober settings."
sudo cp "$GRUB_BACKUP" "$GRUB"
exit 1
fi
#Move uefi-firmware to the back
sudo mv /etc/grub.d/30_uefi-firmware /etc/grub.d/50_uefi-firmware 2>/dev/null
# Clean up the kernels
installed_kernels=$(dpkg --list | grep -E '^linux-image-[0-9]+.*-generic' | awk '{ print $2 }')
current_kernel=$(uname -r)
latest_kernel=$(echo "$installed_kernels" | sort -V | tail -n 1)
for kernel in $installed_kernels; do
if [ "$kernel" != "linux-image-$current_kernel" ] && [ "$kernel" != "linux-image-$latest_kernel" ]; then
echo "Removing old kernel: $kernel"
sudo apt-get purge -y $kernel
fi
done
#Update GRUB and clean up
sudo update-grub
sudo apt-get autoremove -y
sudo apt-get autoclean
echo "Script completed successfully."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment