diff --git a/scripts/bootstrap-devfs.sh b/scripts/bootstrap-devfs.sh index 53525d84..8afdc83b 100755 --- a/scripts/bootstrap-devfs.sh +++ b/scripts/bootstrap-devfs.sh @@ -79,7 +79,7 @@ mkdir -p "$DEVFS" "$TOOLS" "$CACHE" "$WORK" # `--from-scratch` recupera el camino viejo (minirootfs + apk). Es como se FABRICA una imagen nueva: # ./scripts/bootstrap-devfs.sh --from-scratch && ./scripts/lab-image.sh --crear # y después se pinea el sha nuevo acá abajo. Reconstruir el corpus es el precio de ese cambio. -LAB_IMAGE_SHA256="${LAB_IMAGE_SHA256:-8ae9792aa66477457bf2f69287838fb68707964904a81e5f70d08feed9ec9ca2}" +LAB_IMAGE_SHA256="${LAB_IMAGE_SHA256:-d1e341d5dd434a11e2290b0340069ce4a83563eac8e4481f379b4951b1162045}" if [[ $FROM_SCRATCH -eq 0 ]] && [[ ! -f "$ROOTFS/bin/busybox" ]]; then log "rootfs: trayendo la imagen pineada del lab" diff --git a/scripts/lab-image.sh b/scripts/lab-image.sh index 6035c595..221c5853 100755 --- a/scripts/lab-image.sh +++ b/scripts/lab-image.sh @@ -48,9 +48,31 @@ REMOTO="hammer/lab" log() { printf '\033[1;34m==>\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m✓\033[0m %s\n' "$*"; } +# ── POR QUÉ SE EXCLUYE `var/log/apk.log` (2026-09-05) ─────────────────────────────────────────── +# El tar es determinista a propósito (ver la cabecera), pero `apk` escribe en ese log una línea con +# la FECHA de cada operación. O sea: dos rootfs con exactamente los mismos paquetes, los mismos +# ficheros, los mismos modos y los mismos hardlinks empaquetan a shas DISTINTOS, sólo porque las +# instalaciones ocurrieron en momentos distintos. Eso rompe justo lo que este fichero existe para +# dar: si el sha no se puede reproducir desde un rootfs equivalente, no verifica nada. +# +# Medido el día que se añadió `lld` al lab: hub y worker quedaron con listas de ficheros IDÉNTICAS +# (9550 entradas), metadatos idénticos (modo, nlink, destino de symlink: 0 diferencias) y **una sola +# diferencia de contenido en todo el rootfs**: `var/log/apk.log`. Con esa exclusión los dos labs +# empaquetan igual y se puede DEMOSTRAR que la granja está sincronizada sin reemplazarle el rootfs a +# un worker que está construyendo. +# +# Se excluye el log y no todo `var/log` a propósito: cambio mínimo dirigido. `apk` lo recrea solo en +# la siguiente operación. +# +# COMPARAR DOS MÁQUINAS SIN REEMPLAZARLE EL ROOTFS A NINGUNA — corré esto en las dos y compará: +# tar --sort=name --mtime=@1 --owner=0 --group=0 --numeric-owner \ +# --exclude alpine/var/log/apk.log -C .dev-fs -cf - alpine | sha256sum +# Se compara el TAR y no el `.tar.zst`: el sha comprimido depende de la versión de zstd de cada +# máquina, así que dos labs idénticos con zstd distintos darían un falso desacuerdo. empaquetar() { # $1 = destino [ -d "$ROOTFS" ] || { echo "no existe $ROOTFS — corré bootstrap-devfs.sh primero" >&2; exit 1; } tar --sort=name --mtime=@1 --owner=0 --group=0 --numeric-owner \ + --exclude alpine/var/log/apk.log \ -C "$DEVFS" -cf - alpine \ | zstd -19 -T0 -q -o "$1" -f }