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 1389Shell 137Markdown 80Rust 802602 Definitions

fix(armador): comprobar el montaje de LOCAL ANTES de componer, no despues de 3,9 GiB

Hoy, con /work sin un byte libre, puse LOCAL=/store/.rootfs-local para poder armar. El armado
compuso los 3899 MiB de los dos perfiles, aplico el bit de privilegio, libero los symlinks del
piso, compuso la semilla... y recien entonces murio:

  ✗ EXDEV: no se puede ENLAZAR de "/store/.rootfs-local/mirada-usb" a "work/.instalador-initramfs-stage"

El empaquetador enlaza el arbol local a su stage por HARDLINK, y un hardlink no cruza montajes.
Y el armador YA LO ADVERTIA, unas lineas mas abajo del sitio donde puse la variable: «el arbol
tiene que quedar en el MISMO montaje que el stage del ensamblado». O sea que la informacion estaba
escrita, la lei, y no me freno. Una advertencia en prosa no es una guarda — ni para el que la
escribio. Esto la convierte en una comprobacion que corre antes de componer el primer byte, y que
al negarse dice cuanto espacio libre hay en work/ para que la salida sea obvia.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

4b2e8ff08a6ee701519fcfaa20234c02af142e93 · by sergio · (6 d ago) · parent 4793f5178 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

1 files · +21 −1

diff --git a/scripts/instalador-variantes.sh b/scripts/instalador-variantes.sh
index 38e4d86a..7c530b55 100755
--- a/scripts/instalador-variantes.sh
+++ b/scripts/instalador-variantes.sh
@@ -106,7 +106,27 @@ PISO="${PISO:-$(ls -dt "$STORE"/*-product-rootfs 2>/dev/null | head -1)}"
 [ -n "${PISO:-}" ] && [ -d "$PISO" ] || { echo "no encuentro un product-rootfs (set PISO=)" >&2; exit 1; }
 echo "==> piso de arranque: $PISO"
 echo "==> kernel: $KERNEL"
-mkdir -p "$SALIDA" "$COMPOSICION" "$LOCAL"
+mkdir -p "$SALIDA" "$COMPOSICION" "$LOCAL" work
+
+# ── LA GUARDA DEL MONTAJE, antes de componer un solo byte ─────────────────────────────────────────
+# El empaquetador (`instalador-paquete.sh`, `instalador-usb.sh`) enlaza el árbol local a su stage
+# `work/.instalador-initramfs-stage` por HARDLINK, y un hardlink no cruza montajes. Si `LOCAL` está
+# en otro filesystem, el armado compone los ~3,9 GiB de los dos perfiles, aplica el bit de
+# privilegio, compone la semilla, y RECIÉN ENTONCES muere con `EXDEV`.
+#
+# Medido el 2026-10-15: con `/work` sin espacio puse `LOCAL=/store/.rootfs-local` y perdí veinte
+# minutos de composición por esto. Y la advertencia existía —«el árbol tiene que quedar en el MISMO
+# montaje que el stage del ensamblado», unas líneas más abajo— o sea que la información estaba
+# escrita y no frenó a nadie, ni al que la escribió. Una prosa no es una guarda.
+_dev_local=$(stat -c%d "$LOCAL" 2>/dev/null || echo desconocido-local)
+_dev_stage=$(stat -c%d work 2>/dev/null || echo desconocido-stage)
+if [ "$_dev_local" != "$_dev_stage" ]; then
+	echo "✗ LOCAL=$LOCAL está en OTRO filesystem que work/ (dev $_dev_local contra $_dev_stage)." >&2
+	echo "  El empaquetador enlaza el árbol local a su stage por hardlink, así que esto fallaría con" >&2
+	echo "  EXDEV después de componer varios GiB. Poné LOCAL en el mismo montaje que work/, o libera" >&2
+	echo "  espacio ahí: \`df -h work\` dice $(df -h work 2>/dev/null | awk 'NR==2{print $4}') libres." >&2
+	exit 1
+fi
 
 compone() {   # <variante> <medio> → deja el árbol local en $LOCAL/<variante>-<medio>
     _cv="$1"; _cm="$2"