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>
68 lines
3.3 KiB
Bash
Executable File
68 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# efi-boot-test.sh — valida la rama UEFI del medio live (refinamiento #3): arma un ISO con
|
|
# iso-image.sh EFI=1 y lo arranca por las DOS firmwares, probando que es un HÍBRIDO BIOS+UEFI:
|
|
# (A) UEFI — QEMU con OVMF (pflash) → grubx64.efi (de la ESP FAT poblada con mtools de hammer) →
|
|
# kernel EFI-stub + initrd vía EFI → producto + sshd.
|
|
# (B) BIOS — el MISMO ISO con SeaBIOS (El Torito i386-pc) → producto + sshd.
|
|
# La ESP FAT la puebla el mtools construido por hammer (recipes/mtools.toml); el grubx64.efi lo arma
|
|
# grub-mkimage -O x86_64-efi. El kernel ya trae EFI_STUB (sin rebuild).
|
|
#
|
|
# Uso: PRODUCT=<hash-o-prefijo> ./scripts/efi-boot-test.sh
|
|
# Vars: KERNEL MEM (def 4096) KVM (def 1) OVMF_CODE OVMF_VARS UEFI_DEADLINE (def 200) BIOS_DEADLINE (def 120)
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
|
KERNEL="${KERNEL:-$(ls store/*-linux/boot/bzImage 2>/dev/null | head -1)}"
|
|
MEM="${MEM:-4096}"; KVM="${KVM:-1}"
|
|
UEFI_DEADLINE="${UEFI_DEADLINE:-200}"; BIOS_DEADLINE="${BIOS_DEADLINE:-120}"
|
|
# OVMF (edk2). Default Arch/CachyOS; override con OVMF_CODE/OVMF_VARS si tu distro los pone en otro lado.
|
|
OVMF_CODE="${OVMF_CODE:-/usr/share/edk2/x64/OVMF_CODE.4m.fd}"
|
|
OVMF_VARS="${OVMF_VARS:-/usr/share/edk2/x64/OVMF_VARS.4m.fd}"
|
|
WORK="$ROOT/work/efi-boot-test"; ISO="$WORK/hammer-efi.iso"
|
|
mkdir -p "$WORK"
|
|
|
|
if [ -n "${PRODUCT:-}" ]; then
|
|
PDIR=$(ls -d store/"${PRODUCT#b3:}"*-product-rootfs 2>/dev/null | head -1)
|
|
else
|
|
PDIR=$(ls -dt store/*-product-rootfs 2>/dev/null | head -1)
|
|
fi
|
|
[ -n "$PDIR" ] && [ -d "$PDIR" ] || { echo "no encuentro product-rootfs"; exit 1; }
|
|
[ -r "$OVMF_CODE" ] && [ -r "$OVMF_VARS" ] || { echo "no encuentro OVMF (set OVMF_CODE/OVMF_VARS): $OVMF_CODE"; exit 1; }
|
|
echo "==> product-rootfs: $PDIR"
|
|
echo "==> OVMF: $OVMF_CODE"
|
|
|
|
accel=(); if [ "$KVM" = 1 ] && [ -w /dev/kvm ]; then accel=(-enable-kvm -cpu host); fi
|
|
|
|
echo "==> armando ISO híbrido (EFI=1) con iso-image.sh"
|
|
ROOTFS="$PDIR" ISO="$ISO" KERNEL="$KERNEL" EFI=1 ./scripts/iso-image.sh >/dev/null
|
|
echo " ISO: $(du -h "$ISO" | cut -f1)"
|
|
|
|
fail=0
|
|
markers() { # $1=log $2=etiqueta
|
|
local log="$1" tag="$2"
|
|
if grep -aqiE "Linux version 6\.16" "$log" && grep -aqiE "Server listening on .* port 22" "$log"; then
|
|
echo " ✓ $tag: kernel cargado + sshd escuchando"
|
|
else
|
|
echo " ✗ $tag: no llegó a sshd — ver $log" >&2; fail=1
|
|
fi
|
|
}
|
|
|
|
echo "==> (A) arranque UEFI (OVMF) — deadline ${UEFI_DEADLINE}s"
|
|
cp "$OVMF_VARS" "$WORK/vars.fd"
|
|
timeout "$UEFI_DEADLINE" qemu-system-x86_64 -m "$MEM" -no-reboot -nographic "${accel[@]}" \
|
|
-drive if=pflash,unit=0,format=raw,readonly=on,file="$OVMF_CODE" \
|
|
-drive if=pflash,unit=1,format=raw,file="$WORK/vars.fd" \
|
|
-cdrom "$ISO" -boot d > "$WORK/uefi.log" 2>&1 || true
|
|
grep -aqi "Loaded initrd from LINUX_EFI_INITRD" "$WORK/uefi.log" && echo " ✓ UEFI: GRUB EFI cargó kernel+initrd vía EFI"
|
|
markers "$WORK/uefi.log" "UEFI"
|
|
|
|
echo "==> (B) arranque BIOS (SeaBIOS) del MISMO ISO — deadline ${BIOS_DEADLINE}s"
|
|
timeout "$BIOS_DEADLINE" qemu-system-x86_64 -m "$MEM" -no-reboot -nographic "${accel[@]}" \
|
|
-cdrom "$ISO" -boot d > "$WORK/bios.log" 2>&1 || true
|
|
markers "$WORK/bios.log" "BIOS"
|
|
|
|
if [ "$fail" = 0 ]; then
|
|
echo; echo "✓✓ EFI VERDE: ISO HÍBRIDO bootea por UEFI (OVMF→grubx64.efi de mtools) y por BIOS (El Torito)"
|
|
else
|
|
echo; echo "✗ efi-boot-test FALLÓ" >&2; exit 1
|
|
fi
|