bootstrap: hammerd como receta Cargo en Stage 1 (Lote 7)
Cierra el userland mínimo salvo el init definitivo. hammerd entra como tercer componente de stage1, construido por el lab vía BuildSys::Cargo + vendoring: - recipes/hammerd.toml: source git del repo hammer a commit fijado (ADR 0006), flags=["-p","hammerd"] para construir sólo ese binario del workspace, estático con zig cc; las deps se vendorean en el fetch (Lote 6) ⇒ build --offline - STAGE1_COMPONENTS += hammerd; el inittab provisional lo arranca como servicio respawn (/usr/bin/hammerd) tras montar los pseudo-FS - el test de recetas del repo ahora valida también hammerd.toml (parse + hash) Falta sólo sustituir el init provisional de busybox por arje (ADR 0007) para el CRASHED real. El cross-compile se valida en la VM. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
e9b0551213
commit
02827f62c9
+6
-5
@@ -184,11 +184,12 @@ Diseño completo en [SDD 11 — Bootstrap from-scratch](11-bootstrap.md). Resume
|
||||
semilla pinned (`SeedSpec`, hash por identidad), verifica sha256 antes de sellar,
|
||||
idempotente. Cubierto por 4 unit + 1 e2e de CLI (offline, `file://`).
|
||||
- **Stage 1** ◑ — userland mínimo cross-compilado. Hecho: recetas pinned `musl` 1.2.5 +
|
||||
`busybox` 1.36.1 (estáticas, zig cc), `hammer bootstrap stage1` que las construye con la
|
||||
semilla, ensambla el rootfs FHS (hardlink) y lo sella con un `RootfsHash` de contenido +
|
||||
init provisional (busybox/inittab). Falta: `hammerd` (receta Cargo, sourcing del plan M2) y
|
||||
sustituir el init por `arje`. El cross-compile real se valida en la VM (los e2e se saltan
|
||||
sin `.dev-fs`); el manifiesto anota la línea de Stage 1.
|
||||
`busybox` 1.36.1 (estáticas, zig cc) + `hammerd` (receta Cargo: repo pinned + deps
|
||||
vendoreadas en el fetch para build `--offline`); `hammer bootstrap stage1` las construye con
|
||||
la semilla, ensambla el rootfs FHS (hardlink) y lo sella con un `RootfsHash` de contenido +
|
||||
init provisional (busybox/inittab que arranca `hammerd`). Falta sólo sustituir el init por
|
||||
`arje`. El cross-compile real se valida en la VM (los e2e se saltan sin `.dev-fs`); el
|
||||
manifiesto anota la línea de Stage 1.
|
||||
- **Stage 2** ☐ — rebuild nativo dentro del rootfs y diff de hashes ⇒ auto-alojamiento
|
||||
bit-reproducible.
|
||||
- Reemplazar el init de Alpine por **tu init** (bus por pipes nativo) — habilita el `CRASHED`
|
||||
|
||||
@@ -120,16 +120,17 @@ No introduce mecanismo nuevo de build: encadena recetas y persiste el manifiesto
|
||||
// hammer-bootstrap
|
||||
pub fn stage0(seed: &SeedSpec, store: &Store) -> Result<ArtifactHash>; // ✅ toolchain semilla
|
||||
pub fn stage1(spec: &Stage1Spec, cfg: &BuildConfig, store: &Store)
|
||||
-> Result<RootfsHash>; // ◑ musl+busybox+init; hammerd ☐
|
||||
-> Result<RootfsHash>; // ◑ musl+busybox+hammerd; init arje ☐
|
||||
pub fn stage2(stage1: &RootfsHash, store: &Store) -> Result<VerifyReport>; // ☐ rebuild + diff
|
||||
pub fn all(seed: &SeedSpec, store: &Store) -> Result<BootstrapManifest>; // ☐
|
||||
```
|
||||
|
||||
`stage1` cross-compila `musl` + `busybox` con la semilla (no el zig del host), ensambla un rootfs
|
||||
FHS por hardlink y lo sella; el `RootfsHash` se deriva del **contenido** (hashes de componentes +
|
||||
init), no del árbol en disco, así que es reproducible. El PID 1 es el `init` de busybox vía
|
||||
`/etc/inittab` provisional. Falta `hammerd` (receta Cargo: ya construible por el lab, pendiente su
|
||||
sourcing pinned + vendor del plan M2) y la sustitución del init por `arje` (ADR 0007).
|
||||
`stage1` cross-compila `musl` + `busybox` + `hammerd` con la semilla (no el zig del host),
|
||||
ensambla un rootfs FHS por hardlink y lo sella; el `RootfsHash` se deriva del **contenido** (hashes
|
||||
de componentes + init), no del árbol en disco, así que es reproducible. El PID 1 provisional es el
|
||||
`init` de busybox vía `/etc/inittab`, que arranca `hammerd` como servicio respawn. `hammerd` es una
|
||||
receta Cargo (repo pinned + deps vendoreadas en el fetch para build `--offline`). Falta sólo
|
||||
sustituir el init provisional por `arje` (ADR 0007), que entrega el `CRASHED` real.
|
||||
|
||||
`SeedSpec { kind, version, url, sha256 }` es la identidad pinned de la semilla; `seed_hash()`
|
||||
deriva el `ArtifactHash` de `(kind, version, sha256)` — no del `url` ni del host, así que
|
||||
@@ -139,7 +140,7 @@ CLI (implementado lo de Stage 0; el resto pendiente):
|
||||
|
||||
```
|
||||
hammer bootstrap stage0 --url URL --sha256 HEX --version V [--seed zig|musl-cross-make] # ✅
|
||||
hammer bootstrap stage1 --seed-hash HASH [--seed zig] [--recipes DIR] # ◑ musl+busybox
|
||||
hammer bootstrap stage1 --seed-hash HASH [--seed zig] [--recipes DIR] # ◑ musl+busybox+hammerd
|
||||
hammer bootstrap stage2 --verify # ☐
|
||||
hammer bootstrap --all # las tres + reporte de reproducibilidad # ☐
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user