hammer boot menu ata las tres piezas del contrato: emite el grafo → lanza el compositor (mirada, --compositor configurable) → activa el nodo que el usuario dejó en boot-select. Graceful: sin compositor (servidor headless) emite el grafo y sigue el arranque. Refactor: activate_and_report compartido con boot activate; --out/--select configurables (testeable sin /run/hammer root-only). Wiring: iso-image INSTALLER=1 + install-image-efi bundlean el CLI hammer (static musl) al sistema instalado (el producto trae arje-zero/hammerd pero no el CLI); el wrapper /sbin/init lo invoca tras hammer-recover, salida al serial (no pinta tty0 ⇒ respeta cero-parpadeo). Cierra la pieza #3 del handoff mirada (quién lanza el menú en el boot): lo ownea hammer, desde el hook de init. Tests: boot_menu.rs (3 caminos del glue: graceful/sin-selección/selección→activate) + efi-disk-boot-test asevera que el menú corre. Validado en OVMF: pivote → INIT-OK → menú (emite boot-graph.json + saltea sin mirada) → arje-zero. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
54 lines
3.4 KiB
Bash
Executable File
54 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# efi-disk-boot-test.sh — valida el DISCO INSTALADO EFI-STUB soberano (ADR 0010 paso 5) en OVMF.
|
|
#
|
|
# Arma la imagen con install-image-efi.sh y la arranca por UEFI (OVMF pflash, SIN -kernel: la firmware
|
|
# lanza \EFI\BOOT\BOOTX64.EFI). Asevera la cadena soberana completa por marcadores serie deterministas:
|
|
# 1. EFI-stub cargó el kernel+initrd horneados (sin GRUB ni systemd-boot)
|
|
# 2. el initramfs de pivote resolvió hammer-root por LABEL y montó las ext4
|
|
# 3. switch_root: arje-zero re-montó / (re-mounted) = tomó PID1
|
|
#
|
|
# Nota: el cmdline horneado termina en console=tty0 ⇒ el stdout de userspace va a la pantalla. Los
|
|
# marcadores kernel-side (printk a TODAS las consolas) más el tee a /dev/ttyS0 del /init dan la prueba
|
|
# en el serial headless.
|
|
#
|
|
# Uso: ./scripts/efi-disk-boot-test.sh
|
|
# Vars: ROOTFS KERNEL MEM (def 4096) KVM (def 1) DEADLINE (def 180) OVMF_CODE OVMF_VARS
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
|
MEM="${MEM:-4096}"; KVM="${KVM:-1}"; DEADLINE="${DEADLINE:-180}"
|
|
WORK="$ROOT/work/efi-disk-boot-test"; mkdir -p "$WORK"
|
|
IMG="$WORK/hammer-efi-disk.img"; LOG="$WORK/boot.log"
|
|
|
|
echo "==> armando la imagen EFI-stub con install-image-efi.sh"
|
|
IMG="$IMG" ROOTFS="${ROOTFS:-}" KERNEL="${KERNEL:-}" ./scripts/install-image-efi.sh >"$WORK/build.log" 2>&1 \
|
|
|| { echo "✗ build falló — ver $WORK/build.log" >&2; tail -20 "$WORK/build.log" >&2; exit 1; }
|
|
echo " imagen: $(du -h "$IMG" | cut -f1)"
|
|
|
|
echo "==> arranque UEFI (OVMF, sin -kernel) — deadline ${DEADLINE}s"
|
|
BOOT=1 KVM="$KVM" MEM="$MEM" DEADLINE="$DEADLINE" IMG="$IMG" \
|
|
./scripts/install-image-efi.sh >"$LOG" 2>&1 || true
|
|
|
|
# marcadores (limpiamos escapes ANSI que mete OVMF)
|
|
clean() { sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\r//g' "$LOG"; }
|
|
fail=0
|
|
# El kernel metal cero-parpadeo arranca con `quiet` ⇒ los marcadores kernel-side (EFI-stub, Linux
|
|
# version, montaje/re-mount EXT4) NO llegan al serial. El veredicto se apoya en los marcadores USERSPACE
|
|
# tee'ados a /dev/ttyS0 por el /init de pivote y el /sbin/init real — que escriben al PUERTO serie
|
|
# directo, sorteando el printk ⇒ sobreviven `quiet`. Los kernel-side quedan como informativos.
|
|
info() { if clean | grep -aqiE "$1"; then echo " · $2"; else echo " · ($2 — suprimido por quiet o byte serie perdido, no bloqueante)"; fi; }
|
|
check() { if clean | grep -aqiE "$1"; then echo " ✓ $2"; else echo " ✗ $2 (falta /$1/)"; fail=1; fi; }
|
|
info 'EFI stub: Loaded initrd' 'EFI-stub cargó kernel+initrd (sin GRUB/systemd-boot)'
|
|
info 'EXT4-fs \(vda2\): mounted' 'kernel montó hammer-root (kernel-side)'
|
|
check 'HAMMER-EFI-DISK-PIVOT-OK' 'initramfs pivote resolvió hammer-root y va a switch_root'
|
|
check 'HAMMER-EFI-INIT-OK' 'switch_root → arje-zero PID1 (init real corriendo)'
|
|
check 'hammer boot menu: grafo en' 'menú de arranque por grafo corrió (ADR 0010: emite boot-graph.json)'
|
|
reject_panic() { if clean | grep -aqiE 'HAMMER-EFI-FALLO|Kernel panic'; then echo " ✗ hubo FALLO/panic de pivote"; fail=1; else echo " ✓ sin FALLO ni panic"; fi; }
|
|
reject_panic
|
|
|
|
echo
|
|
if [ "$fail" = 0 ]; then
|
|
echo "✓✓ EFI-DISK VERDE: disco instalado bootea EFI-stub SOBERANO en OVMF (firmware → BOOTX64.EFI → pivote → arje-zero)"
|
|
else
|
|
echo "✗ efi-disk-boot-test FALLÓ — log: $LOG" >&2; exit 1
|
|
fi
|