el busybox recortado ARRANCA: Stage 1 en QEMU, contra una línea base

Se ensamblaron dos Stage 1 completos y se arrancaron los dos, para que cualquier
diferencia se atribuya al recorte y no al azar:

  base      b3:1a3823b4...  400 applets  qemu rc=0
  recortado b3:3aa8cd2d...  278 applets  qemu rc=0

Los dos dan shell y se apagan limpio. El diff de las dos consolas son 35 líneas y
ninguna es funcional: TSC, direcciones del RAMDISK, BogoMIPS, hora del RTC. La única
diferencia real es el conteo de applets desde dentro de la imagen: 410 contra 288.

Verificado en el recortado: arje-zero como PID 1, la seed card carga (la getty llegó
a incarnar), getty -l /bin/sh da prompt y responde, y poweroff -f apaga de verdad
-- uno de los cinco indultados, probado en vivo.

Corrido en el worker con QEMU en TCG: el LXC no expone /dev/kvm. Hubo que instalar
qemu-system-x86-core y reingerir la semilla de Stage 0, que no estaba en ese store y
salió con el mismo hash que el manifiesto ya anotaba.

Es Stage 1, no el producto: product-boot-test.sh sigue pendiente porque al store del
worker le faltan netup, openssh, uutils, findutils-xargs, diffutils y ripgrep.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-21 18:50:52 +00:00
co-authored by Claude Opus 5
parent 0d6599ac14
commit 0db85d51f8
+40 -3
View File
@@ -410,10 +410,47 @@ libnftnl linux linux-firmware llama-cpp logrotate nftables opensmtpd popt protob
sof-firmware valkey wireless-regdb zlib-ng`. **`linux` está en la lista**: el kernel se reconstruye.
La granja lo hará en su propio ciclo; no se disparó a mano.
## Lo que queda del paso 1
## El arranque — PROBADO en QEMU, contra una línea base
- **Arrancar una imagen.** Lo medido es que el artefacto sella y que el sandbox construye. Que el
producto **bootee** con 277 applets no se probó: falta `product-boot-test.sh`.
**2026-09-21.** Se ensamblaron **dos** Stage 1 completos y se arrancaron los dos en QEMU, para que
cualquier diferencia se pueda atribuir al recorte y no al azar:
| | rootfs sellado | applets en `/bin /sbin /usr/bin /usr/sbin` | qemu |
|---|---|---|---|
| **base** (busybox sin recortar) | `b3:1a3823b4…` | 400 | `rc=0` |
| **recortado** | `b3:3aa8cd2d…` | **278** | `rc=0` |
Los dos arrancan, los dos dan shell y los dos se apagan limpio. **Diff de las dos consolas: 35
líneas, y ninguna es funcional** — frecuencia del TSC, direcciones del RAMDISK, BogoMIPS, hora del
RTC. La única diferencia real es la que se buscaba:
```
~ # ls /bin /sbin /usr/bin /usr/sbin | wc -l
410 ← base
288 ← recortado
```
Criterios del runbook `stage1-vm-boot.md` §6, verificados en el recortado:
- **PID 1** — `arje-zero` incarna y corre.
- **Seed** — la card se carga: la prueba es que la `console-getty` llegó a incarnar.
- **getty → shell** — `/bin/busybox getty -n -l /bin/sh 115200 console` da prompt `~ #`, y
`echo MARCA-SHELL-VIVA` responde. **`getty` y `sh` sobrevivieron al recorte, que era el riesgo.**
- **`poweroff -f`** — `ACPI: PM: Preparing to enter system sleep state S5` / `reboot: Power down`.
Uno de los cinco indultados, probado **en vivo**: sin él la caja no se apaga.
**Cómo se corrió, porque condiciona el resultado:** en `dev.gioser.net`, con **QEMU en TCG
(emulación pura)** — el LXC no expone `/dev/kvm`, aunque el CPU sí trae los flags. Por eso el guion
se le manda por consola serie con esperas generosas. Hubo que instalar `qemu-system-x86-core` (dnf)
e ingerir de nuevo la semilla de Stage 0, que no estaba en el store del worker; sí salió con el
mismo hash que el manifiesto ya anotaba (`3ce721ec…`).
**Es Stage 1, no el producto.** Se eligió porque es donde vive busybox (`musl busybox hammerd
arje-zero`) y porque necesitaba 2 artefactos en vez de 8. `product-boot-test.sh` —que además levanta
sshd y netup— sigue sin correrse: le faltan `netup openssh uutils findutils-xargs diffutils
ripgrep` en el store del worker.
## Lo que queda del paso 1
- **Las otras 21 dependientes**, cuando la granja llegue.
- El siguiente corte natural son los `BORRAR` que no se tocaron por prudencia y los 272 que siguen:
el número baja a 0 por el paso 2 (declarar la munición sellada) y el 5 (`grep`/`sed` POSIX).