From 0d0ab79092b282f45bfb1158694f4eaf5df58af5 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 14 Sep 2026 21:46:08 +0000 Subject: [PATCH] =?UTF-8?q?el=20tar=20de=20busybox=20no=20sirve=20para=20u?= =?UTF-8?q?n=20rootfs=20ajeno=20=E2=80=94=20y=20takana=20ya=20no=20dibuja?= =?UTF-8?q?=20un=20ping=C3=BCino?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `qorpa pull` de un `.tar.zst` moría imprimiendo **la ayuda de busybox** y un exit 1: ni una palabra sobre `--zstd`, que es la opción que no entiende. El código ya elegía el descompresor por MAGIC y pasaba las flags correctas; lo que faltaba era un `tar` de verdad. Dos arreglos, y el segundo es de una línea: · `untar` comprueba `tar --version` y, si no es GNU, ABORTA nombrando la causa y el arreglo. Diez minutos de diagnóstico se vuelven una línea. · **`tar` (GNU) entra en `perfil.base`.** Estaba sellado desde hace meses y declarado en UN solo perfil (`escritorio-kde`). Es la lección de `foot` otra vez: el paquete existe y no viaja en la imagen que lo necesita. Ya había costado dos veces — la caja tampoco podía desempacar su propio LAB por lo mismo. Y el logo: fastfetch dibujaba **el pingüino genérico de Linux** porque elige por el `ID` de os-release y no conoce `takana`. Ahora la receta `os-release` publica también `/usr/share/takana/logo.txt` (un martillo, que es lo que significa el nombre en quechua) y `/etc/xdg/fastfetch/config.jsonc` — la config GLOBAL por XDG, no la de un usuario. Van en la receta de la IDENTIDAD y no en la de fastfetch a propósito: mañana el que dibuje puede ser otro programa y el logo seguirá siendo el mismo fichero. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn --- crates/takana-cli/src/qorpa.rs | 18 ++++++++++++++++++ docs/state/targets.toml | 6 ++++++ recipes/os-release.toml | 10 +++++++++- .../tree/etc/xdg/fastfetch/config.jsonc | 13 +++++++++++++ .../os-release/tree/usr/share/takana/logo.txt | 9 +++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 recipes/os-release/tree/etc/xdg/fastfetch/config.jsonc create mode 100644 recipes/os-release/tree/usr/share/takana/logo.txt diff --git a/crates/takana-cli/src/qorpa.rs b/crates/takana-cli/src/qorpa.rs index 8ade2f62..08da0059 100644 --- a/crates/takana-cli/src/qorpa.rs +++ b/crates/takana-cli/src/qorpa.rs @@ -427,6 +427,24 @@ fn untar(archive: &Path, into: &Path) -> Result<()> { [b'B', b'Z', b'h', ..] => Some("-j"), _ => None, // tar plano }; + // ⚠ EL `tar` DE BUSYBOX NO SIRVE ACÁ, Y SU FALLO NO LO DICE. Medido en la caja de producción: + // `qorpa pull` de un rootfs `.tar.zst` moría imprimiendo **la ayuda de busybox** y un + // `exit 1` — ningún mensaje sobre `--zstd`, que es la opción que no entiende. Comprobarlo acá + // convierte diez minutos de diagnóstico en una línea, y nombra el arreglo: `tar` (GNU) está + // sellado en el corpus desde hace meses; lo que faltaba era declararlo en el perfil. + let es_gnu = Command::new("tar") + .arg("--version") + .output() + .map(|o| String::from_utf8_lossy(&o.stdout).contains("GNU tar")) + .unwrap_or(false); + if !es_gnu { + bail!( + "el `tar` de este sistema no es GNU tar (parece busybox): no entiende `--zstd`, \n\ + `-p` ni `--delay-directory-restore`, que hacen falta para desempacar un rootfs ajeno.\n\ + Instalá el paquete `tar` — está sellado en el corpus; si esta es una imagen de takana, \n\ + declaralo en el perfil." + ); + } let mut c = Command::new("tar"); if let Some(f) = flag { c.arg(f); diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 48e5c135..c9e57158 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -24,6 +24,12 @@ descripcion = "userland foundational C: la distro arranca y se usa (shell, VCS, # Lift verbatim de BASE_SYSTEM_PKGS (scripts/product-userland-from-repo.sh). De-Alpinizado y firmado, # tandas base-system-1..3. paquetes = [ + # `tar` (GNU, 2026-09-14): el `tar` de busybox **no entiende `--zstd`** ni `-p` ni + # `--delay-directory-restore`. Ya costó dos veces: la caja no podía desempacar su propio LAB, y + # `qorpa pull` de un rootfs ajeno moría imprimiendo la ayuda de busybox sin nombrar la causa. + # Estaba sellado desde hace meses y en UN solo perfil (`escritorio-kde`) — la lección de `foot` + # otra vez: el paquete existe, y no viaja en la imagen que lo necesita. + "tar", # `bash-completion` (2026-09-09): el tabulador de las herramientas del sistema. Entra como raíz # porque NADIE lo alcanza por deps de build — los paquetes que instalan completados sólo preguntan # por su `.pc` y, si no está, se saltan la instalación en silencio. Es un hueco de RUNTIME puro, diff --git a/recipes/os-release.toml b/recipes/os-release.toml index 1aad2292..640c69b5 100644 --- a/recipes/os-release.toml +++ b/recipes/os-release.toml @@ -16,6 +16,14 @@ # `product-rootfs`, que es el **baseline del selfhost**, por un fichero de cinco líneas. Como receta # entra por perfil, se edita sin tocar el bootstrap y su radio es cero. # +# ══ Y EL LOGO, QUE ES PARTE DE LA IDENTIDAD ════════════════════════════════════════════════════ +# `fastfetch` dibujaba **el pingüino genérico de Linux**: elige el logo por el `ID` de `os-release` +# y no conoce `takana`. Van juntos acá y no en la receta de fastfetch porque lo que se declara es la +# identidad del sistema —nombre, URL, color, logo—, no la configuración de una herramienta: mañana +# el que dibuje puede ser otro programa y el logo seguirá siendo el mismo fichero. +# · `/usr/share/takana/logo.txt` — un martillo, que es lo que significa el nombre en quechua +# · `/etc/xdg/fastfetch/config.jsonc` — la config GLOBAL (XDG), no la de un usuario +# # ⚠ SIN VERSIÓN NI FECHA, a propósito. Un `VERSION_ID` con la fecha del build haría que este # artefacto —y con él la clausura de toda imagen que lo lleve— cambiara de hash cada día sin que # nada haya cambiado. La versión de una distro de árbol único es el hash de su imagen, que ya existe. @@ -35,4 +43,4 @@ flags = [] [build.phases] configure = "true" compile = "true" -install = "mkdir -p /out/etc && cp /src/etc/os-release /out/etc/os-release && mkdir -p /out/usr/lib && ln -sf ../../etc/os-release /out/usr/lib/os-release" +install = "mkdir -p /out/etc /out/usr/lib && cp -a /src/etc/. /out/etc/ && cp -a /src/usr/. /out/usr/ && ln -sf ../../etc/os-release /out/usr/lib/os-release" diff --git a/recipes/os-release/tree/etc/xdg/fastfetch/config.jsonc b/recipes/os-release/tree/etc/xdg/fastfetch/config.jsonc new file mode 100644 index 00000000..be1b0ba6 --- /dev/null +++ b/recipes/os-release/tree/etc/xdg/fastfetch/config.jsonc @@ -0,0 +1,13 @@ +// Config global de fastfetch para takana. +// +// Sin esto, fastfetch dibuja el pingüino genérico de Linux: elige el logo por el `ID` de +// `/etc/os-release` y no conoce `takana`. El logo es un fichero nuestro — un martillo, que es lo +// que significa el nombre en quechua. +{ + "logo": { + "type": "file", + "source": "/usr/share/takana/logo.txt", + "color": { "1": "36" }, + "padding": { "top": 1, "right": 3 } + } +} diff --git a/recipes/os-release/tree/usr/share/takana/logo.txt b/recipes/os-release/tree/usr/share/takana/logo.txt new file mode 100644 index 00000000..4cbda041 --- /dev/null +++ b/recipes/os-release/tree/usr/share/takana/logo.txt @@ -0,0 +1,9 @@ + ▟██████████▙ + ███████████║ + ▜████▛▀▜████▛ + ▐████▌ + ▐████▌ + ▐████▌ + ▐████▌ + ▐████▌ + ▗██████▖