selfhost-verify: pieza 2 (busybox swap) — SWAP_BUSYBOX=1, validada en host
Variante (b) pieza 2: el sh+coreutils que el build usa del /toolchain. El /toolchain de Alpine es mixto — busybox para sh/sed/grep/awk/tar/find (symlinks → /bin/busybox), GNU coreutils para cp/mkdir/install. El swap monta el busybox estático de hammer sobre /toolchain/bin/busybox: los applets busybox-backed pasan a usarlo, coreutils GNU queda intacto. Sin código nuevo — el mecanismo --swap ya soporta rel_path (--swap busybox=<hash>:bin/busybox). Validado en host (sin VM): con make+busybox de hammer swapeados, los 4/4 componentes construyen — incl. busybox compilándose a sí mismo con hammer-busybox de shell — y el of_tree del rootfs ensamblado da 9adefb82 (el baseline determinista). Las piezas 1 y 2 son reproducibilidad-neutrales: el toolchain es intercambiable sin perturbar el byte-output. selfhost-verify.sh: SWAP_BUSYBOX=1 (paralelo a SWAP_MAKE). Docs 10/11 actualizadas. Pendiente: verify in-VM con los swaps para el ✓ REPRODUCIBLE end-to-end. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+6
-2
@@ -247,8 +247,12 @@ Diseño completo en [SDD 11 — Bootstrap from-scratch](11-bootstrap.md). Resume
|
|||||||
un build paralelo no-fiable. **Fix:** `CARGO_BUILD_JOBS=1` en el sandbox (serializa el jobserver ⇒
|
un build paralelo no-fiable. **Fix:** `CARGO_BUILD_JOBS=1` en el sandbox (serializa el jobserver ⇒
|
||||||
backend de 1 hilo, independiente del nº de CPUs) — verificado: arje-zero a todas las CPUs + `JOBS=1`
|
backend de 1 hilo, independiente del nº de CPUs) — verificado: arje-zero a todas las CPUs + `JOBS=1`
|
||||||
da byte-idéntico al serial. Baseline del host refrescado y `EXPECT_REF` re-baseado a `9adefb82…`.
|
da byte-idéntico al serial. Baseline del host refrescado y `EXPECT_REF` re-baseado a `9adefb82…`.
|
||||||
**Pendiente:** re-correr el verify in-VM con el fix para cerrar el `✓ REPRODUCIBLE` (y de paso validar
|
**Pieza 2 — busybox (sh+coreutils) validada en host:** el `/toolchain` Alpine es mixto (busybox para
|
||||||
la pieza 1, el swap del make); luego make/autotools → linux-headers → bwrap → rust/llvm.
|
sh/sed/grep/awk/tar/find, GNU coreutils para cp/mkdir/install); el swap monta el busybox estático de
|
||||||
|
hammer sobre `/toolchain/bin/busybox` (`--swap busybox=<hash>:bin/busybox`, sin código nuevo).
|
||||||
|
Con make+busybox de hammer los 4/4 (incl. busybox compilándose a sí mismo con hammer-busybox de shell)
|
||||||
|
reproducen `of_tree=9adefb82…`. Expuesto con `SWAP_BUSYBOX=1`. **Pendiente:** correr el verify in-VM
|
||||||
|
con los swaps para el `✓ REPRODUCIBLE` end-to-end; luego linux-headers → bwrap → rust/llvm.
|
||||||
- ⏭️ **También pendiente (Stage 1):** bus único (B.2: exponer el `CRASHED` a la capa de IA) y
|
- ⏭️ **También pendiente (Stage 1):** bus único (B.2: exponer el `CRASHED` a la capa de IA) y
|
||||||
atestación arje (A1/A2).
|
atestación arje (A1/A2).
|
||||||
|
|
||||||
|
|||||||
+16
-3
@@ -213,9 +213,22 @@ recetas, la **semilla** (`zig`, ya un artefacto sellado), `make`+autotools, `car
|
|||||||
auditable para el log de transparencia. CLI: `hammer bootstrap builder --swap make=<hash>[:rel]`
|
auditable para el log de transparencia. CLI: `hammer bootstrap builder --swap make=<hash>[:rel]`
|
||||||
(repetible; `rel_path` por defecto `usr/bin/<name>`). En el host: pura `b3:8a370f5d…` vs swapped
|
(repetible; `rel_path` por defecto `usr/bin/<name>`). En el host: pura `b3:8a370f5d…` vs swapped
|
||||||
`b3:e7e2282c…`, y `/toolchain/usr/bin/make` queda hardlinkeado al artefacto `fbad44ac…`. El
|
`b3:e7e2282c…`, y `/toolchain/usr/bin/make` queda hardlinkeado al artefacto `fbad44ac…`. El
|
||||||
`selfhost-verify.sh` lo expone opt-in con `SWAP_MAKE=1` (construye make y lo swapea). **Pendiente:**
|
`selfhost-verify.sh` lo expone opt-in con `SWAP_MAKE=1` (construye make y lo swapea). **Validado en
|
||||||
correr Stage 2 in-VM con el swap y confirmar que `of_tree(stage1')` **no** cambia (el make hammer
|
host:** con make de hammer los 4/4 reproducen `of_tree=9adefb82…` (idéntico al baseline determinista).
|
||||||
compila los 4/4 idéntico al de Alpine ⇒ el toolchain es intercambiable sin perturbar el byte-output).
|
- **Pieza 2 — busybox `1.36.1`** (ya es componente de Stage 1, `recipes/busybox.toml`): provee el
|
||||||
|
`sh`+coreutils que el build usa del `/toolchain`. El `/toolchain` de Alpine es **mixto** — busybox
|
||||||
|
para `sh/sed/grep/awk/tar/find` (symlinks → `/bin/busybox`) y GNU coreutils para `cp/mkdir/install`.
|
||||||
|
El swap monta el busybox estático de hammer sobre `/toolchain/bin/busybox` (`--swap
|
||||||
|
busybox=<hash>:bin/busybox`; sin código nuevo — el mecanismo `--swap` ya soporta `rel_path`): los
|
||||||
|
applets busybox-backed pasan a usar hammer-busybox, coreutils GNU intacto. `SWAP_BUSYBOX=1` en el
|
||||||
|
verify. **Validado en host:** con make+busybox de hammer los 4/4 (incl. busybox compilándose a sí
|
||||||
|
mismo con hammer-busybox de shell) reproducen `of_tree=9adefb82…`.
|
||||||
|
- **Determinismo (transversal):** `codegen-units=1` NO bastaba — el backend paralelo de rustc/LLVM
|
||||||
|
(ThinLTO) divergía ~62 KB en `arje-zero` a >1 CPU. Fix: `CARGO_BUILD_JOBS=1` en el sandbox
|
||||||
|
serializa el jobserver ⇒ reproducible e independiente del nº de CPUs (SDD 09 §2). El baseline
|
||||||
|
reproducible verdadero es `of_tree=9adefb82…` (el viejo `0039b2b9…` era un build paralelo no-fiable).
|
||||||
|
**Pendiente:** correr Stage 2 in-VM con los swaps para el `✓ REPRODUCIBLE` end-to-end; luego
|
||||||
|
linux-headers → bwrap → el gran tramo rust/llvm.
|
||||||
|
|
||||||
### 7.3 Enganche con lo ya hecho
|
### 7.3 Enganche con lo ya hecho
|
||||||
|
|
||||||
|
|||||||
@@ -113,9 +113,13 @@ done
|
|||||||
# 3b) Auto-alojamiento *puro* (variante b, SDD 11 §7.2b): reemplazar piezas del toolchain Alpine por
|
# 3b) Auto-alojamiento *puro* (variante b, SDD 11 §7.2b): reemplazar piezas del toolchain Alpine por
|
||||||
# recetas hammer construidas desde fuente, con Stage 2 reverificando que `of_tree(stage1')` NO
|
# recetas hammer construidas desde fuente, con Stage 2 reverificando que `of_tree(stage1')` NO
|
||||||
# cambia (el make hammer compila los 4/4 igual de bit-a-bit que el de Alpine). Opt-in:
|
# cambia (el make hammer compila los 4/4 igual de bit-a-bit que el de Alpine). Opt-in:
|
||||||
# SWAP_MAKE=1 → construye recipes/make.toml y lo monta sobre /toolchain/usr/bin/make.
|
# SWAP_MAKE=1 → construye recipes/make.toml y lo monta sobre /toolchain/usr/bin/make.
|
||||||
# SWAPS="name=hash …" → swaps explícitos extra (formato del flag --swap).
|
# SWAP_BUSYBOX=1 → monta el busybox de hammer sobre /toolchain/bin/busybox (los symlinks de
|
||||||
|
# applets de Alpine — sh/sed/grep/awk/tar/find — pasan a usarlo; cp/mkdir/
|
||||||
|
# install siguen siendo GNU coreutils, intactos).
|
||||||
|
# SWAPS="name=hash[:rel] …" → swaps explícitos extra (formato del flag --swap).
|
||||||
# Por defecto, off ⇒ corrida pura-Alpine (variante a), idéntica a la baseline conocida-buena.
|
# Por defecto, off ⇒ corrida pura-Alpine (variante a), idéntica a la baseline conocida-buena.
|
||||||
|
# Ambas piezas validadas en host: con make+busybox de hammer los 4/4 reproducen of_tree=9adefb82.
|
||||||
SWAP_ARGS=()
|
SWAP_ARGS=()
|
||||||
if [[ "${SWAP_MAKE:-0}" == 1 ]]; then
|
if [[ "${SWAP_MAKE:-0}" == 1 ]]; then
|
||||||
say "variante b — construir make desde fuente (recipes/make.toml) y swapearlo en /toolchain"
|
say "variante b — construir make desde fuente (recipes/make.toml) y swapearlo en /toolchain"
|
||||||
@@ -124,6 +128,13 @@ if [[ "${SWAP_MAKE:-0}" == 1 ]]; then
|
|||||||
say "make hammer: $MAKE_HASH"
|
say "make hammer: $MAKE_HASH"
|
||||||
SWAP_ARGS+=(--swap "make=$MAKE_HASH")
|
SWAP_ARGS+=(--swap "make=$MAKE_HASH")
|
||||||
fi
|
fi
|
||||||
|
if [[ "${SWAP_BUSYBOX:-0}" == 1 ]]; then
|
||||||
|
say "variante b — construir busybox desde fuente y swapearlo en /toolchain/bin/busybox"
|
||||||
|
BB_HASH="$("$HAMMER" --store "$STORE" build recipes/busybox.toml | grep -oE 'b3:[0-9a-f]{64}' | tail -1)"
|
||||||
|
[[ "$BB_HASH" == b3:* ]] || die "no obtuve el hash sellado de busybox"
|
||||||
|
say "busybox hammer: $BB_HASH"
|
||||||
|
SWAP_ARGS+=(--swap "busybox=$BB_HASH:bin/busybox")
|
||||||
|
fi
|
||||||
for s in ${SWAPS:-}; do SWAP_ARGS+=(--swap "$s"); done
|
for s in ${SWAPS:-}; do SWAP_ARGS+=(--swap "$s"); done
|
||||||
|
|
||||||
# 4) Ensamblar el builder con la referencia embebida.
|
# 4) Ensamblar el builder con la referencia embebida.
|
||||||
|
|||||||
Reference in New Issue
Block a user