tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1574Shell 204Rust 111Markdown 993763 Definiciones

arranque-grafo: validación 2-stage del instalador live EFI en OVMF (ADR 0010 paso 5)

efi-install-test.sh cierra el lazo completo bajo UEFI (hermano de
iso-install-test.sh que es BIOS): (1) ISO live EFI=1 INSTALLER=1 AUTO_INSTALL
en OVMF con disco en blanco → hammer-install detecta /sys/firmware/efi y toma
la rama EFI (MBR+ESP-0xEF) desatendido → HAMMER-INSTALL-OK; (2) el disco
instalado bootea SOLO en OVMF → firmware → BOOTX64.EFI → pivote → arje-zero
PID1, sin GRUB. VERDE end-to-end.

Prueba el instalador live REAL corriendo dentro del live, no sólo sus
artefactos. ADR 0010: paso 5 cerrado salvo metal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

6921dfead31ebb2878a807b5ce33f7108ffab2ef · por sergio · (hace 3 meses) · padre 4e00178fc · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

2 archivos · +87 −4

diff --git a/docs/adr/0010-arranque-grafo-mirada.md b/docs/adr/0010-arranque-grafo-mirada.md
index 3ddc4286..8f224725 100644
--- a/docs/adr/0010-arranque-grafo-mirada.md
+++ b/docs/adr/0010-arranque-grafo-mirada.md
@@ -1,8 +1,8 @@
 # ADR 0010 — Arranque por grafo: el menú de boot como navegación del grafo de estados (mirada + hammer)
 
 **Estado:** aceptado; lado hammer implementado (pasos 1–3, 5 ✅; paso 2 ✅ vía pivote a ext4; paso 4
-—cero-parpadeo— pendiente). Falta validación 2-stage del instalador live + metal, y el lado mirada.
-**Fecha:** 2026-07-06 (impl. EFI-stub 2026-07-10).
+—cero-parpadeo— pendiente). Instalador live EFI validado 2-stage en OVMF ✅. Falta metal real y el lado
+mirada. **Fecha:** 2026-07-06 (impl. EFI-stub 2026-07-10).
 **Contexto cruzado:** hammer (arranque/kernel/generaciones) + tawasuyu/mirada (render). El
 espejo de este ADR para el lado mirada vive en `tawasuyu/HANDOFF-arranque-grafo.md`.
 
@@ -118,8 +118,10 @@ muerto antes del takeover).
    - **live-side** `scripts/hammer-live-install.sh` rama EFI — detecta `/sys/firmware/efi` y hace
      **MBR con ESP tipo 0xEF** (UEFI arranca una ESP MBR igual que GPT ⇒ alcanza busybox
      fdisk/mkfs.vfat/mount, sin GPT-tool ni mtools en el live). El kernel EFI-stub viaja en el payload
-     (`iso-image.sh INSTALLER=1` bundlea `bzImage-efi`). El arranque MBR+ESP-EF quedó **spot-checked en
-     OVMF**. Falta sólo la validación 2-stage (live UEFI → instalar → rebootear el disco) y el metal.
+     (`iso-image.sh INSTALLER=1` bundlea `bzImage-efi`). **Validación 2-stage VERDE en OVMF**
+     (`scripts/efi-install-test.sh`): ISO live UEFI → `hammer-install` detecta `/sys/firmware/efi` y toma
+     la rama EFI → el disco instalado bootea SOLO por EFI-stub soberano (sin GRUB) → arje-zero PID1.
+     Falta sólo el metal real (quemar USB + bootear, Secure Boot OFF).
 
 ## Consecuencias
 
