From 4fe604620065a9dd829f46e0d8655c5fd9563a2d Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 17 Sep 2026 15:19:22 +0000 Subject: [PATCH] =?UTF-8?q?store-gc:=20dec=C3=ADa=20=C2=ABespacio:=20super?= =?UTF-8?q?ados=20=20=C2=B7=C2=BB=20y=20=C2=ABlibres:=20Available=20?= =?UTF-8?q?=E2=86=92=20Available=C2=BB=20=E2=80=94=20dos=20bugs=20que=20sa?= =?UTF-8?q?len=20en=20takana?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrido por primera vez en la caja (una máquina busybox, no GNU), el recolector funcionó —337 artefactos borrados y verificados, 26,8 G liberados— pero sus dos NÚMEROS salieron vacíos: ==> espacio: superados · huérfanos ==> 337 artefactos borrados y VERIFICADOS (0 sobrevivientes) · libres: Available → Available 1. `du -sch --files0-from=-` es de GNU coreutils y busybox NO lo tiene ⇒ `espacio()` devolvía vacío. Un número que falta se lee como un número chico: sin él nadie puede decidir si vale la pena correrlo, que es justo para lo que está el dry-run. Ahora `xargs du -sk` + awk, que anda en los dos mundos. 2. `df -h /home` estaba CABLEADO, y el store casi nunca vive ahí: en gioser es un bind-mount del volumen y en una caja takana es `/store`, su propia partición. En la caja no hay `/home`, así que `tail -1` se quedó con la CABECERA y el resultado fue «Available → Available». Se mide `$STORE`. Medido de verdad con `df` a mano: /store pasó de 84,7 G usados (91 %) a 57,9 G (62 %) — 26,8 G liberados, 1657 → 1320 artefactos. Y el control que importa después de un gc: los 11 enlaces de `/usr/bin` que apuntan DENTRO del store siguen resolviendo y los 21 entes siguen corriendo. ⚠ Vale anotar la advertencia que el propio gc imprime y que en esa caja no se puede satisfacer: «sin .config legible ⇒ NO se protege ningún kernel por esta vía». El default (sólo superados) no toca lo vigente, pero `--huerfanos` en una máquina que arranca de su store hay que pensarlo dos veces. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/store-gc.sh | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/scripts/store-gc.sh b/scripts/store-gc.sh index b8048267..5742441f 100755 --- a/scripts/store-gc.sh +++ b/scripts/store-gc.sh @@ -156,8 +156,18 @@ if movidos: PYK espacio() { # du sobre una lista de dirs, tolerante a lista vacía + # ⚠ `du --files0-from=-` es de GNU coreutils y **busybox no lo tiene** (medido en la caja takana + # el 2026-09-17): devolvía vacío, así que el gc anunciaba «espacio: superados · huérfanos » y + # nadie podía saber si valía la pena correrlo. Un número que falta se lee como un número chico. + # `xargs du -sk` anda en los dos mundos; el total lo suma awk, en KiB, y se imprime humano. [ -s "$1" ] || { echo "0"; return; } - sed "s|^|$STORE/|" "$1" | tr '\n' '\0' | du -sch --files0-from=- 2>/dev/null | tail -1 | cut -f1 + sed "s|^|$STORE/|" "$1" \ + | xargs -d '\n' du -sk 2>/dev/null \ + | awk '{t+=$1} END { + if (t=="") {print "?"; exit} + if (t>1048576) printf "%.1fG\n", t/1048576; + else if (t>1024) printf "%.0fM\n", t/1024; + else printf "%dK\n", t }' } echo "==> espacio: superados $(espacio "$TMP/superados.txt") · huérfanos $(espacio "$TMP/huerfanos.txt")" @@ -176,7 +186,7 @@ fi MANIFIESTO="work/store-gc-$(date +%Y-%m-%dT%H%M%S).txt" mkdir -p work; cp "$OBJETIVO" "$MANIFIESTO" echo "==> manifiesto de lo borrado: $MANIFIESTO" -ANTES=$(df -h /home 2>/dev/null | tail -1 | awk '{print $4}') +ANTES=$(df -h "$STORE" 2>/dev/null | tail -1 | awk "{print \$4}") sed "s|^|$STORE/|" "$OBJETIVO" | xargs rm -rf # ── GUARDIÁN: NO reportar «borrado» sin comprobarlo ───────────────────────────────────────────── @@ -193,7 +203,10 @@ sed "s|^|$STORE/|" "$OBJETIVO" | xargs rm -rf QUEDAN=0 while IFS= read -r l; do [ -e "$STORE/$l" ] && QUEDAN=$((QUEDAN+1)); done < "$OBJETIVO" PEDIDOS=$(wc -l < "$OBJETIVO") -AHORA=$(df -h /home 2>/dev/null | tail -1 | awk '{print $4}') +# ⚠ `df -h /home` estaba CABLEADO, y el store casi nunca vive ahí: en gioser es un bind-mount del +# volumen y en una caja takana es `/store`, su propia partición. O sea que el «libres: antes → +# después» medía un sistema de ficheros que el gc ni toca. Se mide el del STORE. +AHORA=$(df -h "$STORE" 2>/dev/null | tail -1 | awk '{print $4}') if [ "$QUEDAN" -gt 0 ]; then echo "!! BORRADO INCOMPLETO: $QUEDAN de $PEDIDOS artefactos SIGUEN en $STORE." echo "!! No te fíes del espacio libre de abajo. Reintentá en PRIMER PLANO y volvé a verificar."