250 líneas de comentario en 151 scripts. Control verificado: el diff no toca NI UNA línea que no empiece por #, y la sintaxis de los 151 pasa. El barrido saltea heredocs y cadenas triples, y el guardián DISPARÓ 3 veces: las tres eran el MOTD que el script escribe DENTRO de la imagen construida — texto del producto, no comentario del script. Se cambiaron aparte y a propósito, que es rebranding, no limpieza. Y el hallazgo caro: casaba contra , que es el TARGET de tracing — o sea el module_path!, o sea el nombre del crate. La etapa 4 lo movió a y el script quedó casando NADA. No fallaba: imprimía cero atribuciones, indistinguible de un log sin problemas. Comprobado con el binario (RUST_LOG=info sobre zlib), no deducido. Ahora acepta las dos, y tiene que seguir aceptándolas porque los logs viejos en disco dicen la vieja. Además 14 rutas de módulo en docs, que el barrido anterior no tocó porque no es frontera de palabra.
45 lines
2.8 KiB
Bash
45 lines
2.8 KiB
Bash
# pid1-desde-store.sh — helper compartido por los scripts de imagen: poner en el rootfs fundido el
|
|
# arje-zero SELLADO, no el que venga arrastrado del directorio base.
|
|
#
|
|
# ── POR QUÉ EXISTE ──────────────────────────────────────────────────────────────────────────────
|
|
# `work/metal-rootfs` se armó a mano en la campaña de metal y quedó CONGELADO: su `arje-zero` era del
|
|
# 2026-06-19. Nadie lo regeneraba al re-sellar la receta, así que cada imagen de escritorio —GNOME,
|
|
# KDE, metal, dual— arrancaba con un PID1 de hace mes y medio **sin que nada lo dijera**.
|
|
#
|
|
# Así se comió un fix real: el `identity mismatch` del bus del fractal estaba arreglado río arriba
|
|
# (tawasuyu ce96cfa8d) y la VM seguía imprimiendo el mensaje viejo, porque el binario de la imagen no
|
|
# venía de la receta. Se pasaron sesiones creyendo que era un bug nuestro por arreglar.
|
|
#
|
|
# El síntoma es engañoso porque el directorio base es LEGÍTIMO para todo lo demás —busybox, firmware,
|
|
# el kernel EFI-stub, la estructura de /etc—: sólo la pieza que TAMBIÉN es receta se queda atrás, y
|
|
# justo esa es PID1. De ahí la regla:
|
|
#
|
|
# **si algo del rootfs tiene receta, la imagen lo toma del artefacto sellado, no de la copia
|
|
# congelada.**
|
|
#
|
|
# El artefacto se elige por `takana hash` sobre la receta —el que corresponde a la receta de HOY—, no
|
|
# por el más reciente del store: con dos artefactos del mismo paquete conviviendo, la fecha miente.
|
|
# Mismo criterio que ya usaban los inyectores de arje-logind-compat y arje-polkit-compat.
|
|
#
|
|
# ABORTA si no hay artefacto. Es deliberado: seguir con el PID1 congelado es exactamente el modo de
|
|
# falla que este helper existe para cerrar, y un aviso que no corta se lee como ruido.
|
|
#
|
|
# Uso: . scripts/lib/pid1-desde-store.sh ; inyectar_pid1 "$MERGED" "$BASE"
|
|
# Var: AZ=<dir del store> fuerza un artefacto concreto (diagnóstico).
|
|
|
|
inyectar_pid1() {
|
|
local merged="$1" base="${2:-}" az
|
|
echo "==> PID1: arje-zero desde el store${base:+ (no desde $base)}"
|
|
az="${AZ:-store/$(./target/release/takana --store store hash recipes/arje-zero.toml 2>/dev/null | tail -1 | sed 's/^b3://')-arje-zero}"
|
|
if [ -d "$az" ] && [ -x "$az/usr/bin/arje-zero" ]; then
|
|
install -Dm755 "$az"/usr/bin/arje-zero "$merged"/usr/bin/arje-zero
|
|
local viejo=""
|
|
[ -n "$base" ] && viejo=$(stat -c '%y' "$base"/usr/bin/arje-zero 2>/dev/null | cut -d' ' -f1)
|
|
echo " ✓ $(basename "$az" | cut -c1-12)${viejo:+ (el de $base era de $viejo)}"
|
|
else
|
|
echo " ✗ falta arje-zero sellado en store/ — la imagen usaría el PID1 CONGELADO${base:+ de $base}" >&2
|
|
echo " construílo: ./target/release/takana build recipes/arje-zero.toml --store store" >&2
|
|
return 1
|
|
fi
|
|
}
|