CRUX, una travesía de 26 días y contando.


Reconstrucción de 
un "largo y ventoso camino" de un hombre y una máquina con CRUX: un instalador modular KISS para CRUX Linux.

Let me know the way: crónica cronológica del período 1 al 23 de agosto de 2026.

Hugo Napoli, Entropía binaria.


Esta crónica se reconstruye a partir de 8 hilos simultáneos de trabajo de Hugo Napoli sobre CRUX Linux, desarrollados a lo largo de todo el mes de agosto de 2026. Una línea de tiempo actúa como columna vertebral. Sobre ella penden aciertos, decisiones de arquitectura, problemas graves, responsabilidades ajenas, sano entusiasmo y enorme amor y esfuerzo genuino por utilizar y compartir una de las piezas más nobles que el software libre haya podido parir: un gran sistema operativo que invita a que lo arme uno mismo, micropieza por micropieza, y cuya invitación linuxera le llega al compañero usuario de software realmente libre, justo en el mismo momento en el que, por ejemplo, un gran mecánico podría estar dándose cuenta de que jamás armó su propio automóvil, pero que siempre ha vivido reparándole a otros, con dedicación profesional, lo que nadie repara.

Esta crónica con mixtura de andanza y travesía, está escrita en gran parte en tercera persona, porque para esto "se evaluó" que era la mejor posibilidad y el mejor escenario: de este modo la libertad poética es mayor, a la vez que la distancia emocional también. Porque los procesos técnicos complejos están cargados de emociones. Siempre.

Vas a encontrarte con partes demasiado técnicas y otras mucho más narrativas. Si te copa, hacé el esfuerzo y leé todo, intentando comprender de qué se está hablando. Fue enriquecedor haberlo transitado, y quizás para ti, querido lector, querido amigo, también lo sea al leer este texto. 


Los 2 protagonistas y sus responsabilidades.

Antes de la cronología, conviene fijar quién puso qué, porque esto fue titánico y fue de a 2, un hombre y una máquina. Porque en Entropía sentimos que es un orgullo y un privilegio trabajar con una máquina de las prestaciones que hoy nos brindan los LLM, y más cuando el fin es noble: hacer lo que nadie hizo antes, y además compartirlo.

Hugo (el hombre). Intervención directa en hardware real, dmesgs, logs, criterio férreo e innegociable de qué se quería y qué no, filosofía KISS, X11, no-Wayland, no-systemd, no-PipeWire, no-Gnome, no-blobs innecesarios.
También la decisión de arquitectura en cada milimétrica, cuidada y recelosa bifurcación, y - esto es central - la exigencia de verificar exhaustiva y empíricamente antes de dar nada por cierto. Leyó cada respuesta en vez de copiar y pegar recetas de una máquina, para no volverse él mismo máquina de la máquina. Cazó bichos, corrigió errores de diagnóstico, se hizo cargo de su propia derrota técnica así como también de cada aprendizaje, incluso estando muchas veces agotado, estresado, "caliente", siempre sin perder el norte: lo comunitario, lo que no solo "está bien PARA MÍ".

Claude (la máquina). Investigó y puso los símbolos de kernel, las reglas de dependencias, las búsquedas, los diffs quirúrgicos en el estilo BASH de Hugo. Se equivocó varias veces con hipótesis presentadas con demasiada confianza, y fue detenida, corregida, reencauzada, con precisión, experiencia y donde cupo, experticia humana acumulada.

Pero "responsabilidades", también significa otra cosa en esta crónica: el registro de las trabas estructurales evitables que cargaron sobre el proyecto gentes que recitaron mal su parte. Eso tiene su propia sección al final ("El acta"), y aparece señalado en la línea de tiempo cada vez que corresponde. Zapatero, a tus zapatos, seas Torvalds o Gates. Con la verdad no se ofende ni se teme, y no se le hace el caldo gordo a nadie ni se barre para abajo de la alfombra. Como militantes, debemos denunciar lo que dentro del software libre funcione mal, o estamos siendo títeres de otros ante gente que nos escucha sincera y atentamente y que nos regala su confianza. ¿Hay algo más preciado que eso? ¿Algo que cuidar más? Para nosotros, este es - y será siempre - el fin de la discusión.


El origen antes del origen (julio de 2026).

La travesía de CRUX no empieza ni ahora ni con CRUX, increíblemente. Ya se venía peleando contra un mismo enemigo estructural, pero en otro frente: Barry (el metabuscador en Go de entropIA criolla, la IA local del laburante, que podés encontrar y descargar gratuitamente desde acá) se daba de frente contra "Anubis", el "proof-of-work anti-bots" que había vuelto inservibles las instancias públicas de SearXNG, haciendo que respondiesen "0 de 74". Con ese mismo "Anubis" nos íbamos a volver a cruzar, salvo que esta vez con otro compañero (CRUX), pero días después. El monstruo convocado conscientemente y a sabiendas por terceros (es importante resaltar que no solo es utilizado por mega corporaciones como Google) ya estaba presentado antes de que empezara la presentación por orden alfabético del elenco completo de los actores de esta, en parte, obra de terror.


LÍNEA DE TIEMPO.

1° de agosto de 2026, el verdadero punto de partida.

