gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1385Shell 122Rust 77Markdown 682241 Definiciones

bootstrap: empaquetar el builder con cpio --owner=root:root (copy-up de overlay)

El run en la VM, ya con overlay cargado, fallaba en `bwrap: Can't mkdir /opt/zig:
Permission denied`. Diagnóstico (el rootfs resultó ser tmpfs, no ramfs, así que
no era el fs): los ficheros del builder viajaban con el uid del que lo armó
(1000). En la VM corren como root (0); el userns de bwrap mapea sólo 0→0, así que
el 1000 queda SIN mapear y el copy-up de overlay no puede preservar el owner del
/opt copiado ⇒ EACCES. En el host funciona porque bwrap mapea 1000→0.

Fix: empaquetar el initramfs con `cpio --owner=root:root` (runbook §8c). Revierte
el staging-a-tmpfs (era una hipótesis ramfs equivocada); rebuild-stage1 vuelve a
HAMMER_ROOTFS=/toolchain y documenta el requisito de ownership. 28 tests verdes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

890a37b473bc335a574e127936ef46a94a714d93 · por Sergio · (hace 4 meses) · padre cf1599562 · ver el árbol en este commit

Delta semántico · 1

crates/hammer-bootstrap/src/lib.rs

2 archivos · +7 −1

diff --git a/crates/hammer-bootstrap/src/lib.rs b/crates/hammer-bootstrap/src/lib.rs
index 4ed2da55..25b20e15 100644
--- a/crates/hammer-bootstrap/src/lib.rs
+++ b/crates/hammer-bootstrap/src/lib.rs
@@ -512,6 +512,9 @@ export PATH=/toolchain/usr/bin:/toolchain/usr/sbin:/toolchain/bin:/toolchain/sbi
 # build (bwrap --tmp-overlay) lo exige ⇒ ENODEV sin esto. Lo cargamos del toolchain (insmod=kmod,
 # vermagic del kernel destino). Idempotente: si ya está, insmod falla y lo ignoramos.
 insmod /toolchain/lib/overlay.ko 2>/dev/null || true
+# NOTA: el initramfs debe empaquetarse con `cpio --owner=root:root`. Si los ficheros del toolchain
+# quedan con el uid del que armó el builder (p. ej. 1000), ese uid no está mapeado en el userns de
+# bwrap (que mapea sólo 0→0) y el copy-up de overlay falla con EACCES al crear /opt/zig. Ver §8c.
 export HAMMER_ROOTFS=/toolchain      # el sandbox de build: el toolchain (variante a, desde Alpine)
 export HAMMER_WORK=/work
 export HAMMER_CACHE=
diff --git a/docs/runbooks/stage1-vm-boot.md b/docs/runbooks/stage1-vm-boot.md
index 0a165b09..34803326 100644
--- a/docs/runbooks/stage1-vm-boot.md
+++ b/docs/runbooks/stage1-vm-boot.md
@@ -301,7 +301,10 @@ Sin `--work-cache`, el rebuild fetchea por red (la seed card trae `networking: f
 `scripts/boot-builder-vm.sh` encapsula esto (kernel, MEM, KVM configurables):
 
 ```sh
-( cd work/builder-rootfs && find . -print0 | cpio --null -o -H newc | gzip -1 ) > work/builder.cpio.gz
+# --owner=root:root es OBLIGATORIO: si los ficheros viajan con el uid del que armó el builder
+# (p. ej. 1000), ese uid no está mapeado en el userns de bwrap (mapea 0→0) y el copy-up de overlay
+# del sandbox falla con EACCES (`Can't mkdir /opt/zig: Permission denied`).
+( cd work/builder-rootfs && find . -print0 | cpio --null -o -H newc --owner=root:root | gzip -1 ) > work/builder.cpio.gz
 ./scripts/boot-builder-vm.sh        # o el qemu crudo:
 qemu-system-x86_64 -m 6144 -no-reboot -nographic -cpu Broadwell \
     -kernel /boot/vmlinuz-linux -initrd work/builder.cpio.gz -append "console=ttyS0 rdinit=/sbin/init"