El veredicto pleno 4/4 in-VM pide KVM + RAM holgada; el host de dev (7.6 GB, sin KVM) colgó por presión de RAM bajo TCG a los ~17 min del make de musl. Esta tarea traslada la verificación a una máquina capaz (laptop) en un solo comando. - scripts/selfhost-verify.sh: pipeline completo — stage0 → stage1 baseline → stage2 (ancla la ref of_tree) → inyecta overlay.ko/e1000.ko del kernel local al toolchain → ensambla el builder con la ref embebida → empaqueta (cpio --owner=root:root) → bootea + driver no-interactivo → veredicto. KVM auto-detect; PRESEED=hammerd para el camino barato (preseed C+arje, sólo hammerd in-VM). Cross-check entre máquinas: compara su of_tree(stage1) contra EXPECT_REF (198f209f… conocida-buena del dev). - scripts/drive-rebuild.py: driver no-interactivo parametrizado (env: BUILDER_CPIO, KERNEL, MEM, CPU, KVM, NET, DEADLINE, LOG). Bootea, espera la shell de arje-zero, manda rebuild-stage1 y sale 0 si REPRODUCIBLE / 1 si DIVERGENTE. (Versión de repo del driver ad-hoc que vivía en work/.) - scripts/boot-builder-vm.sh: añade la NIC e1000 (NET=1 por defecto) — el vendoring Rust necesita red. - runbook §8c: documenta la tarea y el muro de RAM del host de dev. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
69 lines
2.8 KiB
Bash
Executable File
69 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# boot-builder-vm.sh — Bootea el builder rootfs (Stage 1 + toolchain) en QEMU para correr el
|
|
# rebuild in-rootfs (auto-alojamiento, SDD 11 §7; runbook §8c).
|
|
#
|
|
# El builder se arma con `hammer bootstrap builder … --out work/builder-rootfs` y se empaqueta como
|
|
# initramfs (cpio newc + gzip). Aquí lo booteamos con arje-zero como PID 1: levanta hammerd + una
|
|
# getty en consola y deja una shell. Desde ahí se corre el driver embebido:
|
|
#
|
|
# rebuild-stage1
|
|
#
|
|
# que reconstruye stage1' con el toolchain de adentro y compara su content-hash con la referencia
|
|
# (REF_CONTENT en /etc/hammer/rebuild.env) → ✓ REPRODUCIBLE / ✗ DIVERGENTE.
|
|
#
|
|
# Variables (override por entorno):
|
|
# INITRAMFS cpio.gz del builder (default work/builder.cpio.gz)
|
|
# KERNEL bzImage/vmlinuz a bootear (default /boot/vmlinuz-linux)
|
|
# MEM RAM de la VM en MiB (default 6144; el rootfs vive en RAM + espacio de build)
|
|
# CPU modelo de CPU de QEMU (default Broadwell; AVX2 bajo TCG, sin -cpu host sin KVM)
|
|
# KVM 1 ⇒ usa -enable-kvm -cpu host si hay /dev/kvm (mucho más rápido)
|
|
#
|
|
# RAM: el initramfs se desempaqueta a un tmpfs (~1.2 GB) y el rebuild Rust (arje-zero vendorea un
|
|
# monorepo) necesita varios GB más, TODO en RAM. Con un host de ~7 GB y sin KVM esto va justo y lento
|
|
# (TCG). Si el rebuild muere por OOM, sube MEM (y/o monta un disco para /work en vez de tmpfs).
|
|
#
|
|
# Uso:
|
|
# ./scripts/boot-builder-vm.sh
|
|
# MEM=12288 KVM=1 ./scripts/boot-builder-vm.sh
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
INITRAMFS="${INITRAMFS:-$REPO_ROOT/work/builder.cpio.gz}"
|
|
KERNEL="${KERNEL:-/boot/vmlinuz-linux}"
|
|
MEM="${MEM:-6144}"
|
|
CPU="${CPU:-Broadwell}"
|
|
KVM="${KVM:-0}"
|
|
|
|
[[ -f "$INITRAMFS" ]] || { echo "no existe el initramfs: $INITRAMFS (arma el builder y empaquétalo)" >&2; exit 1; }
|
|
[[ -r "$KERNEL" ]] || { echo "no puedo leer el kernel: $KERNEL (set KERNEL=…)" >&2; exit 1; }
|
|
|
|
accel=()
|
|
if [[ "$KVM" == "1" && -w /dev/kvm ]]; then
|
|
accel=(-enable-kvm -cpu host)
|
|
echo "==> KVM activo (-cpu host)"
|
|
else
|
|
accel=(-cpu "$CPU")
|
|
echo "==> TCG (sin KVM); -cpu $CPU por AVX2. Lento — el rebuild Rust puede tardar."
|
|
fi
|
|
|
|
echo "==> kernel : $KERNEL"
|
|
echo "==> initramfs : $INITRAMFS ($(du -h "$INITRAMFS" | cut -f1))"
|
|
echo "==> mem : ${MEM} MiB"
|
|
echo "==> en la consola, tras el boot: corre rebuild-stage1"
|
|
echo
|
|
|
|
# NIC e1000 (qemu user-mode 10.0.2.0/24): el rebuild Rust hace `cargo vendor` desde crates.io ⇒
|
|
# necesita red. El builder la levanta (insmod e1000.ko + eth0 estática). NET=0 la desactiva.
|
|
net=()
|
|
[[ "${NET:-1}" == "1" ]] && net=(-netdev user,id=n0 -device e1000,netdev=n0)
|
|
|
|
exec qemu-system-x86_64 \
|
|
-m "$MEM" \
|
|
-no-reboot -nographic \
|
|
"${accel[@]}" \
|
|
"${net[@]}" \
|
|
-kernel "$KERNEL" \
|
|
-initrd "$INITRAMFS" \
|
|
-append "console=ttyS0 rdinit=/sbin/init"
|