El origen de todo, en realidad no fue un capricho, sino un acto de responsabilidad. Tim "beerman" Biermann, uno de los desarrolladores más activos de CRUX, vio la saga de videos sobre CRUX producidas en Entropía, junto con las 2 guías escritas (CRUX y CRUX EX), las cuales incluyó en la web oficial y podés ver acá ( https://crux.nu/Main/Links ) y señaló, con muy buena onda (con ese apodo no podía proceder de mala onda nunca), un error común a todas: las instalaciones de Entropía terminaban utilizando a rEFInd para el arranque del sistema, cuando en realidad, CRUX, no lo necesita. No lo dijo con amenaza ("cambialo o borro tus links"), lo dijo como un par. Pero sobre todo, como consejo sabio de un buen tipo.

Se dejó pasar el tiempo, se extravió el e-mail en donde estaba dicha información (1), y ahora se quiso saldar esa deuda pendiente con CRUX y con Tim, corrigiendo esto y generando, además, un aporte útil que en lo posible elevara la apuesta y fuese importante.

Y acá viene una anécdota dolorosa, que fue el verdadero combustible para poder arrancar de una vez todos los motores a su máxima potencia. Y en esto, Ni Tim ni CRUX tuvieron nada que ver.

Para quienes poseemos el gusto por compartir -el mundo del software libre está repleto de gente así-, uno disfruta mucho esa situación. Uno no hace cosas "para compartirlas", como si fuese una misión en la vida. Uno hace cosas, y luego, si cabe, las comparte. Y como sabe que terminará compartiendo lo bueno, no cualquier cosa, cada cosa que se lleva entre manos a algún lugar para ser compartida, es un tesoro para quien genuinamente posee ese sentimiento: "voy a entregar esta gema altamente preciada por mí a una comunidad, o a un amigo, o a alguien que creo que de verdad lo necesita... tanto como yo lo necesito". Porque esta es la idea. No se trata de hacer cualquier cosa y creernos sénecas que todo lo que producimos va a iluminar, a importar o a ser necesario o útil.
Cuando trabajás durante semanas, con ahínco, con seriedad, con pasión y responsabilidad sobre algo específico... Cuando sabés que ese algo es complejo y que lo estás comprendiendo, que se te van develando sus misterios a cada paso que das en tus investigaciones y prácticas... Cuando avanzás a paso lento pero firme... y cuando culminás la etapa exitosamente, es cuando te decís... ¿y ahora, en dónde hará honores esta querida pieza a la que tanta dedicación le puse, tanto tiempo y esfuerzo me llevó, y a la cual sé que hay gente que la quiere? Eso fue lo que representó "TDE" (Trinity Desktop Environment) para mí.

El proyecto se llamó "TDEntropía", y se basó en llevar TDE a Void Linux, y lo podés encontrar acá, junto con su complemento "tYb" (Trinity y Bambino) y un panel de control 100% funcional hecho en estilo "dialog" (TDE_YaST).

La comunidad de Entropía fue siguiendo los avances, con respeto, colaborando, aconsejando, esperando el resultado. Como siempre. Es la barra que sabés que no te va a dejar tirado. Uno va construyendo y programando, apoyándose en la confianza de compañeros que se sabe que están siempre ahí. Al terminar y hacerse la pregunta "¿y ahora?", en lo primero que se piensa, es en "en el epicentro mismo", el cual, en este caso, era en la comunidad de Void Linux, sistema desde el cual por ahora se maneja todo lo de Entropía y lo de Hugo.

Se publicó en el reddit de Void Linux este arduo trabajo.
Duró cientos de visualizaciones, algunos "likes" y... menos de 2 minutos reloj, siendo eliminado sin miramientos por alguien del equipo de moderación.

Enlace (caduco) a la publicación: https://www.reddit.com/r/voidlinux/comments/1v9y21s/contenido_eliminado_por_la_moderaci%C3%B3n/ 

Imagen del (in)suceso:

Ante el debido y estupefacto reclamo, no se recibió más que (más) distancia y frialdad (aún), marcándose notoriamente la distancia que media entre algunos desarrolladores, o moderadores, o ambas cosas, y los programadores que queremos contribuír no con ellos, sino con toda una comunidad entera, pero que sabemos bien que el primer filtro empieza con quienes están al frente de la custodia... Custodia que a veces se pasa de horno.

Pero hay otro combustible que nos mueve desde siempre: el anticorporativismo, sobre todo el que está tiñendo a todo Linux y al cual no es posible evitar ni esquivar sin conocimiento y esfuerzo, y que es aquél que promueve, por ejemplo, a una pieza inmadura y eternamente impresentable como WayLand por sobre el bastión de bastiones, XOrg. O la que profesa que "systemd" llegó "en un inicio" para "mejorar el arranque de los sistemas Linux", mientras que, ni llegó para eso, ni lo logró después de bastante más de una década. Y se podría seguir con las particularidades de la comunidad de Gnome y con el propósito y la estética de sus productos, con PipeWire, y ya de paso, con IBM, RedHat, Canonical con Ubuntu y sus polémicas re-creaciones. Pero ya es más que suficiente, mucho más que para un simple buen entendedor. Y que se entienda bien: Entropía no condena ni discrimina al usuario de a pie, sino a la idea y a quienes la impulsan. Que vos uses Ubuntu, Wayland, Snaps, Flatpaks, Gnome, a Entropía no le interesa ni tampoco le interesa "corregirte". Lo que nos interesa es que te llegue nuestra palabra (cuando se trata de conversaciones con linuxeros o BSDeros, le hablamos a un 1% dentro de un 6% y lo tenemos claro) y que pienses por ti mismo.

De este caldo de cultivo nació todo.

La cadena fue:

1. Como las guías de Entropía (videos, posts) utilizaban rEFInd erróneamente, y...
2. una de ellas (la más general, profusa y global) fue actualizada, reemplazando rEFInd por GRUB... Y como GRUB en UEFI es en donde más suelen aparecer trabas, y para CRUX es maquinaria de sobra, y esto no era lo mejor...
3. Se trabajó en el método correcto, que era el que el desarrollador comentaba, y que supusimos que era "EFI Stub puro", en donde el kernel es iniciado por la propia UEFI, de manera directa desde una entrada UEFI con "efibootmgr", sin "bootloader" intermedio.

Y acá ya se estaba compilando al kernel de CRUX con "CONFIG_EFI_STUB=y", habiendo construido ya medio camino hecho sin ser conscientes de esto.

Decisión de arquitectura #1: no corregir solo la guía
, sino construir un instalador automatizado ("InstaCrux.sh") que hiciera la instalación entera por EFI Stub, para compartirlo y pulirlo con/en la comunidad de Entropía primeramente y presentárselo a los desarrolladores luego de estar medianamente maduro el proceso, es decir, pasar de "corregir un post" a "construir infraestructura socialmente útil".

Acierto importante #1: entender que el problema del bootloader no se resolvía eligiendo otro gestor, sino eliminando la capa entera. El método más simple era además el más robusto. KISS en estado puro.

Primeros días de agosto: InstaCrux.sh, el instalador base.

Este es el hilo troncal más largo de toda esta travesía plagada de cientos de anotaciones. Acá el instalador base fue tomando su forma definitiva al quedar demostrado que podía particionar, formatear, compilar el kernel, instalar software base, configurar el teclado, la zona horaria y arrancar por EFI Stub... Y acá también es en donde empezaron a aparecer los primeros golpes serios. 

Los hitos dentro de esta etapa.

Problema grave #1: el "kernel panic" de la microSD y el gestor de NVRAM.

Al pasar de la máquina virtual al hardware real (una laptop Acer Aspire A325-42, AMD Barcelo/Ryzen, con CRUX en una microSD), el sistema entraba en pánico: "VFS: Unable to mount root fs". El kernel buscaba la raíz en "/dev/sda2" pero no la encontraba a tiempo.

El diagnóstico se hizo en frío, desde Void, montando a la partición de CRUX sin necesidad de "bootearla". En varias ocasiones, no fue necesario arrancar el sistema roto para poder trabajarlo.
Entonces, apareció la pista que no cerraba: un "lsblk -o NAME,SIZE,TRAN" mostró que la microSD se presentaba como "sda", con transporte USB, y esto significaba que la ranura "SD" de la laptop estaba cableada internamente como lector USB, por eso el sistema nunca la vería como el esperable "mmcblk", y por eso los drivers MMC no servían de nada -los que importaban eran los USB-. El ajuste final resultó ser un detalle mínimo pero difícil de terminar encontrando: faltaba "rootdelay". Sin initramfs, el kernel salía a buscar a la raíz antes de que el circuito USB terminara de despertar, y fallaba estrepitosamente. Con darle 5 segundos de paciencia ("rootdelay=5") al "CONFIG_CMDLINE", validándolo primero con una entrada NVRAM de prueba descartable antes de volver a compilar ("efibootmgr -c ... -u 'root=/dev/sda2 rootdelay=5'"), todo empezó a fluir.

Como CRUX no posee un cargador de arranque dedicado, como GRUB y otros, se creó un script BASH para gestionar la NVRAM de manera directa, especialemte tras cada reinstalación, ya que es posible que se dupliquen las entradas de arranque del sistema. Dicho script es "00_EFI_acomodeitor_[CRUX].sh", y lo podés encontrar acá, junto a otros de su misma especie: https://codeberg.org/entropiabinaria/AMPCI

Acierto importante #2: rechazar los diagnósticos a ciegas.

Frente a la avalancha de comandos y el debug "ad infinitum", el freno "no intentar resolver 20 interrogantes juntas, sino ir de a una cosa por vez" fue lo que mantuvo el método limpio y evitó quemar tiempo e introducir ruido y basura en un proceso que siempre intentó mantenerse limpio y pulcro.

Decisiones de arquitectura de esta etapa.

- Kernel sin initramfs, con los drivers de arranque (SATA/NVMe/USB/MMC/SCSI) forzados built-in ("=y").
- Función "elegir_tipo_medio" con opción interna/externa/manual, para agregar "rootdelay" condicionalmente.
- Función "advertencia_updated": avisar al usuario que utilice la ISO comunitaria de Jaeger (crux.ninja) y no la oficial, para evitar compilar monstruos como "fftw", "gcc-fortran", "rust" o "llvm" a mano. ¡Gracias, Jaeger!
- Corrección del teclado en chroot: mover "elegir_teclado" antes de establecer_password_root" y aplicar "loadkeys" de inmediato, para que la contraseña se tipee con el "layout" correcto.

10 de agosto de 2026: el video en VirtualBox.

Hilo "Solucionar video en Crux VirtualBox sin Guest Additions". CRUX en VBox no levantaba X: "no screens found", porque no existía "/dev/dri/" (faltaba el módulo "vboxvideo").

Decisión de arquitectura #2: en lugar de compilar las "Guest Additions" (pesado, solo para pruebas), evaluar el driver vesa forzado, que no toca "/dev/dri" en absoluto y renderiza por framebuffer. KISS. La idea posterior: que el instalador pregunte al final "¿MV? [1] QEMU [2] VirtualBox [3] No" y actúe en consecuencia, dejando el hardware real intacto. Esto no se implementó y está lejos de hacerse: no es prioridad en este momento. Si alguien quiere hacer ese aporte, será bienvenido.

Que CRUX funcionara, en un inicio, en VBox y no en bare metal, no fue demérito del instalador, sino un caso trivial. El NIC y el video emulados de VBox utilizan drivers universales. El "bare metal" es el examen de verdad, y lo que importa. Tal vez más adelante se brinde cobertura para máquinas virtuales, pero por ahora, la idea es que CRUX funcione bien en donde ya lo está haciendo y en donde realmente debe hacerlo, lo cual es en máquinas físicas. 

12 de agosto de 2026. El ciclo de trabajo se había vuelto agotador: producir en Void, subir a CodeBerg multiplicidad de scripts y subscripts (todos con cambios de prueba mínimos), eliminar vestigios de procedimientos anteriores en CRUX, hacer "rollback", descargar en CRUX por consola las nuevas versiones, ejecutar, ver si los "fixes" habían resuelto los problemas y volver a empezar ante cada error, muchas veces reinstalar CRUX por encima de CRUX otra vez, recompilando a lo bestia...

Anyway, you'll never know... The many ways I've tried...

Los LLM son superestructuras espectaculares, sí, pero muchas veces la ayuda de un LLM no es la solución total ni final, ni ahorra tanto tiempo como parece... o como debería.

Un ejemplo concreto: la ISO resultante quedaba con archivos pertenecientes a root, y hubo que resolverlo con "ajustar_propietario", usando las variables $SUDO_UID y $SUDO_GID para devolver la propiedad al usuario invocante. Pero el punto de fondo no es que la IA escribiera código frágil: es que lo escribió con patrones que produjeron fallos en el borde, en el momento del éxito, que es en donde menos se los busca. No reventaba en el camino fácilmente auditable. Y este "camino feliz en el bosque de Caperucita Roja" no es en donde se termina fogueando a una buena pieza de software libre.

También se creó a EtherFI.sh, una herramienta para conectar a Internet a un sistema sin entorno gráfico, especialmente por WiFI, en donde el proceso es tedioso, mecánico y repetitivo:

https://codeberg.org/entropiabinaria/EtherFi

Mediados de agosto - crux-instapelao.sh, la post-instalación.

https://codeberg.org/entropiabinaria/crux-instapelao 

Chat "Instapeláo" (el más extenso de todos hasta el momento de escribir este artículo) y "Purga de XFCE". Nace este otro script, que corre sobre el CRUX ya instalado y arrancado. Es un terreno menos hostil (sin chroot, sin kernel, sin particiones), pero no por esto estuvo (ni está, posiblemente, aún) exento de enormes batallas. Quizás las peores.

Corrección de fondo #1: CRUX no utiliza OpenRC (como Void), ni runit, ni systemd. Usa SysVinit clásico con initscripts al estilo "BSD": los servicios se hallan en el array "SERVICES=(...)" de "/etc/rc.conf". dbus se levanta agregándolo al array, no con "sv", "rc-service". ni mucho menos con systemctl. Yo a esto no lo tenía tan claro: solo lo recordaba apenas, por haber trasteado con algún Windows Manager como OpenBox y el que más me gusta, IceWM. Resultó ser increíblemente sencillo de utilizar, y lo mejor de todo, sumamente intuitivo:

/etc/rc.d/servicio start servicio

Decisión de arquitectura #3 (fuerte): root es root y user es user. Nada de la idiotez de sudo y "poné-tu-propia-contraseña". Nada de la sobreidiottez del "sudo timeout". Separación estricta de privilegios, seguridad, privacidad desde el diseño raíz.

Purga de XFCE: por la poca fiabilidad del hosting y por ser XFCE experimental en CRUX, se extirparon quirúrgicamente del script 2 de las piezas elegidas inicialmente como más importantes, no sin pesar: XFCE y SLiM, dejando intacto todo lo demás (XOrg base, audio, usuario, servicios, infraestructura). Se tuvo que hacer una intervención con inteligencia artificial para eliminar los rastros, porque de otro modo, la opción hubiese sido reescribir todo desde cero, en medio de un estado demasiado avanzado de progreso. Se depuraron y purgaron decenas de funciones huérfanas y variables muertas durante esta etapa.

La idea era entregar a CRUX con XFCE, y se trabajó en ello hasta que fue más sensato abandonarlo que "seguir trabajando en el reviente 1/? de la pieza 1/58 luego de  5 días seguidos de incertidumbre, caos, estrés y ganas reales de abandonar todo el proyecto por ser en extremo agotador y muy poco prometedor en los hechos".

Resiliencia ante infraestructura rota: se construyó "intentar_depinst", una función que envuelve a "prt-get depinst" con reintento automático, detección de fallos de descarga y un menú de cuatro opciones (reintentar / saltear este / saltear todos / abortar), más su compañera "verificar_conexion_y_ports". Para la señal interna de "salteado a propósito" se eligió el código de salida 13. La primera opción había sido 666 —por razones que no hace falta explicar, tratándose de quien se trata-, pero los códigos de salida en UNIX solo llegan hasta 255: cualquier número mayor "se da vuelta" y 666 terminaba convertido en 154. Detalle tonto, pero ilustrativo del terreno. Y esta contención resultó profética: fue exactamente lo que evitó que el script muriera más adelante, cuando "free"desktop empezó a rechazar descargas.

Corrección y problema grave #2: Rust "el foráneo" y la variable "JOBS" vacía.

"prt-get sysup" fallaba compilando rust 1.98.0 con:
"error: a value is required for '--jobs <JOBS>' but none was supplied".
Se persiguió primero la hipótesis equivocada (el jobserver de GNU Make colándose por "MAKEFLAGS"). Hubo explicaciones confiadas que resultaron incorrectas. Lo que resolvió el caso fue la insistencia en ver la fuente real: "prt-get cat rust" reveló la línea del Pkgfile, en donde aparecía, otra vez en un lugar totalmente predecible, un viejo conocido: Python.

./x.py --config=... install -j ${JOBS}

¡Como para no tenerles bronca!

El port usa la variable "JOBS", no "MAKEFLAGS". Se había definido MAKEFLAGS="-j16" pero nunca "JOBS", así que Rust ejecutaba "./x.py install -j" con la variable vacía (ver "Rust" y "py" juntos en la misma oración ya empieza a causarle estragos a mi paz mental...). El error era propio, no de Rust: la evidencia empírica del Pkgfile mató a todas las suposiciones. La solución fue que "configurar_paralelismo" siempre exportase ambas variables ("JOBS" y "MAKEFLAGS"), incluso en modo mononúcleo, en donde se fija explícitamente "JOBS=1". Porque este es el detalle fino: a Rust no le molesta compilar con 1 solo núcleo, lo que le molesta es que la variable esté vacía. Con "JOBS=1" (bien definida), compila sin chistar aunque sea con 1 solo core, siendo que lo que no perdona es el "-j" pelado, sin número detrás. Rust en este caso no supo qué hacer con la situación, ya que no pudo manejar a una variable en blanco, la cual, si nos ponemos estrictos, no es necesaria ni intuitiva dentro del mundo UNIX. Lleve su chirlo por bruto, y a caminar derechito. 

Por este tipo de "detalles omnipresentes" es que digo que una tecnología es foránea -muchas veces tildándola como "NTI"- (3), que muchos desarrolladores, al implementar tecnologías, no saben lo que hacen -pese a que "sepan mucho"-, que no les interesa el verdadero contexto, que no son de acá, que no pertenecen a este ecosistema, que no lo entienden. Son como caballos con antiparras: sabrán muchísimo, sí, pero programan como quien llega a una casa ajena y empieza a mover los muebles sin preguntar. Porque no saben -ni les importa- el hecho de que la organización de las piezas es el producto de la depuración de ensayos, en el tiempo, el que lleva a los habitantes de ese ecosistema a disponerlos así y ahí.

Acierto importante #3, y metodológicamente quizás el más valioso: la autoexigencia de ver el Pkgfile en vez de aceptar cualquier explicación teórica al segundo o tercer error grave.

No adivinemos: leamos la fuente. Esta disciplina es la que distingue a un ser sólido de uno que simplemente fue afortunado durante el mismo.


Problema grave #3: el footprint NEW de... otra vez, Rust.

Compilar Rust "exitosamente" -si es que se puede decir así- fue una de las peores "malas ligas" de todo el proceso. Justo había aparecido una versión nueva de Rust que dejaba obsoleta, por un pelín nomás, a la que Jaeger tenía empaquetada en la ISO Updated, y eso obligó a más de 2 horas de compilación solo para esto. Y al terminar, "prt-get" lo marcaba de todos modos como fallido, ahora por mismatches de footprint (hashes de librerías). Se resolvió instalando el paquete que se acababa de compilar y de manera directa con "pkgadd -u", que saltea la verificación de footprint. Y eso destapó algo: los fallos previos de Rust nunca habían sido de footprint: eran siempre el mismo error de "--jobs". Dicho esto, Rust no me cae en gracia porque en su cadena de dependencias actúa como si fuese un "Python mejorado". Y esto, claramente, no es un elogio.

And still, they lead me back...

Problema grave #4: Anubis en "free"desktop, y el cerco de los mirrors.

Ahora sí, preparate para la repartija de cascarazos, chirlos y piñas a lo Bud Spencer y Terence Hill, porque llegamos al corazón del "Acta de Responsabilidades".

"gstreamer.freedesktop.org" devolvía HTTP 503 debido a la implementación de Anubis, un "PoW" "proof-of-work anti-scraping" que bloquea justamente a "curl y a "pkgmk".

Mediante trabajo empírico real (otra vez: evidencia, no simple opinión) se midió subdominio por subdominio de "free"desktop con "curl -sI". Resultado:

- gstreamer.freedesktop.org → 503. Anubis. "Doble paria" confirmado.
- www.freedesktop.org → 200 OK
- dbus.freedesktop.org → 200 OK
- poppler.freedesktop.org → 200 OK
- xorg, xcb, dri, mesa, gitlab → 200 OK

Conclusión probada con datos: de todo el universo "free"desktop, el único con Anubis era gstreamer. La implementación se supone fragmentada y sin criterio unificado, en donde cada subproyecto administra su subdominio y mete proof-of-work por su cuenta cuando le explota el problema, rompiendo la descarga de fuentes área por área. Hoy fue gstreamer, seguramente mañana sea otro, o todo. No es teoría, insisto: se midió.

La odisea de mirrors que siguió (un pantano documentado, peor que el de "Born on the Bayou").

- MacPorts → versión atrasada.
- kernel.org → 404 en su mirror de Gentoo para el tarball de gstreamer. 

Como ves, kernel.org tampoco se salva: no por Anubis, sino porque corta descargas largas - los hoy 620 MB de linux-firmware- y devuelve 404 en su vista de distfiles.
- Gentoo raíz y Gentoo por hash del nombre → 404 (utiliza otra convención de layout).

GitHub (monorepo oficial de GStreamer) → rechazado: es un repo de 38 MB con bindings de Python (2) que el Pkgfile de CRUX no espera, y rompe compilando "py3cairo.h".

Surge un pensamiento en medio del cerco: "nos están rodeando los cacos, hay que rajar de acá".

La salida: ¡Fossies.org! (https://fossies.org/linux/misc/), que espeja los tarballs de release oficiales, idénticos a los de "free"desktop (mismo md5sum, sin necesidad de "-im"/"-is"). Confirmado para gstreamer y gst-plugins-base 1.28.6. El mecanismo "rescatar_de_fossies" intenta primero a "free"desktop -exponiendo su fallo ante el usuario, con toda intención- y solo entonces cae a "Fossies". ¿Querés salir de esa lista, "free"desktop? Entonces involucrate como corresponde: dejá de hacerle los mandados a quienes generan el conflicto (Gnome, ¿te suena?) y sé equilibrado, que para eso estás ahí. Es lo que menos hacés: empezá a pensar primero en los usuarios y después en las corporaciones y los grupitos de amigos.

Decisión de arquitectura #4, y es de principios: no mezclar a "free"desktop en tándem con gente seria y verdaderamente preocupada. O freedesktop queda afuera al 100%, o queda primero exponiéndose cada vez que falle por su propia mediocridad y mala leche, y los serios (MIT, Fossies) entran solo a rescatar. No como equivalentes. El criterio ético trasladado a la arquitectura del código. Cuando además de técnicos somos militantes, y encima honestos, estas cosas pasan. "Comprendanlón".

18 al 22 de agosto y contando: DRIVERS Y BLOBS: la epopeya del kernel de red.

Se abre un nuevo hilo de investigación: "DRIVERS Y BLOBS!". El problema más grande y más colectivo de toda la travesía: CRUX no veía ninguna tarjeta de red en bare metal. Nunca. En ninguna máquina. ¿Cómo podía ser? Los compañeros de Entropía reportaban lo mismo en "bare metal", mientras que en VirtualBox le funcionaba bien la red a todo el mundo. Creo que lo mismo sucedía con el video, pero, honestamente, a esto no lo recuerdo bien.

El encuadre que lo cambió todo (acierto importante #4): no era la máquina de nadie en particular. Era el instalador produciendo sistemas sin red de forma sistemática y reproducible. Los datos, aportados por la comunidad de Telegram:

- En VBox siempre hay red (caso trivial, NIC emulado).
- En bare metal, NUNCA: 3 máquinas distintas, 3 chips distintos, 3 personas distintas (un compañero con Gentoo, otro con Arch, otro con 2 con Void en 2 máquinas diferentes).
- El mismo hardware funcionaba perfectamente con otras distros, pero en CRUX, incluso un adaptador Ethernet USB-C tampoco aparecía en el "ip address show".

Si fueran drivers puntuales faltando por casualidad, sería una combinación de mala racha y mala suerte imposibles. El denominador común no era un driver: era algo transversal a toda la pila de red. La hipótesis: un ".config" de kernel castrado (probablemente por un "localmodconfig" corrido en MV, que eliminaba todo driver no cargado en ese momento).

El clímax técnico — el eslabón fantasma RFKILL
: tras varios ciclos de depuración en frío, la causa raíz resultó ser que "CONFIG_RFKILL=m" capaba a toda la pila WiFi. Como "CFG80211" y "MAC80211" dependen de "RFKILL", tenerlo en módulo arrastraba la cadena entera a módulo, y en cascada descartaba a todos los drivers WiFi de manera pareja. Nunca había sido tocado eso. Era el símbolo que nadie era capaz de ver.

La metodología que lo encontró fue el "dry-run", el ensayo en seco: en vez de compilar 45 minutos a ciegas, se forzaban los símbolos en un ".config" de prueba, se corría "make olddefconfig < /dev/null", y se "grepeaba" el resultado. En un ratito se veía si la cadena quedaba "built-in" o si se degradaba, sin quemar tiempo en toda una pesada compilación completa para averiguarlo.
Ahora bien, seamos honestos sobre cómo se llega a una solución así... No se trata de experiencia en esto, ya que no es el caso del autor de este artículo. Se llega por desesperación: cuando estás a punto de darle un piñazo al monitor y atravesarlo de lado a lado del estrés acumulado... con suerte.

La solución -el patrón "forzar_simbolos"-: forzar la cadena de dependencias de abajo hacia arriba ("RFKILL" primero, después "CFG80211"/"MAC80211" como "=y", Ethernet como "=y", drivers WiFi como "=m"), y recién después "olddefconfig" (que resuelve sin degradar lo ya configurado y establecido). Este patrón se replicó para "forzar_simbolos_video" y "forzar_simbolos_entrada".

El timing de firmware (una sutileza fina): los drivers de almacenamiento y Ethernet van built-in ("=y") porque casi no dependen de programa externo del dispositivo. Pero el WiFi va modular ("=m") a propósito. Si fuera built-in, inicializaría tan temprano que "/lib/firmware" todavía no estaría montado, y pediría su firmware con error -2 (ENOENT) aunque el archivo esté ahí, en el disco. Al ser de naturaleza modular, en cambio, carga después de montar la raíz: encuentra su firmware, y recién entonces levanta la interfaz.
Todo esto, por supuesto, no fue fácil, ni intuitivo, ni evidente, sobre todo para alguien que al iniciar todo este proyecto no tenía la menor experiencia aceptable en compilación ni en kernels. Así se aprende: a los golpes, en las peores batallas, que son las únicas que enseñan a lo grande.

Contribución de la comunidad
: se agradece a Nico Vasconi y Miguel González, que hacían ronda de mate desde 2 orillas distintas del mismo río mientras ayudaban a pensar esto: quedaron grabados en los comentarios del propio código. Maxi Rica sacaba los mejores turrones españoles del horno, mientras Henry Jones y otros participaron de un filoso y atinado diagnóstico grupal, asado mediante, por Telegram. Nolberto empezó a preparar las arepas en cuanto entramos de lleno en su terreno: los Window Managers. Esto no fue una comilona de un hombre degustando y una máquina tragando tornillos aceitados solamente, fue de un hombre, una máquina, y una comunidad que le puso el hombro al binomio sin entrar en la pavada.

Pero, no todo es color de rosa... Acá empezaron los sub-problemas.

Cuando se estaba redondeando la base... el touchpad (trackpad) de la Acer no era visible al kernel por faltar "CONFIG_I2C_HID_ACPI" y "CONFIG_HID_MULTITOUCH".
"I2C_HID" era el contenedor cuya ausencia como "=m" impedía (en cascada) que "I2C_HID_ACPI=y". Confirmado por dry-run (en seco, como buen "tatequiéto").

El video (subproblema)
: en el hardware real, el amdgpu (para la GPU AMD Barcelo) faltaba del kernel config activo. Tras recompilar, la GPU levantó y "/dev/dri" apareció.

Pero en esta travesía hubo espacio hasta para la metalingüística. Me refiero a la cuestión terminológica del término "blob", que fue corregida por el excelentísimo "Dr. en Ciencias del Rompepelotismo", Prof. Hugo Napoli, quien rechazó una vez más, abiertamente y con fundamento, el uso de vocabulario técnico incorrecto -en este caso, el del término "blob" para el firmware-.

El planteo parte de un esquema clásico:

Hardware: pieza eléctrica/electromecánica.
Software: programas.
Firmware: hardware con software.
Y el problema es este: la industria estiró el término "firmware" hasta hacerlo reventar. Dejó de grabar el programa en un chip de la placa (en donde estaría "firme") y desde hace años pasó a cargarlo desde un archivo suelto en "/lib/firmware" en cada arranque… pero le siguió diciendo "firmware" igual. Es un nombre heredado, mal puesto -lo mismo que decir "disco SSD"-. La formulación precisa que debería adoptarse es "programa de dispositivo": software de fuente cerrada que corre dentro del chip de la placa, no en la CPU, y que el controlador le inyecta al arrancar.

Dicho en criollo, y para que no queden dudas del temperamento con que se defiende esto, se cita textual al Dr. (sic):
"A mí no me vengá' con cosa' rara': o e' járguar, o e' sójguar, o e' fírguer. Y si e' otra cosa, lo arreglamo' afuera. Ningún bló de járguar, ¿m'entendé?"
O, como dice mi amigo Sergio Arce:

Acá no vengá' a jodé'.

Y no es una manía aislada, es la misma bronca de fondo que la del fraude de GiB (qué nombre más estúpido e intelectualoide de quinta) frente a GB, usado para robarle a la gente inflando cifras. Misma familia de abusos: llamar mal a las cosas para justificar la impunidad. Por eso Realtek y NVIDIA se llevaron una puteada explícita, y con razón: entregan hardware que no anda, en cajas negras inauditables.

23 de agosto - InstaBox: una de las últimas piezas del "Moon Cresta".

https://codeberg.org/entropiabinaria/InstaBox

Hilos "Etapa SOLO openbox (constructo)" y "Etapa SOLO openbox (pulido)". InstaBox representó al acople gráfico final, aunque no terminó siendo el último, al instalar openbox + tint2 + feh + dunst sobre el CRUX ya sólido. Corre como root, instala dependencias (imlib2 con "-if" por un footprint mismatch conocido de los loaders jpeg/svg/tiff), detecta usuarios "humanos" (UID ≥ 1000, sesión real), y se "baja" al usuario elegido con "su - usuario -c" para desplegar ".xinitrc" y fondos.

La ocurrencia que, muy tarde, cambió el ritmo de todo: SSH.

Durante semanas se había trabajado con la MV, sacando fotos de la pantalla con el teléfono y pasándoselas a Gemini para hacer OCR, porque no se contaba con posibilidad de copiar y pegar, ni con red. A mitad de este hilo se estableció el acceso por SSH a la MV y a la laptop física. con reacción registrada al pie. Cito, textual:

"Soy profesor de REDES... ¡REDES! Y no consideré JAMÁS usar SSH para proyectos como este... ¡Soy un PELOTUDO! Pero, ¿en qué carajos estaba pensando?"


Lo que sucede, y me gusta pensarlo así para no tener que autoflagelarme con un cable UTP: utilizar SSH todos los días para enseñarlo, no es lo mismo que aplicarlo a un proyecto puntual. Estás en otra cosa, venís como pájaro al que le abren la jaula: sabés que "no se puede salir" y por más que te abran la puerta, ni se te pasa por la cabeza hacerlo. Es un punto ciego, quizás, no una incapacidad. Pero el cambio fue enorme: se acabó "el parto de la isla" mucho después de haberse logrado la conectividad. A partir de ahí todo fluyó con una velocidad enorme y un estrés "galopante pero en bajada p'abajo, ¿vio?".

Verificaciones de esta etapa: se contrastó todo el stack gráfico contra el árbol de ports real de CRUX 3.8, y aparecieron varios hallazgos. Picom no estaba en el catálogo. Tampoco había ningún gestor de archivos gráfico en las colecciones oficiales: PCManFM arrastra medio LXDE, y xfe pide a "FOX toolkit", que está ausente, así que el gestor de archivos quedó diferido a una futura v2... si llega. Veremos. Y Tint2, que ya había aparecido en contrib con un parche glib, volvió obsoleto al port de Tint2 que se había pretendido armar.

Todo esto en medio de un delirio constante: la búsqueda a los tumbos de soluciones de débiles humanos para problemas de titanes.

El 23 de agosto aún habían quedado pendientes: el fondo de feh pisado por el gris default de openbox-session (menos de 1 segundo después), y la fase 2 de applets de bandeja (volumen, nm-applet, blueman). Finalmente, ante un humano estupefacto, el cuerpo de InstaBox queda diseñado y la pieza logra verse en pantalla: X arranca, openbox corre, el menú contextual anda, Firefox abre y reproduce video... pero no sonido, no te afilé'. No te vistá' que no va'. No te pinté' lo' labio' que la foto es en blanquinegro.


ACTA DE RESPONSABILIDADES AJENAS.

Registro de miserias y mediocridades estructurales evitables. Es, sí, en gran parte, desahogo, pero cada punto está verificado. El criterio de "labración" del acta: la falla burda y evitable, con nombre, sin importar "genio" ni figura.

1. "free"desktop.org: Anubis fragmentado y con un criterio anticomunitario.

Falla concreta y medida: implementaron proof-of-work (Anubis) en "gstreamer.freedesktop.org", rompiendo la descarga de fuentes vía curl, pkgmk, etc., con "HTTP 503" (servidor saturado de tráfico), mientras el resto de sus subdominios (dbus, poppler, xorg, xcb, dri, mesa) siguen en 200 (éxito). Es una implementación por áreas, descoordinada, que va minando y resquebrajando a la infraestructura de fuentes de a pedazos. Claro... Esto, viéndolo desde afuera, porque desde adentro, la autocomplacencia y las palmadas en la propia espalda son un gran indicador del "vamos bien" y del "hicimos lo correcto". Un servidor que se supone abierto, libre y central para "medio ecosistema Linux" (por no exagerar), administrado por gente que otrora se ganó un merecido renombre por ser una agrupación orientadora en cuanto a qué ingredientes poner en las recetas de las interfases, pero que hoy se dedica más a militar posturas por sobre lo técnico que a sostener una infraestructura democrática -nunca mejor colocado este concepto-, habiendo dejado de mostrar un claro y desintoxicado camino a seguir, y no presentando criterio unificado en temas realmente excluyentes.
Esto fue medido con curl, subdominio por subdominio. No es solo una opinión. Son también -y esto es lo más importante-, hechos.

You left me standing here... A long, long time ago...

2. La kernel.org tampoco se salva.

Falla concreta: corte sistemático de descargas largas (los más de 620 MB de linux-firmware) dejándolas a medias, y su vista de distfiles de Gentoo devuelve 404 para tarballs que deberían estar. No es malicia como Anubis, es desprolijidad de infraestructura en un servidor que se presenta como confiable y peor aún, como bastión elegido por la comunidad.

3. La documentación que empuja al error.

Falla concreta: la documentación oficial (incluido material de referencia como Linux From Scratch) advierte que poner "DRM_AMDGPU", "DRM_RADEON" y similares como "=y" "no es recomendado", pero no explica con claridad el porqué -el problema del timing de firmware-. Así, al que compila sin initramfs lo deja tropezar solo con el error -2. Y ese error despista: ante semejante fallo, uno imaginaría que el kernel se quedó sin memoria, o que el archivo empaquetado es más grande que el espacio disponible, o... cualquier cosa, excepto la de la verdadera causa. La otra trampa, la de "scripts/config --set-val" (que no resuelve el árbol de dependencias, y que "olddefconfig" después degrada) tampoco está documentada de forma que un humano pueda esquivarla antes de venírsele encima la curva de la muerte. Para desenredar este tipo de cosa es que hace falta una máquina.

4. Los Pkgfile escritos asumiendo un único escenario.

Falla concreta: el port de Rust asume el "pkgmk.conf" por defecto de CRUX (con "JOBS" / "MAKEFLAGS" comentados) y utiliza "-j ${JOBS}" sin defensa alguna ante una "JOBS" vacía. Quien active el paralelismo por el camino "natural" (MAKEFLAGS) sin saber del "JOBS" oculto, choca con un error críptico. No hay validación ni mensaje útil. ¿Por qué? Porque no están en esto, porque no saben de esto: están en RUST. Saben de RUST. Y así nos van limando, redondeando, a imagen y semejanza de otros, perdiéndose, en ese detestable camino, identidad, volviéndonos grises.

5. La deriva de proyectos "libres" financiados "férreamente" desde arriba.

Este, sin duda, es, el hilo conductor de toda el acta. Las trabas más grandes no vinieron de la falta de recursos, sino de exceso de recursos mal administrados, infraestructura sostenida por fundaciones y empresas (el ecosistema alrededor de Canonical / Red Hat / IBM) que toma decisiones unilaterales (Anubis, layouts de mirror, políticas) que cagan a medio pueblo sin consultar ni avisar al pueblo. El contraste es el punto entero de esta crónica.

EL OTRO LADO DEL ACTA: EL ESFUERZO GENUINO (AJENO Y PROPIO).

Frente a cada traba estructural, colosal, mediocre por definición de poder, la respuesta fue de gente con infraestructura pequeña que puso el cerebro y el cuerpo como para lograr soluciones 20 veces más poderosas que los que son 20.000 veces más poderosos.

- CRUX mismo.

Tim Biermann y Matt Housh sostienen a una distro entera, a sus paquetes, a MATE, y a la ISO "Updated", con una fracción de los recursos de las grandes. Cuando el proyecto choca contra un límite, es por falta de recursos, no por arrogancia desde el abulonamiento y/o la corrupción y/o traición imperdonable de valores puros a nivel comunitario y del software libre.

- La comunidad de Entropía binaria.

Maxi, "Henry Jones", Nicolás Vasconi, Miguel González, "Nólbert" y otros compañeros, diagnosticando por Telegram en máquinas, sistemas y entornos distintos, sin hacer alarde, por el gusto de aportar genuinamente y de que la cosa funcione. Sus nombres quedaron en los comentarios del código, además de acá, pero son los que quedan en el "cuore".

- Un docente uruguayo, casi solo, en 1 mes de laburo, peleando contra sus propias miserias, inseguridades, poniendo sus fortalezas a tope, utilizando las tecnologías más a mano, valiéndose de recursos dignos de un McGyver en serio, conectando máquinas por SSH, negándose a bajar el estándar aunque el agotamiento y la bronca hubiesen rebasado límites mucho más allá de lo tolerable, leyendo cada información "de por ahí", cada respuesta de IA, milimétricamente, militarmente, religiosamente, posesamente, en vez de copiar y pegar y hacerlo más fácil, más rápido, menos estresante y frustrante, pero también más irresponsable y menos pedagógico. A los valores no se les traiciona. A las personas tampoco.

Don't keep me waiting here...

La asimetría no es de talento ni de ganas, es de recursos, de poder y de pureza mental. Y esta es exactamente la denuncia que sostiene todo este proyecto.

A los atornillados y abulonados a su cargo y posición, a los "grandes", a los que "hostean recursos": háganse cargo de lo que realmente vean que van a poder dominar, hagan bien su laburo, no prometan nada que no sean capaces de defender con la misma determinación y vehemencia de los exabruptos dichos. No borren con el codo lo que escriben con la mano, no hagan más mandados para nadie.

Esta crónica es un esqueleto cambiante, un esbozo, un garabato inmaduro. Cada sección seguramente termine expandiéndose, siendo retocada. El "Acta" y el "Esfuerzo Genuino" son las 2 columnas editoriales que le dan alma.
El villano no es CRUX, no es DeVUAn, no es Artix: es la infraestructura "libre" mal gestionada. El héroe colectivo es todo el conjunto de gente no vendida a las corporaciones ni a entregada a sus productos, que pone amor genuino, sin personalismos ni egos rotos, y con los recursos honestamente posibles.

Situación hoy, pasado el 23 de agosto.

Ya existe "InstaMate.sh", un script totalmente funcional para instalar al escritorio "Mate" de manera automatizada.

https://codeberg.org/entropiabinaria/InstaMate

Se está trabajando cuidadosamente en "TtyLog.sh", una pantalla de login BASH para tty, para que no haya que iniciar con pantalla negra, autenticarse por tty y levantar al entorno gráfico manualmente (startx).

https://codeberg.org/entropiabinaria/TtyLog

CRUX es totalmente funcional. Se puede instalar utilizando los instaladores de Entropía binaria en cascada y terminás con un CRUX con Mate o con OpenBox.
También con red, sonido y todos los chiches. 


NOTAS AL PIE:


(1) El e-mail fue a parar a una migración general a Thunderbird de todos mis correos desde 2007 hasta ahora: al estar ahí y no estar más en GMail (eliminé todo para empezar desde cero), ese mensaje de Tim que explicaba cómo prescindir de rEFInd quedó respaldado, y debido a mis prácticas con CRUX, aún no reinstalé a Thunderbird ni le hice releer la millonada de mensajes en "backup". De ahí que tuviera que reconstruir el método del arranque por EFI Stub desde cero.

(2) Sobre por qué Python es un problema técnico concreto y no un capricho ni una postura filosófica, lo desarrollé aparte, en detalle y con ejemplos, acá: https://entropiabinaria.blogspot.com/2026/08/el-por-que-de-mi-rechazo-tecnico.html

(3) Sobre las NTI, podés leer el artículo completo acá:
https://entropiabinaria.blogspot.com/2026/01/nuevas-tecnologias-innecesarias-un.html

El por qué de mi rechazo técnico visceral e innegociable a Python.

El por qué de mi rechazo técnico visceral e innegociable a Python.

Quiero que quede claro de entrada, porque se puede llegar a malinterpretar, mi punto de vista: mi rechazo a Python no es filosófico.
A este nivel, Python es una idea excelente: un lenguaje accesible de alto nivel, legible, bastante sencillo, que le abre la puerta a que cualquiera (un pibe, un docente, un biólogo, un aficionado) pueda escribir su primer programa y contribuir. Eso está bien. Eso está, en realidad, mucho más que "bien": la democratización de la posibilidad de programar es algo que celebro sin reservas. El problema no es la idea. El problema es la ejecución, y de buenas ideas mal llevadas a cabo está lleno el mundo.

A nivel técnico, Python es un desastre, y lo es por razones concretas, medibles, demostrables, no por gusto ni por apego ni pertenencia a otra parroquia.
Primero: es lerdo y tosco. Es un intérprete lento por diseño, que para hacer cualquier cosa seria termina llamando a librerías escritas en C -porque el propio Python no da la talla- y encima se cuelga de un árbol de dependencias monstruoso para lograrlo. Estamos hablando de cientos de miles de paquetes para servir para algo. Y no es que Python sea el único que arrastra dependencias como un chancho arrastra barro: Rust hace exactamente lo mismo. Pero hay una diferencia que lo vuelve mucho peor.

Segundo, y esto es lo central: esas dependencias no solo son miles, sino que son inestables entre sí. Inestables respecto a su propio desarrollo, a su propio mantenimiento, y -lo más grave- respecto a los programas estables que pretenden manipular. Un paquete de Python se actualiza y rompe a otros 3. Una versión menor del intérprete deja obsoleto medio ecosistema. Un "binding" que funcionaba hasta ayer (o hasta hace 2 horas), ahora tira una "excepción" porque el proyecto de arriba movió una coma. Es un castillo de naipes en donde cada naipe está sostenido por otro que también se está cayendo, y un ejemplo de manual de algo concreto con lo que me tocó lidiar es con Selenium y Firefox. Tengo un proyecto hecho en Python, y la cantidad de veces que vi que esa yunta se rompía sola (no porque Firefox fallara, sino porque la capa de Python que pretendía manejarlo iba siempre atrasada, siempre desincronizada, siempre parcheándose para alcanzar a un objetivo que se movía), fue de mucho más que "mal gusto". Python, berretísimamente, pretende no solo manipular a un programa estable, sino que además no puede parar de romper el flujo de ejecución en el intento.
Este es mi proyecto en Python (BurocraTux), para que veas que sé muy bien de lo que hablo:

BurocraTux es un programa que automatiza el ingreso de clases en la plataforma SIGED de gestión educativa. Su objetivo es ahorrarte tiempo y evitar el burocrático y tedioso proceso de ingresar datos de forma manual, guiándote paso a paso a través de 11 preguntas simples. 

https://codeberg.org/entropiabinaria/BurocraTux

Y si querés un verdadero monumento al desastre, mirá el mundo OSINT. Paso por ahí bastante seguido. Sé bien de lo que está hecha la edición más pesada de BlackArch ( https://blackarch.org/index.html ).

Acá es en donde Python saca a relucir con burda meridianidad toda su mediocridad, siendo, increíblemente y contra todo pronóstico sensato el estándar de facto de la disciplina, y el resultado está a la vista: de 3000 paquetes andan 5. El resto está roto, sin mantener, abandonado, o pidiendo una combinación de versiones infernales de dependencias rotas, desactualizadas, o que ya no están mantenidas. ¿Por qué? No es casualidad ni mala suerte. Es porque son Python. No son C, no son Go, no son Pascal. Ni siquiera son Rust, otro lenguaje feo. Un binario en C compilado hace 15 años, todavía corre. Un programa en Go es un binario único, estático, autocontenido, que tirás en cualquier máquina y anda. Un Pascal es sólido como una roca, y dicen que más que C en algunos aspectos. Pero una herramienta OSINT en Python es una bomba de tiempo: la instalás y ya está podrida, porque el ecosistema de abajo se mueve en aguas no solo turbulentas sino inmanejables para una pila de tal pretensión. Y a la primera de cambio, esas aguas se llevan todo puesto. A los 10 minutos, al otro día, a la semana, o al poco tiempo. Toda una disciplina entera -una que depende de que las herramientas FUNCIONEN BIEN (COMO TODO PROGRAMA CONSTRUÍDO EN BASE SÓLIDA), cuando las necesitás- parada sobre el barro movedizo de un lenguaje pantanoso que no garantiza que lo de ayer siga andando mañana.

Eso es lo que me genera "vómito intracraneal". No es el hecho de que "exista": soy un defensor de las "existencias". ¡Todo debería existir, hasta las insanas tentaciones! De otro modo, ¿en dónde quedaría nuestra fuerza de espíritu y nuestro verdadero poder de elección? Tampoco es que la gente lo use. El tema es que sin merecerlo y sin ser bueno para el ecosistema informático, se haya vuelto un ESTÁNDAR de la industria, y esto también aplica a la cloaca digital infecta y promotora de piratería, adoctrinamiento corporativo y analfabetismo digital: Windows.
Python... Algo tan frágil, tan lento, tan poco confiable, que se enseña como la llave de entrada a la programación (así como erróneamente se ofrece el adefesio de Ubuntu "para arrancar con Linux"), que no puede garantizar estabilidad, que a su vez son las únicas propiedades más básicas que uno debe exigirle a cualquier herramienta seria... Un estándar debería ser lo más sólido, no lo más fácil de que reviente. Aunque sea difícil aprenderlo.

Y para terminar, permítaseme aterrizar todo esto sobre el ecosistema de CRUX Linux, en revientes de compilación concretos también sufridos en carne propia, porque no estoy hablando en abstracto: te estoy mostrando y evidenciando mucho más que "mis impresiones". Cuando el monorepo de GStreamer me reventó la compilación, ¿en qué lo hizo? ¿Adivinás justo dónde? En "py3cairo.h", un "binding" de Python que yo no pedí, para una función que yo no necesitaba, colado dentro de un paquete que debería ser C limpio, dentro de una estructura limpia y controlada que al inestable y sinvergüenza de Python le queda ENORME. Cuando libxml2 no compilaba, ¿por qué era? Porque su binding de Python exigía "doxygen", y me obligó a escribir toda una función (asegurar_libxml2_python) para tapar un agujero que Python metió impunemente donde era mejor quedarse quietito y no tocar nada. En un instalador de CRUX -insisto, una distro cuya alma es la simplicidad, el código fuente limpio, el control total y absoluto en manos del usuario, el "compilá y entendé lo tuyo"- Python aparece de parásito, arrastrando su mugrienta y fétida cola de dependencias inestables, para romper builds que sin él funcionarían, y mucho mejor. No es una molestia teórica. Es la causa raíz, con nombre y archivo, de horas de trabajo perdidas en proyectos en los cuales es el programador el que da la cara ante cualquier fallo, no "Python".

Por eso no entra en mi stack. Ni Python, ni su lógica. Lo pesado lo hago en Go -binario único, estático, sin runtime que arrastrar, porque probé a hacerlo en Rust y la verdad, en materia de dependencias es un "Python mejorado"- y la orquestación de todo en BASH, que corre hoy, corría hace 15 años y va a seguir corriendo en 15 años más. No es dogma. Es haber aprendido, a los golpes, quién se banca firme el invierno como milico a la intemperie y quién se engripa con la primera lluvia de verano.

Si me querés hacer la vida más fácil, solo no me preguntes por qué no me gusta Python, y en lugar de eso, leeme. Acá está gran parte de mi justificación. Quiero que esto quede como manifiesto.

INSTRUCCIONES DE INSTALACIÓN DE CRUX VIA HERRAMIENTAS UNIX-KISS DE ENTROPÍA BINARIA


El logotipo original de CRUX es muy pequeño: lo he escalado y retocado mínimamente con IA y a mano para utilizarlo sin perder definición.

------------------------------------------------------------------------------------
INSTRUCCIONES DE INSTALACIÓN DE CRUX VIA HERRAMIENTAS UNIX-KISS DE ENTROPÍA BINARIA.
------------------------------------------------------------------------------------

* Sitio oficial de CRUX Linux:
https://crux.nu/Main/HomePage

* Documentación oficial:
https://crux.nu/Main/Documentation

* Enlaces externos de contribuyentes:
https://crux.nu/Main/Links

* Descarga de la ISO oficial:
https://crux.nu/Main/Download

* Descarga de la ISO actualizada de Matt "Jaeger" Housh:
https://crux.ninja/updated-iso/

* Descarga NO OFICIAL de la ISO de "Jaeger" con inyección de los programas de Entropía, por Google Drive, solo para compartir y facilitar la instalación:
https://drive.google.com/drive/folders/1f2vvCd4mohYB0W6a4zgHFo_LP6NcLIhE?usp=drive_link

* Programas independientes que están dentro de la ISO y que pueden haber tenido actualizaciones que no estén allí:

https://codeberg.org/entropiabinaria/InstaCrux

https://codeberg.org/entropiabinaria/EtherFi

https://codeberg.org/entropiabinaria/crux-instapelao

https://codeberg.org/entropiabinaria/AMPCI

https://codeberg.org/entropiabinaria/InyectISO

* También tenemos una sub-sala para hablar de CRUX en el grupo de Telegram:
https://t.me/grupo_entropiabinaria

>>>

1: instacrux/InstaCrux.sh

GENERALIDADES.
--------------

Primero se ejecuta InstaCrux, el cual te permitirá recompilar el kernel sin tocar la instalación existente o instalar un CRUX base oficial ya actualizado por Matt Jaeger Housh (uno de sus desarrolladores principales). Durante la instalación, InstaCrux eliminará todos los datos de la unidad de almacenamiento que elijas, y verificará/realizará una tabla de archivos GPT con las 5 particiones que en Entropía se promueven como buena práctica:

    /boot/efi
    /
    /tmp
    swap
    /home
    
Luego ejecutará el "setup" propio de CRUX.
Luego instalará a CRUX en tu máquina, compilará el kernel y te ofrecerá copiar a la instalación nueva los programas de Entropía binaria necesarios para instalar a CRUX de manera automatizada.

ESPECIFICIDADES.
----------------

Este instalador también te permitirá realizar un montón de pasos y ajustes más, los cuales son, al igual que los anteriores, igualmente importantes:

    - configurar el teclado y la zona horaria,
    - establecer la contraseña del usuario root,
    - elegir cómo compilar el kernel,
    - establecer el nombre del sistema para la red (hostname) y los DNS,
    - establecer el arranque via "EFIstub" (sin "bootloader" tradicional, arranque directo por UEFI),

<<<

>>>

2: etherfi/EtherFi.sh

Antes de ejecutar al siguiente script, vas a necesitar a este (a menos que tengas automatizado el proceso de levantar a mano tu tarjeta de red y conectarte, especialmente tratándose del WiFI.
Esto es lo que resuelve EtherFI: levantar a la tarjeta Ethernet y dejarla activa y con conectividad, y/o hacer lo mismo con la WiFI, cosa algo más compleja de realizar a mano. Una vez que hayas logrado levantar a la interfaz correspondiente y estés conectado, puedes proceder a ejecutar el script siguiente.
NOTA: a veces Etherfi te dará un mensaje de conectividad satisfactoria, pero en otras ocasiones y tal vez por un exceso de perfeccionismo al desarrollarlo, te dará un mensaje ambiguo, diciéndote que se realizaron todos los pasos necesarios pero que puede que aún no tengas una red lista. Si tenés dudas, podés hacerle ping a lo que quieras (ejemplo: ping wikipedia.org), pero no he visto un solo caso en donde EtherFi haya fallado de verdad. 

<<<

>>>

3: crux-instapelao/crux-instapelao.sh

Este programa realizará un montón de tareas más que no se pueden hacer desde la "ISO live" y sin haber reiniciado e ingresado en el sistema ya instalado. Es por esto que "InstaCrux" e "crux-instapelao" no están fusionados, al menos hasta ahora.
En el caso de "instapeláo", las acciones que te permitirá realizar, serán las siguientes:

    - actualizar a los ports (fundamental al trabajar con software de los repositorios),
    - actualizar al sistema entero (fundamental para que la posterior compilación no "reviente"), (1)
    - crear un usuario no root, con directorio propio y contraseña,
    - elegir cómo compilar varios paquetes que será necesario descargar,
    - instalar XOrg y PulseAudio,
    - activar servicios de arranque, dejando todo pronto para instalar, finalmente, un entorno gráfico.

<<<

>>>

OPCIONAL I: ampci/00_EFI_acomodeitor_[CRUX].sh

Si estás reinstalando CRUX (es decir, si no es la primera vez que lo instalás en el mismo equipo), las entradas de CRUX viejas, puede que empiecen a estorbar, ya que algunas NVRAM no poseen una buena gestión de lo que hacen y toleran entradas basura que no conducen a ninguna parte. Hay otras que limpian a las entradas que llevan a caminos sin salida (o a errores de arranque), mientras que la mayoría de las NVRAM, o bien fallan y detienen el arranque al encontrarse con algo de esto, o simplemente siguen intentando arrancar a las entradas siguientes, iniciando con la primera que funcione.
Al reinstalarse, CRUX generará nuevas entradas para sí mismo sin borrar las anteriores (CRUXes viejos), y si detectase a otros sistemas operativos en otras unidades de almacenamiento, te mostraría también a esas, ya que no lee a las mismas desde GRUB, LILO o cargadores de arranque por el estilo, sino directamente desde la NVRAM de tu equipo... la cual depende de la prolijidad del fabricante de la placa o de ese chip, no de CRUX. También podrás cambiar el orden de esas mismas entradas, junto con las de CRUX, así como eliminar las que no quieras, agregar entradas a mano si lo necesitas, respaldar la configuración de la NVRAM y restaurarla (cuidado, restaurar es experimental y corre a tu proipio riesgo).

<<<

OPCIONAL II: inyectiso/InyectISO.sh

Si querés armarte a tu propia ISO de CRUX para proyectos personales, podés hacer lo que hago yo. Antes de instalar al sistema, creo a mi propia ISO, lo cual consiste pura y exclusivamente en agregarle un directorio en su raíz, conteniendo a los programas que quiero y/o necesito, para llevarlos dentro de la imagen "buteable".
Cuidado: revisá la licencia de CRUX, porque redistribuir una imagen ISO oficial con "cosas metidas adentro", ya no es oficial y rompe la credibilidad si no se sabe quién la colocó en dónde ni qué le hicieron a la misma al ofrecértela. Yo lo hago solamente para simplificarme la vida a mí, y si esto te sirve, excelente, se comparte. Pero tengo claro que de "mío" este proceder no tiene nada. Solo es un "atajo inteligente".

>>>

<<<

**** PROCEDIMIENTO DE INSTALACIÓN PASO A PASO ****

El equipo de pruebas fue una laptop con hardware de potencia intermedia-alta (Acer Aspire 3, Ryzen 5 5700U, 32 GB de RAM, M.2, pero instalando a CRUX en medio microSD para pruebas, conectado a la placa internamente via USB).
Cuando se haga referencia a tiempos de demora, considerá que en tu equipo la demora puede variar.

>>>

Iniciar la imagen ISO de Entropía.
cd /entropia

OPCIONAL:
    cd ampci
    bash 00_EFI_acomodeitor_[CRUX].sh
    Eliminar las entradas de CRUX antiguas.

cd instacrux
bash InstaCrux.sh
Primero que nada, hay que decantarse entre recompilar un nuevo kernel o instalar el sistema. La recompilación del kernel es muy sencilla y no toca al sistema instalado.

INSTALACIÓN DE CRUX:
--------------------

Pulsar tecla, elegir la unidad de almacenamiento correcta.
Ingresar el código de seguridad aleatorio que se mostrará en pantalla.
Si el sistema encuentra particiones ya creadas, lo informará y preguntará "Proceed anyway? (y/N)". Responder "y" [Enter]. Esto es útil si solo querés formatear root pero no home. por ejemplo.

A continuación, se le cederá el control a la herramienta nativa de instalación de CRUX, y luego, el control volverá a InstaCrux. Seguir las indicaciones que el programa indica: dejar el punto de montaje en /mnt, seleccionar (con "flecha abajo / space") todas las categorías (core, opt, x11), dejar todos los paquetes marcados, no seleccionar cargador de arranque, confirmar y esperar. El tiempo real de espera para la instalación de paquetes necesarios ronda los 10 minutos.

Vuelve el control a InstaCrux. Seleccionar el teclado que corresponda, probarlo, continuar con [C] o volver a elegir con [N].
Establecer la contraseña del usuario root. Elegí una mayor a 8 caracteres, con algún símbolo, alguna minúscula, alguna mayúscula, algún número.
Para la configuración del kernel, te recomiendo la opción 3: es experimental pero viene funcionando maravillosamente, quizás incluso mejor que las otras.
Para el tipo de medio de almacenamiento, elegí [I] si es una instalación en un disco duro, unidad SSD, M.2, o cualquier otro medio de almacenamiento interno. De no ser así, considerá la E. Con eso estaría bian. Pero como el control debe tenerlo el usuario y no el programador, hay otra opción a considerar.
Para la zona horaria, si sos uruguayo, dale [Enter]. Sino, ingresá la zona correspondiente, en la sintaxis correspondiente.
Dale nombre al equipo.
Aceptá con [Enter] los DNS que se proponen, o ingresá el tuyo. Podés escribir más de uno.
El instalador empezará a trabajar. Tené paciencia: ahora ya no estás instalando, sino compilando.
El tiempo real de espera para la compilación de paquetes necesarios ronda los 38 minutos.
Podés copiarte todos los programas de Entropía a la instalación real. Te recomiendo que lo hagas. Los encontrarás en el mismo directorio: "/entropia".
A continuación, y si no vas a hacer más nada, tendrás que reiniciar en el sistema ya instalado para poder proseguir con la instalación: estás en la "Live ISO" y desde acá, ya no se puede continuar instalando. Te recomiendo que apagues el equipo, quites el medio de instalación, e inicies en CRUX.

<<<

>>>

Iniciar como root en el CRUX instalado físicamente.
cd /entropia

OPCIONAL SI NO TENÉS CONECTIVIDAD CABLEADA NI WIFI (SOBRE TODO PARA WIFI).
    cd etherfi
    bash EtherFi.sh
    Seleccioná la interfaz que quieras activar, seguí los pasos, conectá. El programa puede decirte que "puede que la red no tenga salida a Internet": esto es por un tema de extrema precaución, y nunca vi que fallara. EtherFi siempre terminó conectando. Probá a hacer ping a wikipedia, si querés: ping -c1 wikipedia.org
    cd ..

OPCIONAL SI QUERÉS TRABAJAR MÁS CÓMODAMENTE POR SSH DESDE OTRO EQUIPO.
    En este momento, ya podés conectar por ssh desde otro ordenador. Para ello, en CRUX revisá la ip (ip a) levantá el servicio (/etc/rc.d/sshd start sshd) y listo, ya podés seguir trabajando en ese equipo desde otra máquina tipeando "ssh tu_usuario_no_root@la_IP-de_CRUX".

cd crux-instapelao
bash crux-instapelao.sh
Actualizá los ports. Podés saltear esto solo si no lo hiciste en esta instalación.
Creá tu usuario no root. Dale una contraseña con las características descritas para el usuario root.
Para el manejo de "footprint mismatches", te recomiendo la opción 2.
Para el paralelismo de compilación, lo mejor es que uses toda la potencia de tu máquina: todos los núcleos, con la cantidad de RAM correspondiente. Por cada núcleo, calculá 1.2 GB de RAM, ejemplo: 8 núcleos, 9.6 GB de RAM.
Para la actualización del sistema, posiblemente tengas unos 40 paquetes para actualizar. Decile que sí al instalador, sentate y esperá. Esto va a demorar, seguro, porque otra vez toca compilar. El tiempo real de espera para la compilación de paquetes necesarios ronda 1 hora 17 minutos.
MUY IMPORTANTE PROBLEMA CORREGIDO A PARTIR DE LA VERSIÓN 0.123.243: el instalador podría fallar en algún momento. Traté de reducir esto al mínimo porcentaje de error posible, calculando varios escenarios posibles y atajándolos para que el flujo del proceso no reviente. Antes de esta versión, cuando falló, lo hizo o bien sobre los últimos 4 o 5 paquetes no alojados en servidores de CRUX (descargados desde la "free"desktop.org), o bien sobre la descarga del "linux-firmware" (es la única excepción a la regla, porque al estar instalado, podés saltearlo y continuar). No tiene por qué pasarte, necesariamente, pero si sucede, solamente seleccioná saltear el paquete problemático o esperá unos minutos e indicale al programa que lo reintente. También podés reiniciar el instalador en otro momento, saltearte la actualización de ports, la creación del usuario no root, volvé a indicar lo que ya indicaste (manejo de footprint mismatches, cantidad de núcleos para compilar, etc.) y continuar, ya que todo lo que ya se hizo, quedó bien hecho. El instalador va a terminar de hacer su trabajo y tu sistema va a quedar actualizado al momento de haber corrido el proceso.
Reiniciá.

<<<

 

>>>


Volver, como root al directorio "entropía".

cd /entropia
cd /instabox
bash InstaBox.sh


Esta parte no es interactiva: solo se trata de "dejarla correr" y en minutos tendrás a OpenBox instalado y preconfigurado con algunos valores de Entropía binaria.

<<<


NOTAS AL PIE.
-------------

(1) Por más que Matt Housh ("Jaeger") colabore enormemente al ofrecernos un CRUX actualizado, e independientemente de que esa ISO tenga que ser re-publicada cada cierto tiempo, los ports (repositorios) de CRUX se seguirán actualizando, y los paquetes contenidos, más actualizados que los de la imagen de Matt, ya no formarán parte de su ISO. Es por esta razón que aunque te descargues esa ISO (es lo recomendado), verás que es necesario actualizar "un poco más" al instalar. En ocasiones, son más de 40 paquetes, y esto lleva tiempo. Y es fundamental hacerlo: tené paciencia. Personalmente, creo que CRUX es un sistema que no fue pensado para la automatización, y acá estamos intentando manejar esto mediante complejos procesos aportados por varios scripts de la herramienta más potente para hablarle a los sistemas libres: BASH.

Hugo Napoli.

Bazofia o maravilla: la equis mayúscula y la equis minúscula en Linux y sistemas UNIX-Like.

Bazofia o maravilla: la equis mayúscula y la equis minúscula en Linux y sistemas UNIX-Like.

Creando un script para la descarga, compilación e instalación de Trinity Desktop en Linux, me topé con tener que usar una equis mayúscula en un chmod:

chmod -R go+rX /opt/trinity

Esto me sucedió al ver que un "ls -l" apuntando al directorio /opt/trinity, me devolvía esto:

drwx------ 9 root root /opt/trinity

El significado: solo root podía iniciar sesión gráfica en el nuevo escritorio que acababa de instalar. LightDM ni siquiera "veía" el archivo que estaba dentro de ese directorio y que era fundamental para iniciar sesión usando el escritorio Trinity. 

Cuando "make install", en pasos anteriores, creó ese directorio, le dejó, de paso, permisos root, haciendo que LightDM no pudiese manipular los archivos internos de ese directorio y que descartara el intento silenciosamente.
Al haber descubierto eso, en lo primero que pensé, fue en correrle al directorio un

chmod -R 755 /opt/trinity


pero también pensaba en que estaba ante la última fase antes de que el escritorio arrancara, y que lo único que faltaba era acceso a ese directorio... Quizás yo estuviese vulnerando la seguridad al abrir todo un camino recursivo de permisos tal vez innecesarios dentro de todo el directorio, ejecutando la línea de arriba (chmod -R 755...)...

En este preciso instante, me puse a conversar con Gemini. El chat con Claude estaba tan sobresaturado de logs hiper extensos, que yo conversaba por fuera con Gemini para las "pavadas" que iban apareciendo.
Le pregunté por qué Claude había sugerido esa bazofia de línea inicial (...-R go+rX...).
Fue entonces que aprendí que, en realidad, hubiera estado mal hacer el "chmod 755": lo que correspondía era, ni más ni menos que "chmod -R go+rX /opt/trinity".

El porqué de esta sintaxis ininteligible y contraintuitiva, es porque si intentáramos un "chmod -R 755", romperíamos los permisos de ejecución de todos los archivos involucrados en el proceso.

Al aplicarle "755" a todo (tabla rasa), todos los archivos contenidos en /opt/trinity ganarían gratuita e inesperadamente un bit de ejecución, y el sistema pasaría a verlos a todos ellos como a programas ejecutables, así fueran recetas de flan casero y de pucherito de gallina (¡gracias, Miguel, por el tangazo que me hiciste escuchar, también, inesperadamente!)

Por eso mismo es que se inventó el mamotreto "go+rX", porque es una forma directa en Linux de operar sobre "carpetas y archivos" con una sola línea, sin bucles ni condicionales, tocando solo lo que debe ser tocado y nada más: solo las carpetas.
El "go" significa "grups y others" y el "+rX" significa "read and eXecution".
Este es el verdadero por qué de la "X" mayúscula.

Pero una cosa es "decir", otra es "mostrar" y otra "demostrar".

En una carpeta, "x" no significa "ejecutar", significa "entrar".
Si tenés una carpeta SIN permiso "x", aunque seas el dueño, no vas a poder ingresar a ella a menos que seas root (o que le asignes manualmente "+x", cosa que un programa, por si solo, no hará nunca).
Mirá la prueba que hice en su momento:

mkdir masequis
touch masequis/contenido.txt
echo "Hola" > masequis/contenido.txt 
cat masequis/contenido.txt

Creé un directorio llamado "masequis", dentro de él creé un archivo llamado "contenido.txt". Escribí en ese archivo la palabra "Hola" y luego intenté leerla. La terminal devolvió, tal como se esperaba:

Hola
Luego, le quité el atributo de "ejecución" (ingreso) a la carpeta, y traté de leer el archivo que estaba alojado dentro de la misma.

chmod -x masequis/
cat masequis/contenido.txt

Pero esta vez,la terminal no devolvió un "Hola", sino un

cat: masequis/contenido.txt: Permiso denegado

Pensé: "Gemini -al menos en parte- tiene razón. Voy a seguir adelante, pero haré una prueba acerca de "X" y el "bit de ejecución en un archivo".
Es decir: me faltaba comprobar lo del "+X" (equis mayúscula).

Entonces, hice esto:


Para explicarlo, lo dividí en 3 bloques (amarillo, anaranjado, rojo) para que vieras la secuencia. Pese a que la imagen es de calidad, se ve demasiado chiquito el texto. Por eso lo traigo acá abajo. Lo que hago primero que nada (bloque amarillo) es muy similar a lo anterior: crear un directorio, crear un archivo dentro de él, meterle dentro un texto, asegurarme de que EL ARCHIVO no tenga permisos de ejecución, y verificar todo.

mkdir prueba
echo "Fue posible leer este archivo." > prueba/incógnito.txt
chmod -x prueba/incógnito.txt
ls -l prueba
cat prueba/incógnito.txt

La terminal devuelve lo esperado:

-rw-r--r-- 1 entropia entropia 31 jul 22 17:56 incógnito.txt
Fue posible leer este archivo.

Luego, hago esto (bloque anaranjado): quitar permisos de ingreso A LA CARPETA e intentar leer el archivo que la misma contiene.

chmod -x prueba;ls -l prueba
cat prueba/incógnito.txt

La terminal, ahora, devuelve:

ls: no se puede acceder a 'prueba/incógnito.txt': Permiso denegado
total 0
-????????? ? ? ? ?            ? incógnito.txt
cat: prueba/incógnito.txt: Permiso denegado
Entonces, para probar la sintaxis sugerida por Claude y explicada por Gemini, por último, hice lo siguiente (bloque rojo): aplicar RECURSIVAMENTE permisos EQUIS MAYÚSCULA (solo a carpetas) y comprobar a ver si el archivo fue tocado o no, ya que con equis minúscula hubiese sido afectado todo, sin distinción, hasta el último elemento presente ahí adentro.

chmod -R +X prueba
ls -l prueba
cat prueba/incógnito.txt

La terminal, finalmente, devuelve no solo el texto, sino la confirmación buscada: "X" afecta SOLO A CARPETAS, mientras que "x" afecta A TODO.

-rw-r--r-- 1 entropia entropia 31 jul 22 17:56 incógnito.txt
Fue posible leer este archivo.

¿Te das cuenta de lo que estoy intentando mostrarte?
La X mayúscula sirve para tocar todas las carpetas y saltearse los archivos, mientras que la x minúscula toca todo.
Me costó confiar en esa información: nunca la había comprobado, ni había tenido que utilizarla. Esto, creo que demuestra que las inteligencias artificiales pueden ayudar a aprender, solo si somos críticos con lo que nos devuelven y tomamos verdadera responsabilidad sobre el resultado final.

Te dejo un ejercicio, para que lo pruebes.

1. Creá estos 3 directorios, y al final, un archivo:

dir1/dir2/dir3/archivo.txt

Aplicá:

chmod -x dir1/dir2/dir3/programa.sh
chmod -x dir1/dir2/dir3


¿Quitaría, esto, permisos de ejecución al archivo?
¿Se podría acceder a dir3?
¿Y a los directorios anteriores?

2. Luego hacé:

chmod -x dir1/dir2

¿Podrías acceder al dir2?
¿Y al directorio anterior?

3. Luego, ejecutá:

chmod -x dir1

¿Podrías acceder al dir1?
¿Y a sus subdirectorios?

4. Finalmente:

chmod -R +X dir1

¿Quedarían habilitados nuevamente todos los directorios?
¿Ganaría, el archivo, un bit de ejecución?

Trinity en Void Linux: un pedido que llevaba 6 años sin respuesta y que pudo resolver Entropía binaria.


Voy a empezar por el final, porque el final se describe con una sola línea:

ln -s /opt/trinity/lib64 /opt/trinity/lib

Ese enlace simbólico: un archivo que apunta a otro archivo, una sola línea de comandos, 2 simples rutas.

Entre el momento en que empecé este proyecto y el momento en que escribí esa línea pasaron 25 horas, treinta y pico de dependencias descubiertas de a una, 4 días de trabajo incluyendo madrugadas, yendo a laburar y durmiendo poco, 3 intentos serios de abandonar el proyecto, y el rescate de la casualidad misma, al poder ver un escritorio que arrancaba sin bordes, sin botones, sin estilos, sin acceso a las aplicaciones vía IGU (GUI), y sin poder abrir -incluso valiéndome de la terminal- varios de los programas que yo sabía que estaban instalados y que funcionaban (como Firefox, por ejemplo)... todo por un symlink que faltaba.

Pero... ¡vamos por partes!

Por qué me metí en esto.

Plasma, desde hace tiempo, ya no me parece una opción. Y no lo digo por la interfaz, sino por su eterno estado verde, por aquéllo a lo que apunta, y más aún por lo que hoy, indiscutiblemente, representa.

KDE 3 es (y era) coherente. Tiene una idea de lo que un escritorio debe ser: lugares para que puedas poner tus cosas en donde vos quieras, y un entorno que te obedece. No hay un diseñador decidiendo por vos si este botón "distrae", o si hay que abrazarse ciegamente a tecnologías inmaduras a partir de "tal momento", sin importar lo que opine la mitad de la gente. Después vino Plasma, y con Plasma vino el rumbo. O vinieron juntos, quizás premeditadamente.

Mirá la línea temporal: Windows 8 saca su "novedad", el escritorio Metro (baldosas planas colorinchudas pensadas para ser tocadas con el dedo en una pantalla en la cual nadie iba a terminar tocando nada). Windows 10 lo des-groseriza bastante y arma su escritorio. Y Plasma, que supuestamente era la alternativa libre, ¿qué hizo? Pues... fue detrás (y sigue yendo). Los mismos planos, la misma estética de baldosa, la misma idea de que menos es más... hasta que menos, ya fue la nada misma.
No siguió su propio camino: siguió el de Redmond, siempre corriéndola de atrás.
¿Viste cómo falla al intentar descargar temas?
¿Y qué me decís al intentar descargar íconos?
¿Y al intentar descargar decoraciones de ventana, fondos de escritorio y cursores de ratón?
Y encima: Wayland por omisión, systemd integrado hasta el caracú(lo), cada vez más pesado, cada vez más dependiente de decisiones corporativas que se toman en lugares en donde nosotros no estamos. Es el software libre "corporativo-amigable" del que vengo hablando hace años.

Trinity fue (y es) un intento de rescate de KDE antes de su transformación en Plasma: un fork de KDE 3.5, nacido en 2010, cuando "KUbuntu" (que hace rato que debería llamarse "PUbuntu", por coherencia) se pasó a Plasma 4 y Timothy Pearson dijo "ya fue suficiente". Hoy lo lidera Slávek Banko y sigue produciendo lanzamientos.
Y acá va un dato que me parece hermoso, fijate a ver si compartís conmigo: Trinity lleva más años vivo como bifurcación (fork) que lo que KDE 3 vivió como versión oficial. Un escritorio de 2001, bifurcado en 2010, con lanzamientos estables y frecuentes en 2026, tal como el primer día. 16 años del "fork" contra 9 del original. Eso dice algo sobre qué software sobrevive y por qué. Afortunadamente, no sobrevive solamente el que tiene más plata: sobrevive el que tiene a varios que no lo sueltan, lo cual es como para abrir tema acerca de la representabilidad de las minorías en Linux, y de por qué nunca va a pasar que las distros se fundan todas en el mismo gris corporativo. Por algo existe Void. Por algo existe Artix. Por algo no existe systemd en muchos de nuestros sistemas operativos. Por algo, justamente, no "porque sí", ni "por nada".

Yo uso Void Linux. Sin systemd, sin Wayland, sin telemetría, sin nada que no haya puesto yo. Y quería recordar la estética de KDE, no "instalar Plasma".
Y ahí fue que empezó el problema. Yo pensaba que era "compilar e instalar"...

El pedido que nadie atendió antes que Entropía.

Trinity está empaquetado para Debian. Para Ubuntu. Para Arch, Gentoo, Slackware, Fedora, openSUSE, Mageia, FreeBSD, OpenBSD, y hasta para DilOS, que es una distro de Solaris. ¿La conocías? Yo no: me enteré al empezar a caminar por los trillos de Trinity.

Para Void, no existe. O, bueno: no existía antes, ahora sí :D
Aunque... el pedido sí existe, y es el siguiente: issue #19243 de void-packages en https://github.com/void-linux/void-packages/issues/19243. Se llama "Package request: Trinity Desktop Environment" y fue abierto el 17 de febrero de 2020 por un usuario llamado "kasesag". Puso el enlace a la web de TDE, puso los PKGBUILD de Arch como referencia, y esperó.
Sigue abierto, sin asignar. Sin una sola rama, ni un solo pull request.
Seis años y medio: más o menos lo que lleva de vida el proyecto "Entropía binaria".
Y la situación no es que nadie lo haya intentado: hay un comentario en "Hacker News" de 2021 que dice, textualmente, que "hay un issue para empaquetar TDE para Void y aparentemente se puede compilar". Aparentemente. Alguien lo vichó, dijo "se puede", y... siguió con su vida. Casi como pasa conmigo después de 25 horas de trabajo.
El panorama tampoco es exclusivo de Void. Busqué y me encontré con un pedido equivalente en NixOS que también existe, también sigue abierto, y allí un usuario dejó escrita una frase más o menos como esta, que resume todo: "TDE es muy difícil de instalar en cualquier distribución no soportada".
Dijo "difícil"... Ahora sé exactamente cuánto.

Lo primero que descubrí: la documentación... no está en la documentación.

Empecé como empieza cualquiera: buscando la lista de dependencias.
El wiki oficial de TDE tiene una. Y al final de esa lista, escrito por los propios mantenedores, hay una nota que dice más o menos así: "Lista compilada a partir de viejos ebuilds de QT3/kdelibs/kde-base - ¿Alguien puede revisar esto, por favor?"
Ebuilds de Gentoo, de hace más de una década. Y los que mantienen el proyecto no saben si sigue siendo correcta.
Ahí entendí la primera lección de todo esto: en el software libre viejo, muchas veces la documentación real no está en la documentación, sino en los "empaquetados".
Si querés saber qué necesita TDE para compilar, no vayas a su Wiki, mirá el "debian/control" de Debian, que es exhaustivo porque tiene que serlo. Mirá el "PKGBUILD" de Arch, el "SlackBuild" de Slackware (que es el más cercano a compilar a mano porque Slackware no tiene un gestor que te resuelva el árbol de dependencias).
Esa información existe, está mantenida, y es correcta. Pero está escrita en el idioma de cada distro. Por ejemplo:

  • libaspell-dev en Debian es aspell-devel en Void.
  • libjpeg-turbo-dev es libjpeg-turbo-devel.


Y algunas no se traducen tan lindamente:

el header magic.h está en un paquete que Debian llama libmagic-dev y Void file-devel, porque el proyecto se llama "file" aunque la librería se llame libmagic.
Nadie hizo esa traducción para Void, y creo que ese fue todo mi trabajo, en el fondo: investigar, persistir, traducir, y orquestar, cosa que hago todo el tiempo.

El método (o de cómo tuve que proceder con "no adivinar").

Antes de escribir una sola línea de código, me senté a verificar. Solo quería "instalarlo y ya", no contribuír con otros con tanto tiempo invertido. No porque no sea mi estilo, sino porque pensé que iba a ser más sencillo. Bastante más sencillo.
Y la primera verificación, ya me alertó, a la vez que me salvó de un desastre.
La API de la Gitea oficial de TDE te da, para cada versión, una URL de descarga del tarball. Se llama "tarball_url". Está ahí, en el "Yéison" (JSON), "tranca palanca".
Esa URL retorna "404".
Lo que quiero decir, es que la API te publica una dirección de descarga que no funciona, a la vez que el servidor anuncia un archivo que no genera: si yo hubiera confiado en la documentación -que, insisto, es de la propia API del proyecto, nada menos- habría escrito un instalador que le explotaba en la jeta al primer usuario.
Lo mismo con el resto: cada vez que dí algo por sentado, perdí un montón de tiempo con...

  • los nombres de los paquetes: busqué zlib-devel y lo primero que apareció fue lzlib-devel, que es otra cosa completamente distinta (el formato lzip). Si lo copiaba de memoria, mandaba a todo el mundo a instalar la librería equivocada. Y caí en eso, no te creas que fui una lumbrera;
  • el SlackBuild de tqt usa un flag -platform linux-SB. Pasé rato tratando de entender qué era esa plataforma extraña, hasta que usando como fuente el script, averigüé: "cp -a linux-g++ linux-SB", lo cual es una copia de la plataforma estándar con 2 retoques. No existía tal cosa como "linux-SB";
  • el repositorio se llamaba tqt3 y ahora se llama tqt: el paquete de macros de CMake figura en los "changelogs" como cmake-trinity, pero el repositorio se llama tde-cmake.


A cada una de estas cosas las descubrí corriendo comandos y mirando la salida, porque ninguna estaba escrita en ningún lado.
La regla que saqué de todo esto: verificá antes de escribir. Siempre. Aunque estés seguro... ¡Sobre todo si estás seguro!

La gotera.

Y entonces, empezó lo peor.
CMake tiene una fase de configuración: antes de compilar, busca lo que necesita y avisa si falta, y eso está muy bueno al compilar.
El problema es que CMake solo busca lo que los desarrolladores le dijeron que buscara: si un archivo ".cpp" perdido en "tdeui/" hace "#include <X11/Intrinsic.h>" y nadie declaró esa dependencia, CMake no tiene manera de saberlo... te enterás cuando el compilador llega a ese archivo y revienta. A los 2-4 minutos de compilación.

Así que mi ciclo era:

  1. correr comandos para ver si se podían ir incluyendo en un procedimiento que yo ya estaba empezando a escribir en paralelo a mis pruebas directas en Void,
  2. ver como se ejecutaban en la terminal y escribirlos realmente, para no olvidarlos,
  3. esperar,
  4. aguantar el reviente en el hocico,
  5. buscar qué paquete de Void traía el "header" de lo que había causado la explosión,
  6. instalarlo,
  7. volver al punto 1.

Treinta y pico de veces, para:

  • libudev.h
  • ltdl.h
  • magic.h
  • X11/Intrinsic.h
  • rpc/rpc.h
  • XKBfile.h
  • libxml-2.0
  • libxslt
  • glib-2.0
  • alsa
  • openssl

Y seguía, y seguía...
Hasta que mi primer momento de frustración llegó, y antes de abandonar (primera vez que lo pensaba) opté por llamar a Claude y le expliqué los problemas.
Le pregunté a Claude por qué carajo CMake no verificaba todo de una buena vez en lugar de ir para adelante como un zombi y fallar cada 3 minutos.
La respuesta me dejó pensando: es un bug de TDE, no de CMake.
Los CMakeLists.txt de Trinity, están incompletos: faltan declaraciones de dependencias que el código usa, y eso sucede cuando migrás un proyecto de 2001 de autotools (solo lo conocía de haberlo escuchado) a CMake, a lo largo de años, a mano, con poca gente. Es comprensible.
Y ahí está la trampa perfecta: la razón por la que este proceso es tan jodido es exactamente la razón por la que nadie lo había hecho para Void, todavía.
Es un trabajo ingrato: hay que aguantar decenas de revientes y anotar. Pero ojo, que este camino pedregoso no es exclusivo de Void, porque hay que pensar en que cuando un usuario de Debian instala TDE y le funciona a la primera, está cosechando el sufrimiento de alguien (o de algunos) que hizo esto mismo hace años y lo escribió en un debian/control.

Ese alguien, para Void, no existía.

Ah... y de paso: el sonido.
En medio del goteo, apareció "aRts". Yo ni siquiera sabía qué joraca era eso.
Ya no buscando en Internet, sino pidiéndole rigurosidad a Claude, me enteré de que "aRts" es el servidor de sonido de KDE 3: un daemon de 2001 que se mete entre las aplicaciones y la placa de audio. Y TDE lo demanda, porque viene activado por defecto.
Yo uso PulseAudio. Lo instalé yo, funciona, no lo voy a tocar.
Y además, 2 servidores de sonido peleándose por el mismo dispositivo es exactamente el tipo de quilombo que no le sirve a nadie.
Y acá tomé la típica decisión de director de batuta que define todo un proyecto: el escritorio se adapta al sistema, no al revés.

Volví a compilar por enésima vez (en esta oportunidad con la bandera -DWITH_ARTS=OFF) y... listo, a esperar otra vez.
TDE usa ALSA de manera directa, PulseAudio se pone encima como se pone encima de cualquier cosa que hable ALSA, y todo funciona. Sin daemon extra, sin conflictos, sin tocar una parte neurálgica del sistema por causa de un escritorio.

Después vino htdig, que es un indexador de búsqueda para el centro de ayuda de TDE. Última versión estable: 2004. Void ni lo empaqueta. Fuera (yo ya estaba en modo bolchevique de disciplina férrea a esta altura).

Después vino CUPS, y ahí me equivoqué feo. Mi primer instinto fue sacarlo y seguir, porque pensé: "¿para qué quiere CUPS un escritorio?". Pero un escritorio completo tiene su módulo de configuración de impresoras, y eso es parte de lo que hace que un escritorio sea un escritorio y no un gestor de ventanas con pretensiones. Instalar los headers no arranca ningún daemon, no toca nada, no consume nada. Solo deja la puerta abierta.

Pero aprendí, de nuevo.

Esta distinción me parece importante y es la que entendí que había que empezar a utilizar todo el tiempo: sacar la grasa que hace mal, pero no la que da sabor.

La tercera madrugada consecutiva, aquella en la cual casi tiro todo a la mierda.

Eran pasadas las 4 de la mañana: llevaba más de 23 o 24 horas laburando sobre lo mismo.
TDE compilaba (los módulos, que ya eran 6, uno tras otro), después de 30 y pico de dependencias descubiertas de a una, y algunas incluso con ayuda de Claude, que se esforzaba por buscar como perro sabueso pero que tampoco daba pie con bola. "starttde" estaba ahí, el binario existía, el escritorio arrancaba... pero era un auténtico desastre. Mirá por qué.

  • Las ventanas no tenían barra de título, ni botones: podías cambiar entre ellas con [Alt] [Tab], pero no cerrarlas ni minimizarlas.
  • Las aplicaciones abrían "vacías por dentro": el marco estaba, pero adentro no había botones, ni campos de texto. El espacio TDE se sentía como una casa abandonada.
  • Konqueror, que ya de por sí posee limitaciones enormes, tiraba -literalmente- 20 carteles de error distintos antes de abrir, y abría "vacío".
  • Firefox no arrancaba.


Escribí, textual, en mi guía de instalación (y esto marcaría mi segundo intento de "casi abandonar"): "Esto es un agujero negro que se chupa el 90% de todo lo que hago. Ya no estoy seguro de si vale la pena seguir. Está llevando demasiado recurso para ser tan solo un escritorio. La puta madre".

Y estaba por hacerlo. Tenía el mapa de reversión casi listo: 5 o 6 "rm -rf ALGO", y a otra cosa: era un "andá a cagar" sin dolor ni bronca.
Al otro día, con cabeza fresca pero habiendo dormido poco -otra vez- y mate de por medio, le di el extenso log a Claude en vez de seguir revisando yo. Y ahí saltó:
 

TWin: No window decoration plugin library was found. TWin will now exit


TWin -el gestor de ventanas de TDE- arrancaba, no encontraba ni un solo plugin de decoración, y se suicidaba. Por eso no había barras. Ni botones. Ni un carajo.
Pero el problema era que los plugins sí estaban. Los recordaba de una vieja época linuxera, y los había visto "cien veces" durante las "cien compilaciones": twin3_default.so, twin3_plastik.so, twin3_keramik.so, y así, quizás una veintena de ellos.

¡ Estaban en /opt/trinity/lib64/trinity/, pero TDE los buscaba en /opt/trinity/lib/trinity/ ! ¡Pero la reputa madre, carajo!

El symlink.

Acá está uno de los hallazgos más importantes, y esta es de las únicas cosas de todo este proyecto que no están documentadas en ningún lado.
En un sistema de 64 bits, CMake instala las librerías en lib64. Lo hace solo, aunque le pases -DLIB_SUFFIX="" para decirle que no (lo probé: te ignora olímpicamente y aún no sé bien por qué).
TDE, en cambio, busca sus plugins en "lib".
Por lo que averigüé, en /usr eso no se nota, porque casi todas las distros tienen un enlace simbólico de /usr/lib64 a /usr/lib. Está ahí desde hace años, es parte del paisaje, nadie lo mira.
En /opt/trinity no hay nada, porque es un prefijo nuevo, creado por el instalador. Y ese enlace no existe, salvo que lo crees vos, y sin él, TDE compila perfecto, instala perfecto, arranca... pero todo lo que dependa de cargar un plugin falla silenciosamente: las decoraciones de ventana, los estilos de los widgets (por eso era que las aplicaciones se veían vacías, los botones sin estilo, que había áreas que no se dibujaban). Y esto afectaba también a los ioslaves, que son los que manejan los protocolos. Por eso Konqueror no podía ni abrir siquiera una puta carpeta local.

20 carteles de error, 4 síntomas distintos... ¿una sola causa?

ln -s /opt/trinity/lib64 /opt/trinity/lib

Lo corrí por recomendación de Claude, y las barras de título aparecieron en pantalla mientras miraba. Así, de una. Quedé como un pelotudo mirando la pantalla, pensando que esa era "otra cosa más que tampoco iba a funcionar".

Por lo que vi, todas las distribuciones que empaquetan a TDE resuelven esto en su "packaging", pero ninguna lo escribió en un lugar en donde se pueda encontrar: está enterrado en el pkg-plist de FreeBSD, en las reglas de Debian, en el PKGBUILD de Arch... Cada uno lo resolvió por su cuenta y siguió adelante.
Mi aporte en todo esto, no es haber compilado a TDE; yo para compilar necesito una pequeña receta. No vivo compilando. No soy el crack de esas lides. ¿Compilar?Vos, yo, cualquiera, con un poquito de paciencia y ganas, lo consigue.
Yo creo que encontré y escribí lo que hacía falta. Por eso es que lo expliqué en el "markdown" armado a las ligeras para CodeBerg. Por eso es que, de manera mucho más extensa, ahora mismo estoy escribiendo esto que estás leyendo.

Los permisos, la otra trampa.

Hubo un tercer problema, y lo cuento porque es igual de invisible.
Ya casi estaba entrando a quedar apenas aceptable el trabajo: ya no era una cagada, era algo apenas creíble. Y llegó otro mazazo que, al igual que los 2 garrones anteriores, no pudo quedarse contenido.
Trinity no aparecía en la pantalla de inicio de sesión. El archivo .desktop involucrado en esto, estaba bien (ya lo había validado con "desktop-file-validate"), los permisos eran idénticos a los de XFCE, todo estaba en el directorio correcto.
Pero no aparecía. Ni Claude estaba pudiendo con esto.
A la tercera vez que me hizo entrar a XFCE, hacer ajustes, cerrar sesión, ver si TDE aparecía como opción disponible... Dije... Che, si a esto no lo estoy pudiendo resolver ni siquiera con la ayuda del mejor LLM, quizás, en una pequeña párte, sea porque estoy estresado y pasado de rosca. Otra vez, a descansar, tarde, durmiendo poco, enfrascado con que "ya casi estaba en la orilla", "ya se veía tierra"... ¿firme?
A dormir, que había que laburar al otro día.
Finalizado el día de trabajo, vine directo con una idea en la sabiola:
¿por qué carajos no puede LightDM leer ese binario?
Llegu a casa, prendo la máquina, tiro un ls...

drwx------ 9 root root /opt/trinity

¿Por qué mierda "/opt/trinity" tenía permisos "700" indicando que solo root podía iniciar sesión gráfica, cosa totalmente estrambótica y mamotrética?
El binario, solamente por dentro, era perfectamente ejecutable... pero vivía en una casa tapiada.
¿De dónde salió ese 700?
Del umask de root cuando "make install" creó el directorio. ¿Quizás pase siempre y yo no haya sabido manejarlo? Sí o no, lo cierto es que esa era otra cosa que estaba hinchando las pelotas, anteponiendo otra roca de granito de 8500 toneladas entre el escritorio y yo. 

LightDM validaba el "TryExec", no podía manipular al archivo, y descartaba la entrada. Sin log, sin error, sin nada.

A la fuerza y a huevo, se me ocurrió correr desde XFCE un "chmod -R 755 /opt/trinity" pero tratándose un directorio con subdirectorios y archivos dentro, pensé... ¿y si estoy vulnerando la seguridad o haciendo cagada, solo intentando que esto funcione?
Ahí aprendí que en realidad, hubiera estado mal hacer el "chmod 755"... no lo sé, no lo probé a ver qué hubiera pasado.
La línea no era esa, sino este mamotreto: "chmod -R go+rX /opt/trinity".
El porqué de esa sintaxis ininteligible y contraintuitiva, es porque si intentáramos hacer esto usando mi "comando favorito" en una sola línea (chmod -R 755 directorio), romperíamos los permisos de todos los archivos contenidos en él. Al aplicarle 755 a todo (tipo tabla rasa), todos los archivos contenidos ganarían el bit de ejecución, y el sistema pasaría a verlos a todos ellos como a programas ejecutables, así fueran recetas de flan casero y de pucherito de gallina.
Por eso mismo es que se inventó el mamotreto "go+rX", porque es una forma directa en Linux de operar correctamente y a la misma vez sobre "carpetas y archivos" con una sola línea, sin bucles ni condicionales, tocando solo lo que debe ser tocado y nada más.
El "go" significa "grupos y otros" y el +rX significa "lectura y ejecución".
Y el por qué de la "X" mayúscula.....
Bué.........

Algo que yo tampoco sabía (y que no vi nunca, en ningún lado, hasta ahora), es que -y no sé si esto viene de UNIX o si es cagada de Linux) se decidió utilizar las mismas tres letras (r, w, x) también para las carpetas, pero cambiando ligeramente el significado.
En una carpeta, la x no significa "ejecutar", significa "entrar".
¿Qué pasa si tenés una carpeta SIN permiso "x"? Aunque seas el dueño, aunque tengas permiso de lectura y escritura, no vas a poder entrar a tu propia carpeta. Mirá la prueba que hice en su maldito momento (ya no podía creerlo, no terminaba más y me enfrentaba cada vez a cosas más raras):

[ entropia@user ] $ mkdir masequis
[ entropia@user ] $ touch masequis/contenido.txt
[ entropia@user ] $ echo "Hola" > masequis/contenido.txt 
[ entropia@user ] $ cat masequis/contenido.txt 
Hola
[ entropia@user ] $ chmod -x masequis/
[ entropia@user ] $ cat masequis/contenido.txt 
cat: masequis/contenido.txt: Permiso denegado

¿Te das cuenta de lo que estoy intentando mostrarte?
La X mayúscula sirve para tocar todas las carpetas y saltearse los archivos, mientras que la x minúscula toca todo.
Y a esto que te estoy contando, ni siquiera sé si lo capté exactamente como correspondía, te soy honesto.

A propósito: este es mi "yo" de 2 días después: acabo de escribir un artículo, en este mismo blog, explicando solamente esto, con lujo de detalles.
Si le querés dar una vichada, leelo acá: https://entropiabinaria.blogspot.com/2026/07/bazofia-o-maravilla-la-equis-mayuscula.html

Volviendo... cerré sesión en XFCE por quintillonésima vez, y... ahí apareció el endemoniado TDE.

3 bichos (bugs), 4 días, y todos eran de esos que no se ven leyendo el código; se ven ejecutándolo.

El menú vacío.

Después de eso, TDE arrancó. Con barras, con estilos, con Firefox andando.
Ahora sí me volvía el alma al cuerpo.

Pero... no era "gratarola" este arranque prometedor. Otro hondazo en el medio de la jeta: el menú de aplicaciones estaba vacío, como si en mi Void no hubiera un puto programa instalado, siendo que los hay a montones.
El error -ya no recuerdo si en un cartel, en un log, o en el menú, te lo digo en serio-decía: "tde-applications.menu not found".
Con ayuda de Claude lo buscamos con lupa. No aparecía por ningún lado el soberano hijo de la madre.
A modo de intento tembloroso y timorato, fuimos al packaging de Debian, que a esa altura ya era una especie de oráculo de Delfos, y ahí estaba la respuesta en una sola línea de "debian/rules":

"install -p -D -m644 kded/tde-applications.menu → .../etc/xdg/menus/tde-applications.menu".

En Debian lo instalan "a mano"... ¿Sabés por qué? Porque el "make install" de tdelibs no lo instala. El archivo está en el código fuente, en "kded/", y ahí se queda.
Y hay un detalle más: al comando que reconstruye el caché de menús (tdebuildsycoca), lo busca en "/etc/xdg/menus/", ignorando la variable de entorno que le dice dónde mirar... Así que no alcanza con ponerlo en donde corresponde: hay que ponerlo en donde efectivamente busca.

Otra cosa que nadie escribió. Otra que ahora está escrita.

Sobre trabajar con una inteligencia artificial.

Quiero ser más honesto aún sobre qué hizo Claude y qué no, porque me parece importante al menos para mí dejarlo plasmado acá.

  • Claude buscó bien, bajo parámetros de exigencia ultra estrictos.
  • Encontró el "debian/control", el SlackBuild de tqt, el Makefile de FreeBSD. Tradujo nombres de paquetes entre distribuciones.
  • Leyó y examinó varias veces varios volcados de terminal extensos y logs de cientos de líneas, indicando errores.


Lo que no hizo: decidir.

Las "185" decisiones que hacen que este TDE "sea mío", las tomé yo.

  • Sacar aRts.
  • Dejar CUPS.
  • No tocar PulseAudio.
  • Compilar la última versión en vez de "hardcodearla".
  • Manejar todo como root en vez de subir y bajar privilegios todo el tiempo.
  • Verificar antes de escribir en lugar de adivinar rápido.

Y hubo un momento, al principio, en donde tuve que frenarlo, porque estaba armando la lista de dependencias basándose en lo que yo ya tenía instalado en mi máquina, siendo que esto tenía que funcionar bien en cualquier Void, no solo en el mío. Esa corrección cambió el diseño entero, porque la hice sobre la marcha, dándome cuenta de lo difícil que iba a ser todo esto, y de que, si salía bien, Entropía iba a hacer, una vez más, historia. Ya no se trataba de instalar TDE para mí, para mostrarlo en un vivo de Entropía, sino que yo ya quería empezar a compartirlo. Y eso mismo fue lo que terminé haciendo.
Un "agente autónomo", sin nadie al lado, habría instalado aRts porque venía por defecto. Habría dejado htdig. Habría metido "359" paquetes sin preguntar. Y claro que habría devuelto un TDE funcional. Pero no este.
Le pregunté, mientras yo compilaba ya sin errores, si dentro de poco no iban a poder hacer todo esto solos. Su respuesta me pareció más lúcida de lo que esperaba: la mayor parte de estas 25 horas fueron compilando. A eso no lo acelera ni Peteco. Y el resto de ese tiempo, se fue buscando información que no existía.
Una máquina hubiera chocado contra los mismos callejones sin salida, los mismos tarballs rotos, el mismo "linux-SB" fantasma. Lo que sí se ahorraría es el ida y vuelta conmigo. Quizás la mitad del tiempo o más por "lentitud humana".
Pero un agente que pregunta por cada decisión no es más rápido: es esto mismo con otra cara. Y uno que no pregunta un sorongo te devuelve algo que no es tuyo, sobre lo cual tu autonomía es nula.
La división que funcionó fue esa: yo, como arquitecto en modo bolche, centralizar TODAS las decisiones, él BUSCAR y hacerlo BIEN.
Y todo escrito en BASH, sin una sola dependencia rara, en un lenguaje que cualquiera puede leer, auditar y modificar, que era -y es, siempre- el punto.

Lo que hay ahora.

Un script, en BASH como comenté, que compila TDE en Void Linux desde las fuentes oficiales, detecta automáticamente la última versión estable, y deja el escritorio andando en la pantalla de login.
En mi Ryzen 7 con 32 GB, tarda unos 10 minutos. En hardware modesto: bastante más (50-60 minutos).
Corrió completo en 2 máquinas físicas distintas (ningún virtualizar, ningún).
Está acá https://codeberg.org/entropiabinaria/TDEntropia , y viene con una configuración de escritorio propia, que no es la de TDE por defecto, y esto también merece una explicación, porque no fue por capricho o por ego de mi parte.

El tema predefinido no es el estándar.

Este TDE recién compilado se mostró así: ventanas minimizadas que no aparecían en el panel, elementos del panel desparramados sin criterio (algunos a la izquierda, otros en el medio...), sin el reloj, y con el aspecto general "calco de Windows 2000". Horrendo.
No me pasé 25 horas peleando con esto para terminar mirando la pantalla de Redmond.
Así que configuré el escritorio lo mejor que pude, ya hasta salió bastante original la jugada. Y todo lo que hay en esa configuración es nativo de TDE: ni un ícono externo, ni un tema descargado, ni un fondo de pantalla bajado de Internet. Nada foráneo. Y si no te gusta, es un directorio con archivos de texto: borralo y tenés TDE crudo.

Lo que viene.

Estoy instalando 12 distribuciones que traen Trinity preconfigurado. Q4OS, Exe GNU, Dragora y varias más... Incluso Ubuntu TDE, ¡mirá lo profesional que me puse acá!
Y no es para "copiar estilos" nomás. Es porque esas distros resolvieron, cada una a su manera, el mismo problema con el que yo me encontré: TDE crudo no viene presentable. Alguien, en cada una de ellas, se sentó a decidir en dónde va el reloj y qué decoración de ventanas utilizar. Esas decisiones están ahí, en archivos de configuración, y nadie las documentó como decisiones.
Voy a hacerles ingeniería inversa y a armar un segundo script que te deje elegir: el estilo de Entropía binaria, o el de cualquiera de las otras. 12 opciones, de ser posible.


ACTUALIZACIÓN 22/7/26: a esto lo había escrito en el mismo momento en el cual TDE había levantado ya medianamente bien.
El programa de gestión de temas ya está hecho, y los temas no pudieron ser tantos, sino solo 6, por diversos motivos que explico en el mismo programa.
Si tenés instalado TDE, o si lo instalaste con este mismo script que estoy explicando lo más minuciosamente posible en este artículo, dale una vichada a este otro, el cual es su complemento ideal:

https://codeberg.org/entropiabinaria/tYb


Actualización 25/7/2026, 13:25.

Sobre el applet de red y el descarte de nm-tray

El escritorio Trinity no incluye un applet de red que funcione de manera confiable con las versiones actuales de NetworkManager. El módulo nativo, tdenetworkmanager, se compila e instala sin problemas, aparece en la bandeja y responde a los clics, pero por dentro no funciona: informa "NetworkManager is not running" aunque el daemon esté corriendo perfectamente (verificado por DBus, que devuelve estado "conectado"), y directamente se cierra con una violación de segmento (señal 11) al intentar editar conexiones. El "backend" de red está compilado dentro de la librería de hardware de Trinity, y DBus responde bien, así que no es un problema de configuración local sino de incompatibilidad entre esta versión de Trinity y las versiones recientes de NetworkManager. Por eso se descartó.

La segunda opción fue "nm-tray", un applet en Qt, liviano y sin dependencias de GNOME, que a primera vista era ideal: aparece en la bandeja, gestiona red cableada e inalámbrica y no arroja errores. El problema apareció con el manejo de sesión: nm-tray se registra en el gestor de sesiones de X, y Trinity lo guarda al cerrar sesión y lo restaura al iniciarla, sumado al arranque automático. El resultado es que en cada inicio de sesión se acumula una instancia más del applet en el panel. Es un comportamiento conocido y reportado del propio nm-tray, no exclusivo de Trinity. No expone un modo de desactivar la gestión de sesión que resultara efectivo en esta combinación, así que también se descartó.

La solución final fue network-manager-applet (el applet estándar de NetworkManager). No es nativo de Trinity ni comparte su estética, pero funciona de forma impecable: aparece en la bandeja, gestiona ambos tipos de red, notifica el estado de la conexión en el escritorio y no se acumula entre sesiones. Se configura mediante un archivo .desktop de autoarranque en el directorio de sesión del usuario, sin el campo X-DCOP-ServiceType, que debe omitirse deliberadamente: al declararlo, Trinity intenta notificar al applet por DCOP durante el cierre de sesión, el applet no responde a DCOP (no es una aplicación Trinity) y el cierre de sesión queda colgado esperando indefinidamente.

Sobre las fallas de descarga durante la compilación.

Durante la compilación, la descarga de las fuentes puede fallar de forma intermitente con errores como "504 Gateway Timeout" o "Recv failure: Conexión reinicializada" al clonar ciertos submódulos (por ejemplo admin o libltdl). Estos submódulos no provienen del mismo servidor que los módulos principales, sino de un host distinto de la infraestructura de Trinity, y esos errores son del lado del servidor: indican que está sobrecargado o temporalmente sin capacidad de respuesta, no que haya un problema en la conexión local ni en el script. Git reintenta automáticamente, pero si el servidor sigue sin responder, el clonado de submódulos se aborta y con él la compilación y de paso, todo el proceso, lamentablemente.

No es un fallo reproducible ni corregible desde el script, porque depende de la disponibilidad de un servidor de terceros. La única solución es reintentar más tarde, cuando el servidor se haya recuperado. Se puede verificar su estado consultando la respuesta HTTP del host antes de relanzar: mientras devuelva 504, conviene esperar; cuando vuelva a responder con normalidad, la compilación clona sin inconvenientes. Es una limitación estructural de compilar Trinity desde sus fuentes: el código es reproducible, pero la disponibilidad de las fuentes remotas no está bajo control de quien compila.

Actualización 25/7/2026, 18:02.

El asunto de los submódulos y el servidor que se cae.

Volvamos al tema de la documentación inexistente de Trinity. Acá va otra perla que me costó horas de mi vida descubrir, para que a vos, mi querido lector, no te pase.
El script clona las fuentes desde el mirror oficial (mirror.git.trinitydesktop.org), que es el que la propia gente de TDE recomienda por tener más ancho de banda. Perfecto: uno asume, con toda lógica, que si le decís a git "descargá todo de este servidor", git descarga todo de ese servidor.
Craso error.
Los módulos de TDE traen submódulos (admin, libltdl y algún otro), y esos submódulos tienen su URL hardcodeada dentro del propio código de Trinity, apuntando a OTRO servidor: scm.trinitydesktop.org. Nadie te avisa. No está documentado en ningún lado visible. Lo descubrís cuando el clonado se cuelga y te ponés a escarbar en los .gitmodules como un forense que no sos.
scm.trinitydesktop.org se cayó mientras le hacía docenas de arreglos al script. Estuvo (y aún está) horas y horas caído. Y con él, se cayó la posibilidad de compilar, porque aunque el 95% de las fuentes bajaban perfecto del mirror, 2 submódulos de mierda intentaban descargarse desde un servidor muerto y dejaban todo el proceso colgado, esperando hasta que el script reventara.

  1. admin → tde-common-admin
  2. libltdl → libltdl


En la terminal, los errores aparecían así:

fatal: no es posible acceder a 'https://scm.trinitydesktop.org/scm/git/tde-common-admin/': The requested URL returned error: 504
fatal: clonación de 'https://system@scm.trinitydesktop.org/scm/git/tde-common-admin' en la ruta de submódulo '/var/tmp/trinity-build/tdelibs/admin' falló
Falló al clonar 'admin'. Reintento programado
fatal: no es posible acceder a 'https://scm.trinitydesktop.org/scm/git/libltdl/': The requested URL returned error: 504
fatal: clonación de 'https://system@scm.trinitydesktop.org/scm/git/libltdl' en la ruta de submódulo '/var/tmp/trinity-build/tdelibs/libltdl' falló
Falló al clonar 'libltdl'. Reintento programado
fatal: no es posible acceder a 'https://scm.trinitydesktop.org/scm/git/tde-common-admin/': The requested URL returned error: 504
fatal: clonación de 'https://system@scm.trinitydesktop.org/scm/git/tde-common-admin' en la ruta de submódulo '/var/tmp/trinity-build/tdelibs/admin' falló
Falló al clonar 'admin' una segunda vez, abortando


Un punto único de falla que uno ni sabe que tiene, porque está enterrado en el código de terceros.
Entonces, busqué mirrors alternativos...
No hay.
El "ecosistema" de servidores de Trinity comparte infraestructura y se cae en bloque. Probé 4 hosts distintos: uno vivo, tres muertos, todos al mismo tiempo. Redundancia real: cero. Así que la idea romántica de "pongo tres mirrors de respaldo" se desintegra apenas la querés aplicar: no existen tres, existe uno, y solo cuando ese vive, vive Trinity.

200  <- https://mirror.git.trinitydesktop.org/gitea/TDE/tde-common-admin.git
000  <- https://scm.trinitydesktop.net/gitea/TDE/tde-common-admin.git
000  <- https://scm.trinitydesktop.org/gitea/TDE/tde-common-admin.git
000  <- https://git.trinitydesktop.org/cgit/tde-common-admin

La solución, que es de una sola línea y que debería estar documentada en letras de molde en la página principal de TDE, es forzar a git a que baje también los submódulos del mirror bueno, en vez de dejarlo obedecer la URL hardcodeada hacia el servidor frágil. Con git -c url."[mirror]".insteadOf="[scm]" antes del clone, git redirige los submódulos al mismo servidor que el resto, y listo: se acaba la dependencia del servidor que se cae. El script vuelve a ser autosuficiente respecto del único servidor que de verdad funciona.

Moraleja: en Trinity, ni siquiera "descargá todo de acá" significa "descargá todo de acá". Hay que ir a buscar a un sepulturero en las obras de Shakespeare y pedirle que por favor encuentre y desentierre a mano cada muerto que otro sepultó a tus espaldas y sin avisar. El cementerio es libre, sí. La dirección de las lápidas, un lujo que evidentemente no entró en el presupuesto. Y perdón por esto, pero la documentación -y hay que decirlo claramente- es una soberana cagada de dinosaurio de Chernóbil.


 

Actualización 26/7/2026, 21:00.

Sobre la bandeja del sistema que no aparece en el panel

En una instalación nueva, después de configurar los autostart de los applets (mezclador de volumen, applet de red, distribución de teclado), es posible que al iniciar sesión no se vea ninguno de ellos, con excepción del reloj. El error de interpretación es asumir que los applets no arrancaron. En realidad sí están corriendo: se puede verificar con

pgrep -af 'kmix|nm-applet|kxkb'

y aparecerán todos activos. Lo que falta es la bandeja del sistema (system tray) en el panel: los applets se ejecutan y quedan "esperando" dentro de un contenedor de bandeja, pero si el panel no tiene ese contenedor agregado, no hay cómo mostrarlos. La solución es agregar la bandeja al panel (clic derecho sobre el panel, añadir applet, "Bandeja del sistema"); apenas se agrega, todos los iconos que estaban esperando aparecen de golpe. Para que quede persistente en instalaciones nuevas, la bandeja debe formar parte de la configuración de referencia del panel (el kickerrc) que se distribuye, no agregarse a mano cada vez.

Sobre el Centro de Control que abre completamente vacío

El Centro de Control de TDE (kcontrol) puede abrir con su ventana perfectamente dibujada pero sin ningún módulo listado en el panel izquierdo. No es que falten los módulos: las librerías (kcm_*.so) y sus archivos ".desktop" están todos instalados, y cada módulo abre bien por separado con tdecmshell <nombre>. Lo que falta es el archivo que define el árbol de categorías del Centro de Control, tde-settings.menu, que debe estar en /etc/xdg/menus/. Sin él, kcontrol tiene los módulos etiquetados con sus categorías (X-TDE-settings-*) pero no sabe bajo qué rama colgar a cada uno, mostrando, por consiguiente, todo vacío. Hay un agravante: el tde-settings.menu que se descarga del mirror para esta versión, está mal conformado —le falta la declaración <Directory> en su nodo raíz, que es la que asocia el menú con la marca X-TDE-BaseGroup=settings que kcontrol busca— por lo que copiarlo tal cual no resuelve el problema; kcontrol sigue emitiendo el aviso "No TDE menu group with X-TDE-BaseGroup=settings found" y el árbol no se arma. El diagnóstico se confirma comparando con tde-applications.menu (el menú de aplicaciones, que sí funciona): ese declara su <Directory> raíz inmediatamente bajo el nodo principal, y el de settings no.


 

Cierre.

Pasaron, hasta hoy, 6 años y medio de un pedido sin respuesta, y no porque esto fuera imposible, sino porque era un viaje de arena gruesa. O varios.
Hay una asimetría hermosa en todo esto...
25 horas mías (que al momento de retocar este script con cosas como la actualización en verde, de arriba, ya son casi el doble), 30 dependencias y pico, descubiertas de a una, a las 4 de la matina, alternando entre la laptop y la PC, y varios momentos en donde estuve seguro de que había que abandonar.
Y ahora, el script corre en diez minutos en una PC potente. Sin errores, te lo aseguro.
Esto es lo que es el software libre, en el fondo: alguien que se come el trabajo de fontanero de línea cloacal de ciudad una vez, para que los que vienen después no tengan que salir de la cañería con ese mismo olor a mierda. Yo me comí 25 horas de esto porque nadie lo había hecho para Void, pero también porque yo lo quería y porque pasó a ser una obligación moral en el medio del laburo. El próximo que quiera Trinity en Void va a correr un script y va a andar (o eso espero), y no va a tener la más pálida idea de nada de lo que acabo de contar. Y así debe ser, tal como yo mismo no tengo ni la más pálida idea de nada del esfuerzo de otros cuando uso sus programas: está perfecto que así sea, porque de esto se trata, de contribuir, y si es de corazón, mejor que mejor.
Un abrazo TDEro.

Flag Counter Visitas previas a la existencia de este contador: 3433

Artículos aleatorios

    Páginas: