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>
This commit is contained in:
Sergio
2026-06-11 15:29:17 +00:00
co-authored by Claude Opus 4.8
parent cf15995623
commit 890a37b473
2 changed files with 7 additions and 1 deletions
+3
View File
@@ -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=
+4 -1
View File
@@ -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"