arranque UEFI: ISO híbrido BIOS+EFI con grubx64.efi + ESP de mtools (refinamiento #3)
iso-image.sh EFI=1 añade un 2º El Torito EFI: ESP FAT (poblada con el mtools de hammer, recipes/mtools.toml) con EFI/BOOT/BOOTX64.EFI = grubx64.efi (grub-mkimage -O x86_64-efi). GRUB EFI lee el mismo grub.cfg y carga el kernel EFI_STUB (ya en el kernel, sin rebuild) + initrd vía protocolo EFI. El mismo ISO sigue booteando por BIOS (El Torito i386-pc) ⇒ híbrido. efi-boot-test.sh valida ambas firmwares E2E (OVMF→grubx64.efi→sshd, y SeaBIOS→sshd). GOTCHA: mformat -F fuerza FAT32 (min ~33MiB); sobre ESP chica deja FAT inválido que la firmware no lee -> sin -F, auto FAT12/16. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+35
-2
@@ -35,10 +35,13 @@ ROOTFS="${ROOTFS:-work/builder-rootfs}"
|
||||
ISO="${ISO:-work/hammer-live.iso}"
|
||||
KERNEL="${KERNEL:-$(ls store/*-linux/boot/bzImage 2>/dev/null | head -1)}"
|
||||
GRUB_LIB="${GRUB_LIB:-/usr/lib/grub/i386-pc}"
|
||||
GRUB_EFI_LIB="${GRUB_EFI_LIB:-/usr/lib/grub/x86_64-efi}"
|
||||
CMDLINE="${CMDLINE:-console=ttyS0 rdinit=/init}"
|
||||
# xorriso: preferimos el construido por hammer (dogfooding de recipes/xorriso.toml); fallback al host.
|
||||
XORRISO="${XORRISO:-$(ls store/*-xorriso/usr/bin/xorriso 2>/dev/null | head -1)}"
|
||||
[ -n "$XORRISO" ] && [ -x "$XORRISO" ] || XORRISO="$(command -v xorriso 2>/dev/null || true)"
|
||||
# mtools (mformat/mcopy): para poblar la ESP FAT del arranque EFI. Preferimos el de hammer (dogfooding).
|
||||
MTOOLS_DIR="${MTOOLS_DIR:-$(ls -d store/*-mtools/usr/bin 2>/dev/null | head -1)}"
|
||||
|
||||
[ -d "$ROOTFS" ] || { echo "no existe ROOTFS: $ROOTFS" >&2; exit 1; }
|
||||
[ -e "$ROOTFS/sbin/init" ] || { echo "ROOTFS sin /sbin/init" >&2; exit 1; }
|
||||
@@ -122,8 +125,37 @@ echo "==> grub-mkimage El Torito (formato i386-pc-eltorito, módulos iso9660)"
|
||||
grub-mkimage -O i386-pc-eltorito -p '/boot/grub' -o "$ISO_ROOT/boot/grub/i386-pc/eltorito.img" \
|
||||
biosdisk iso9660 part_gpt part_msdos normal configfile linux echo ls boot search
|
||||
|
||||
# --- armar el ISO con xorriso (personalidad mkisofs), El Torito + isohybrid MBR ---
|
||||
echo "==> xorriso: armando $ISO (El Torito BIOS + isohybrid MBR)"
|
||||
# --- EFI=1: rama UEFI (refinamiento #3). Construye grubx64.efi (mismo grub.cfg, lee kernel+initrd del
|
||||
# iso9660) y una ESP FAT con EFI/BOOT/BOOTX64.EFI, poblada con mtools (sin root). El kernel ya trae
|
||||
# EFI_STUB; aquí GRUB EFI es el cargador (espeja la rama BIOS). xorriso añade un 2º El Torito (EFI). ---
|
||||
EFI_ARGS=""
|
||||
if [ "${EFI:-0}" = 1 ]; then
|
||||
[ -d "$GRUB_EFI_LIB" ] || { echo "faltan módulos GRUB x86_64-efi en $GRUB_EFI_LIB" >&2; exit 1; }
|
||||
MFORMAT="$MTOOLS_DIR/mformat"; MCOPY="$MTOOLS_DIR/mcopy"; MMD="$MTOOLS_DIR/mmd"
|
||||
[ -x "$MFORMAT" ] && [ -x "$MCOPY" ] || MFORMAT="$(command -v mformat 2>/dev/null || true)"
|
||||
[ -n "$MFORMAT" ] && [ -x "$MFORMAT" ] || { echo "no encuentro mtools (build recipes/mtools.toml)" >&2; exit 1; }
|
||||
[ -x "$MCOPY" ] || { MCOPY="$(command -v mcopy)"; MMD="$(command -v mmd)"; }
|
||||
echo "==> EFI=1: grub-mkimage x86_64-efi + ESP FAT (mtools: $MFORMAT)"
|
||||
mkdir -p "$STAGE/efi"
|
||||
grub-mkimage -O x86_64-efi -p '/boot/grub' -o "$STAGE/efi/bootx64.efi" \
|
||||
part_gpt part_msdos fat iso9660 normal configfile linux echo ls boot search search_fs_uuid efi_gop efi_uga
|
||||
# ESP FAT: dimensionada al grubx64.efi (+ holgura). mformat sobre una imagen truncada (FAT sin
|
||||
# particionar; el El Torito EFI arranca el FS plano). Poblamos EFI/BOOT/BOOTX64.EFI con mcopy.
|
||||
ESP="$ISO_ROOT/boot/grub/efi.img"
|
||||
# Tamaño ≥ 1.44 MiB (mínimo razonable); mformat SIN -F auto-elige FAT12/16 por nº de clusters. NO
|
||||
# forzar FAT32 (-F): exige ~33 MiB mínimos y sobre una imagen chica deja un FAT inválido que la
|
||||
# firmware no lee ("failed to load ... Not Found").
|
||||
espkb=$(( ( $(stat -c%s "$STAGE/efi/bootx64.efi") / 1024 ) + 512 ))
|
||||
[ "$espkb" -lt 1440 ] && espkb=1440
|
||||
rm -f "$ESP"; truncate -s "$(( espkb * 1024 ))" "$ESP"
|
||||
"$MFORMAT" -i "$ESP" ::
|
||||
"$MMD" -i "$ESP" ::/EFI ::/EFI/BOOT
|
||||
"$MCOPY" -i "$ESP" "$STAGE/efi/bootx64.efi" ::/EFI/BOOT/BOOTX64.EFI
|
||||
EFI_ARGS="-eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat"
|
||||
fi
|
||||
|
||||
# --- armar el ISO con xorriso (personalidad mkisofs), El Torito BIOS (+EFI si EFI=1) + isohybrid MBR ---
|
||||
echo "==> xorriso: armando $ISO (El Torito BIOS${EFI_ARGS:+ + EFI} + isohybrid MBR)"
|
||||
rm -f "$ISO"
|
||||
MBR_ARGS=""
|
||||
[ -r "$GRUB_LIB/boot_hybrid.img" ] && MBR_ARGS="--grub2-mbr $GRUB_LIB/boot_hybrid.img"
|
||||
@@ -135,6 +167,7 @@ MBR_ARGS=""
|
||||
-b boot/grub/i386-pc/eltorito.img \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
--grub2-boot-info \
|
||||
$EFI_ARGS \
|
||||
-o "$ISO" \
|
||||
"$ISO_ROOT" 2>&1 | grep -viE "^xorriso : NOTE|Drive current|Media current|Media status|Media summary|libisofs:|^xorriso : UPDATE" || true
|
||||
|
||||
|
||||
Reference in New Issue
Block a user