Etapa G: fixes del kit de granja distribuida (validados en VPS Hetzner real)

Tres frentes que aparecieron al provisionar un CCX13 (Ubuntu 24.04) de verdad:
- bootstrap-devfs §3b: el loader musl-256-keys ahora DETECTA la versión del
  rootfs (apk db) en vez de hardcodear 1.2.5. Alpine edge avanzó a musl 1.2.6 ⇒
  un loader 1.2.5 vs coreutils 1.2.6 da `renameat2: symbol not found` → chmod
  roto en el sandbox → el wrapper zig-cc no queda +x → EACCES. case con sha de
  1.2.5 y 1.2.6, die si aparece una nueva.
- vps-setup §2b: compila bubblewrap 0.11.2 si el de la distro no soporta
  --overlay-src (Ubuntu 24.04 trae 0.9.0 sin overlayfs; el sandbox lo necesita).
- farm-sync: excluye /.scratch (44G de fuentes mrustc/rustc) + *.png/content*
  del rsync al worker (casi copia 44G de más).

Smoke test en el VPS: builds compilan código real (pasan cc/chmod), rustc 2
cores al 93%, RAM holgada. Worker funcional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 04:35:57 -04:00
co-authored by Claude Opus 4.8
parent d949d10dcd
commit f9a60ed469
3 changed files with 32 additions and 4 deletions
+15 -3
View File
@@ -202,11 +202,23 @@ fi
# loader. ABI-compat (mismo musl 1.2.5): gcc/make/etc. siguen corriendo. Seguro para of_tree: el
# loader runtime de las tools no afecta los bytes que emiten; el 4/4 es estático contra hammer-musl.
# Idempotente: si ya existe el backup .orig128, no rehace nada.
# CRÍTICO: el loader reconstruido DEBE ser de la MISMA versión de musl que el rootfs (Alpine edge
# es rodante: pasó de 1.2.5 a 1.2.6). Si difieren, los coreutils del rootfs (linkeados contra la
# versión de edge) no hallan símbolos nuevos en el loader viejo (p.ej. `renameat2: symbol not
# found` con loader 1.2.5 vs coreutils 1.2.6) ⇒ chmod/cat/rm rotos dentro del sandbox y los builds
# fallan al ejecutar el wrapper zig-cc (EACCES). Por eso DETECTAMOS la versión del rootfs.
MUSL_LOADER="$ROOTFS/lib/ld-musl-x86_64.so.1"
if [[ $SKIP_APK -eq 0 && ! -f "$MUSL_LOADER.orig128" ]]; then
log "musl: reconstruyendo loader del toolchain con PTHREAD_KEYS_MAX=256 (frente rust)"
MUSL_VER=1.2.5
MUSL_SHA=a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4
# versión de musl instalada en el rootfs (apk db): "1.2.6-r2" → "1.2.6"
MUSL_VER="$(awk '/^P:musl$/{f=1} f&&/^V:/{sub(/-.*/,"",$0);print substr($0,3);exit}' \
"$ROOTFS/lib/apk/db/installed" 2>/dev/null)"
MUSL_VER="${MUSL_VER:-1.2.6}"
case "$MUSL_VER" in
1.2.5) MUSL_SHA=a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4 ;;
1.2.6) MUSL_SHA=d585fd3b613c66151fc3249e8ed44f77020cb5e6c1e635a616d3f9f82460512a ;;
*) die "musl $MUSL_VER del rootfs sin sha256 conocido — agregalo al case (bootstrap-devfs.sh §3b)" ;;
esac
log "musl: reconstruyendo loader del toolchain $MUSL_VER con PTHREAD_KEYS_MAX=256 (frente rust)"
MWORK="$WORK/musl256"; rm -rf "$MWORK"; mkdir -p "$MWORK"
curl -fsSL -o "$MWORK/musl.tar.gz" "https://musl.libc.org/releases/musl-$MUSL_VER.tar.gz"
echo "$MUSL_SHA $MWORK/musl.tar.gz" | sha256sum -c - >/dev/null || die "musl tarball sha256 mismatch"
+2 -1
View File
@@ -22,7 +22,8 @@ SSH="ssh -i $SSH_KEY -o StrictHostKeyChecking=accept-new"
echo "==> 1. subiendo código + cola al worker ($VPS:$REMOTE)"
rsync -az --delete -e "$SSH" \
--exclude /work --exclude /store --exclude '/store-*' --exclude /target \
--exclude /dist --exclude /.dev-fs --exclude /.git \
--exclude /dist --exclude /.dev-fs --exclude /.git --exclude /.scratch \
--exclude '*.png' --exclude '/content*' \
./ "$VPS:$REMOTE/"
echo "==> 2. bajando artefactos sellados del worker"
+15
View File
@@ -29,6 +29,21 @@ kernel.apparmor_restrict_unprivileged_userns=0
EOF
sysctl --system >/dev/null 2>&1 || true
echo "==> 2b. bubblewrap con soporte overlay (el de la distro suele ser viejo/sin overlayfs)"
# El sandbox del lab usa `bwrap --overlay-src --tmp-overlay`; bubblewrap <0.10 (p.ej. el 0.9.0 de
# Ubuntu 24.04) responde "Unknown option --overlay-src". Compilamos 0.11.2 a /usr/local/bin (gana
# el PATH de systemd) si el instalado no lo soporta.
if ! bwrap --help 2>&1 | grep -q overlay-src; then
apt-get install -y -q meson ninja-build libcap-dev
BWV=0.11.2
curl -sL "https://github.com/containers/bubblewrap/releases/download/v${BWV}/bubblewrap-${BWV}.tar.xz" -o /tmp/bwrap.tar.xz
( cd /tmp && rm -rf "bubblewrap-${BWV}" && tar xf bwrap.tar.xz && cd "bubblewrap-${BWV}" \
&& meson setup _build --prefix=/usr/local -Dman=disabled -Dtests=false >/dev/null \
&& ninja -C _build >/dev/null && ninja -C _build install >/dev/null )
hash -r
echo " bwrap actualizado: $(/usr/local/bin/bwrap --version)"
fi
echo "==> 3. swap 16G (8GB de RAM es justo para builds Rust con JOBS=2)"
if ! swapon --show 2>/dev/null | grep -q /swapfile; then
fallocate -l 16G /swapfile 2>/dev/null || dd if=/dev/zero of=/swapfile bs=1M count=16384 status=none