diff --git a/020_grub_zbm_chainload.sh b/020_grub_zbm_chainload.sh new file mode 100644 index 0000000..ecdacac --- /dev/null +++ b/020_grub_zbm_chainload.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +set -x + +# Dependencies +sudo apt update && sudo apt install -y binutils wget binwalk # lastversion + +# --- CONFIGURATION --- +REPO="zbm-dev/zfsbootmenu" +ZBM_VERSION=$(lastversion --format tag "${REPO}") +ZBM_RELEASE="recovery" +KERNEL=$(uname -r | cut -d'.' -f1,2) +ARCH=$(uname -m) + +# Target directory for GRUB to find +FINAL_DEST=/boot/zfsbootmenu +sudo mkdir -p ${FINAL_DEST} + +ZBM_EFI="zfsbootmenu-${ZBM_RELEASE}-${ARCH}-${ZBM_VERSION}-linux${KERNEL}.EFI" +ZBM_URL="https://github.com/zbm-dev/zfsbootmenu/releases/download/${ZBM_VERSION}/${ZBM_EFI}" + +# --- TMPFS SETUP --- +WORK_DIR=$(mktemp -d -p /dev/shm zbm_extract.XXXXXX) +cleanup() { + echo "--- Cleaning up RAM storage ---" + rm -rf "$WORK_DIR" + rm -f "$ZBM_EFI" +} +trap cleanup EXIT + +echo "Downloading ZFSBootMenu ${ZBM_VERSION}..." +# lastversion -d \ +# --output "${ZBM_EFI}" \ +# zbm-dev/zfsbootmenu \ +# --filter "${ZBM_RELEASE}.*${ARCH}.*${ZBM_VERSION}.*${KERNEL}.*EFI" + +sudo curl -L "${ZBM_URL}" -o "${ZBM_EFI}" + +# Extraction paths +KERNEL_OUT="${WORK_DIR}/vmlinuz-zbm" +INITRD_OUT="${WORK_DIR}/initrd-zbm.img" + +echo "--- Extracting assets from $ZBM_EFI ---" + +# 1. Extract Kernel & Initrd +if objcopy --dump-section .linux="$KERNEL_OUT" "$ZBM_EFI" 2>/dev/null && + objcopy --dump-section .initrd="$INITRD_OUT" "$ZBM_EFI" 2>/dev/null; then + + echo "[✓] Extraction successful. Moving to $FINAL_DEST..." + sudo cp "$KERNEL_OUT" "$FINAL_DEST/" + sudo cp "$INITRD_OUT" "$FINAL_DEST/" +else + echo "[!] Extraction failed. Check if binutils is installed correctly." + exit 1 +fi + +# --- GRUB MENU GENERATION --- +conf_print_zbm_grub_menu() { + cat <