diff --git a/scripts/efi-install-test.sh b/scripts/efi-install-test.sh
new file mode 100755
index 00000000..378bba94
--- /dev/null
+++ b/scripts/efi-install-test.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+# efi-install-test.sh — valida el lazo COMPLETO de instalación EFI desde el medio live en OVMF (ADR 0010
+# paso 5, hermano UEFI de scripts/iso-install-test.sh que es BIOS):
+#   (1) arma un ISO instalador EFI (iso-image.sh EFI=1 INSTALLER=1 AUTO_INSTALL=/dev/vda) — GRUB-EFI carga
+#       el live, cuyo /init desatendido corre hammer-install; el payload trae el kernel metal EFI-stub;
+#   (2) lo bootea EN OVMF con un disco EN BLANCO ⇒ el live corre bajo UEFI ⇒ hammer-install detecta
+#       /sys/firmware/efi y toma la RAMA EFI (MBR+ESP-0xEF, EFI-stub soberano), instala y apaga;
+#   (3) bootea ESE disco SOLO en OVMF (sin ISO, sin -kernel) ⇒ la firmware lanza \EFI\BOOT\BOOTX64.EFI →
+#       initramfs de pivote → arje-zero. Cierra "ISO live UEFI → disco EFI instalado → bootea solo".
+#
+# Uso:  PRODUCT=<hash-o-prefijo> ./scripts/efi-install-test.sh
+# Vars: KERNEL (ISO/live) MEM (def 4096) KVM (def 1) DISK_MB (def 4096)
+#       INSTALL_DEADLINE (def 240) BOOT_DEADLINE (def 120) OVMF_CODE OVMF_VARS
+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}"; DISK_MB="${DISK_MB:-4096}"
+INSTALL_DEADLINE="${INSTALL_DEADLINE:-240}"; BOOT_DEADLINE="${BOOT_DEADLINE:-120}"
+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-install-test"; ISO="$WORK/installer-efi.iso"; TGT="$WORK/target.img"
+ILOG="$WORK/install.log"; BLOG="$WORK/diskboot.log"
+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; }
+[ -n "$KERNEL" ] && [ -e "$KERNEL" ] || { echo "no encuentro kernel del live"; exit 1; }
+[ -r "$OVMF_CODE" ] && [ -r "$OVMF_VARS" ] || { echo "no encuentro OVMF (set OVMF_CODE/OVMF_VARS): $OVMF_CODE"; exit 1; }
+[ -n "$(ls -dt store/*-linux-metal/boot/bzImage 2>/dev/null | head -1)" ] || { echo "no encuentro kernel linux-metal (payload EFI del instalador)"; 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 "==> (1) armando ISO instalador EFI (EFI=1 INSTALLER=1 AUTO_INSTALL=/dev/vda)"
+ROOTFS="$PDIR" ISO="$ISO" KERNEL="$KERNEL" EFI=1 INSTALLER=1 AUTO_INSTALL=/dev/vda ./scripts/iso-image.sh >/dev/null
+echo "    ISO: $(du -h "$ISO" | cut -f1)"
+
+echo "==> (2) boot del instalador EN OVMF con disco EN BLANCO ${DISK_MB}M (auto-instala rama EFI y apaga) — deadline ${INSTALL_DEADLINE}s"
+rm -f "$TGT"; truncate -s "${DISK_MB}M" "$TGT"
+cp "$OVMF_VARS" "$WORK/vars-install.fd"
+timeout "$INSTALL_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-install.fd" \
+    -drive file="$TGT",format=raw,if=virtio -cdrom "$ISO" -boot d > "$ILOG" 2>&1 || true
+if ! grep -aq "HAMMER-INSTALL-OK" "$ILOG"; then
+    echo "✗ la instalación EFI NO terminó OK — ver $ILOG" >&2
+    sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\r//g' "$ILOG" | grep -iE "HAMMER-INSTALL-FAIL|hammer-install|no apareció|UEFI|EFI-stub soberano|error" | head; exit 1
+fi
+echo "    ✓ HAMMER-INSTALL-OK (rama EFI corrió en el live UEFI)"
+# Confirmar que fue la rama EFI (no la BIOS)
+sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\r//g' "$ILOG" | grep -aqiE 'hammer-install \(UEFI\)|EFI-stub soberano' \
+    && echo "    ✓ tomó la rama EFI (MBR+ESP-0xEF)" || echo "    ! no vi el marcador de rama EFI (¿fue por BIOS?)" >&2
+
+echo "==> (3) boot del DISCO instalado EN OVMF (sin ISO, sin -kernel) — deadline ${BOOT_DEADLINE}s"
+cp "$OVMF_VARS" "$WORK/vars-boot.fd"
+timeout "$BOOT_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-boot.fd" \
+    -drive file="$TGT",format=raw,if=virtio > "$BLOG" 2>&1 || true
+
+clean() { sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\r//g' "$BLOG"; }
+fail=0
+check()  { if clean | grep -aqiE "$1"; then echo "  ✓ $2"; else echo "  ✗ $2" >&2; fail=1; fi; }
+reject() { if clean | grep -aqiE "$1"; then echo "  ✗ $2 (apareció)" >&2; fail=1; else echo "  ✓ $2"; fi; }
+echo "==> asserts sobre el arranque del disco EFI instalado:"
+check  'HAMMER-EFI-DISK-PIVOT-OK|EXT4-fs \(vda2\): mounted' "initramfs de pivote montó hammer-root (⇒ EFI-stub lanzó BOOTX64.EFI)"
+check  'EXT4-fs \(vda2\): re-mounted'                        "switch_root → arje-zero re-montó / (PID1)"
+reject 'GNU GRUB'                                            "arrancó SIN GRUB (EFI-stub soberano)"
+reject 'HAMMER-EFI-FALLO|Kernel panic'                       "sin fallo de pivote ni panic"
+
+echo
+if [ "$fail" = 0 ]; then
+    echo "✓✓ EFI-INSTALL VERDE: ISO live UEFI → hammer-install rama EFI → disco EFI-stub SOBERANO bootea solo en OVMF"
+else
+    echo "✗ efi-install-test FALLÓ — logs: $ILOG · $BLOG" >&2; exit 1
+fi