el tar de busybox no sirve para un rootfs ajeno — y takana ya no dibuja un pingüino

`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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
This commit is contained in:
Sergio
2026-09-14 21:46:08 +00:00
co-authored by Claude Opus 5
parent 93362fc21b
commit 0d0ab79092
5 changed files with 55 additions and 1 deletions
+18
View File
@@ -427,6 +427,24 @@ fn untar(archive: &Path, into: &Path) -> Result<()> {
[b'B', b'Z', b'h', ..] => Some("-j"), [b'B', b'Z', b'h', ..] => Some("-j"),
_ => None, // tar plano _ => 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"); let mut c = Command::new("tar");
if let Some(f) = flag { if let Some(f) = flag {
c.arg(f); c.arg(f);
+6
View File
@@ -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, # Lift verbatim de BASE_SYSTEM_PKGS (scripts/product-userland-from-repo.sh). De-Alpinizado y firmado,
# tandas base-system-1..3. # tandas base-system-1..3.
paquetes = [ 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 # `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 # 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, # por su `.pc` y, si no está, se saltan la instalación en silencio. Es un hueco de RUNTIME puro,
+9 -1
View File
@@ -16,6 +16,14 @@
# `product-rootfs`, que es el **baseline del selfhost**, por un fichero de cinco líneas. Como receta # `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. # 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 # ⚠ 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 # 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. # 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] [build.phases]
configure = "true" configure = "true"
compile = "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"
@@ -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 }
}
}
@@ -0,0 +1,9 @@
▟██████████▙
███████████║
▜████▛▀▜████▛
▐████▌
▐████▌
▐████▌
▐████▌
▐████▌
▗██████▖