Con el kernel metal cero-parpadeo (quiet), los marcadores serie kernel-side (EFI-stub/Linux-version/EXT4) desaparecen. Los /init de pivote + /sbin/init real ahora tee'an marcadores a /dev/ttyS0 (escritura al puerto directo, sortea el printk ⇒ sobreviven quiet): HAMMER-EFI-DISK-PIVOT-OK + HAMMER-EFI-INIT-OK. efi-disk-boot-test y efi-install-test pasan a apoyarse en ésos (kernel-side = informativos). Compatible con el kernel viejo (verbose) también. efi-flicker-test.sh: valida cero-parpadeo por captura de framebuffer OVMF-GOP (media de brillo < umbral ⇒ pantalla negra, sin texto de boot). El seamless i915 queda para metal Intel real. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
84 lines
5.3 KiB
Bash
Executable File
84 lines
5.3 KiB
Bash
Executable File
#!/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; }
|
|
# El kernel metal cero-parpadeo usa `quiet` ⇒ los marcadores válidos en serie son los USERSPACE tee'ados
|
|
# a /dev/ttyS0 (sortean el printk). Los kernel-side EXT4 quedan como informativos.
|
|
echo "==> asserts sobre el arranque del disco EFI instalado:"
|
|
check 'HAMMER-EFI-DISK-PIVOT-OK' "initramfs de pivote resolvió hammer-root (⇒ EFI-stub lanzó BOOTX64.EFI)"
|
|
check 'HAMMER-EFI-INIT-OK' "switch_root → arje-zero PID1 (init real)"
|
|
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
|