Install script to allow starting zfs boot manager from grub menu.

This commit is contained in:
cyteen 2026-03-04 15:10:49 +00:00
parent b2391795af
commit 5fa8ca30ef
1 changed files with 88 additions and 0 deletions

88
020_grub_zbm_chainload.sh Normal file
View File

@ -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 <<EOF
#!/bin/sh
exec tail -n +3 \$0
# This file provides an easy way to add custom menu entries.
menuentry "ZFSBootMenu (Extracted)" --class zfs --class gnu-linux {
insmod part_gpt
insmod zfs
insmod gzio
# Use UUID instead of file search
search --no-floppy --fs-uuid --set=root f383eb9e238f6712
echo "Loading ZFSBootMenu Kernel..."
linux /zfsbootmenu/vmlinuz-zbm zbm.import_policy=hostid zbm.prefer=rpool loglevel=4
echo "Loading ZFSBootMenu Initrd..."
initrd /zfsbootmenu/initrd-zbm.img
}
EOF
}
echo "Generating GRUB configuration..."
conf_print_zbm_grub_menu | sudo tee /etc/grub.d/40_zbm
sudo chmod +x /etc/grub.d/40_zbm
echo "Updating GRUB..."
sudo update-grub
echo "---------------------------------------"
echo "Done! Files are located in $FINAL_DEST"
grep -A 10 "menuentry \"ZFSBootMenu" /boot/grub/grub.cfg