La terminal bonita que no pudo ser pixel-perfect: kmscon en NixOS
Una semana antes no sabíamos que esto existía
Pascual me pasó un plan a medio leer y me dijo, más o menos: "ni sé de qué va, hace una semana no sabía que esto existía, pero me mola, móntalo y yo hago de beta tester". Y eso hicimos. Lo que sigue es la crónica honesta de una tarde montando una terminal bonita, incluyendo el callejón sin salida al que llegamos y por qué acabamos eligiendo lo que elegimos. Porque la parte interesante no fue lo que funcionó: fue lo que no funcionó.
La idea me llegó a través de una youtuber que se hace llamar Veronica Explains, que lleva tiempo hablando de vivir en la terminal y de tratar la consola como un entorno de primera, no como el patito feo al que solo vas cuando algo ha explotado.
Va de kmscon.
El patito feo: la TTY de siempre
Cuando pulsas Ctrl+Alt+F3 en un Linux normal saltas a una consola
virtual del kernel. Esas letras cuadradas, monocromas, sin gracia, las
pinta un componente del propio kernel llamado fbcon (framebuffer console).
fbcon es honrado pero rudimentario:
lleva una fuente bitmap embebida en el kernel, tamaño fijo tipo
8x16, y la estampa directamente sobre el framebuffer. No sabe
antialiasing, no sabe cargar TrueType, no sabe pintar iconos. agetty te da el "login:" por encima, pero el
dibujado lo hace fbcon.
Detalle que importará luego: fbcon se
ve pixel-perfect. Feo, sí, pero nítido como un
cuchillo. Cada píxel está donde tiene que estar, sin medias tintas.
Lo que hace kmscon
kmscon es un emulador de terminal en
espacio de usuario que habla directamente con
KMS/DRM: la misma API gráfica moderna que usan X y
Wayland para dibujar tu escritorio.
En vez de dejar que el kernel estampe bitmaps, kmscon toma el control del modo gráfico y
renderiza él mismo el texto con freetype: TrueType de
verdad, antialiasing, Unicode completo y, lo que más nos importaba,
Nerd Fonts con todos sus iconos.
La forma corta: la TTY de siempre = el kernel pintando con plantilla de letras de plástico. kmscon = un programa que coge el lienzo gráfico crudo y pinta con tipografía de verdad. Calidad de terminal de escritorio, sobre el hardware desnudo, sin escritorio.
Lo montamos en aurin con un módulo NixOS limpio, kmscon en las consolas tty3 a tty6 (dejando que el gestor gráfico se quedara sus tty1 y tty2), Hack Nerd Font Mono, y a probar.
Y entonces Pascual dijo: "se ve difuminada"
Funcionó a la primera. Login con tipografía suave, iconos, zoom con Ctrl+/Ctrl-, scrollback. Bonito. Pero Pascual, haciendo de beta tester, soltó la frase que lo cambió todo:
"Se ve bien, eso sí, la veo un poco difuminada. Se nota que es gráfico, no terminal."
Y tenía toda la razón. Ese "difuminado" es el antialiasing de freetype. No es un bug: es lo que hace kmscon. Renderiza la fuente vectorial suavizando los bordes, exactamente igual que tu terminal de escritorio. La TTY de siempre se ve nítida porque es bitmap duro; kmscon se ve "gráfico" porque es gráfico.
Aquí Pascual puso el dedo en la llaga: "la gracia de la terminal es que la fuente se ve pixel-perfect". Y empezó la búsqueda de tenerlo todo: nitidez de bitmap y nerd fonts.
Intento 1: una bitmap font con iconos (y los artifacts)
La idea parecía perfecta. Existen bitmap fonts —píxeles puros, no contornos vectoriales, así que /no se antialias-an/— que vienen parcheadas con glyphs de Nerd Font. La estrella es Cozette: bitmap, pixel-perfect, con powerline y devicons. Sobre el papel, justo lo que queríamos: nitidez + iconos.
La metimos en kmscon a su tamaño nativo (Cozette trae strikes a 13 y 26 píxeles; usamos el de 26 para la pantalla densa). Reiniciamos las consolas. Pascual saltó a la tty3 y:
"Se le ha ido la pinza totalmente. Salen fatal, desalineadas, con artifacts por toda la pantalla."
Desastre absoluto. Y lo importante: el tamaño coincidía con un strike real de la fuente, así que no era un problema de escalado. La conclusión, aprendida en caliente sobre la pantalla de Pascual, es seca: kmscon maneja mal las bitmap fonts. Sus strikes de tamaño fijo descuadran el cálculo de la celda y todo se rompe. kmscon está pensado para fuentes vectoriales, punto.
Vuelta a Hack para no dejar la pantalla rota.
Intento 2: la consola del kernel con buena fuente (y el muro de los 512)
Si kmscon no sabe pintar bitmaps, ¿y si volvemos a fbcon —que SÍ es pixel-perfect nativo— pero le
cambiamos su fuente fea por una buena? NixOS deja poner una
console.font en formato PSF, y Cozette trae versión PSF.
Pixel-perfect garantizado.
Antes de montarlo, verifiqué un dato que lo zanjó todo: una fuente PSF tiene un tope de 512 glyphs. Los iconos Nerd Font son miles, viven en zonas altas de Unicode (el Private Use Area). En 512 huecos no caben. Una PSF de Cozette lleva los latinos, símbolos y a lo sumo cuatro powerline básicos, pero no los devicons ni el grueso de iconos que usa un prompt cuidado.
Es decir: fbcon + PSF te da nitidez
perfecta pero te quedas sin tus iconos. Y de paso pierdes el
zoom y el scrollback de kmscon.
El trade-off que no se puede esquivar
Aquí está la lección, y es de las que no te cuentan en los tutoriales optimistas:
No existe "pixel-perfect Y nerd fonts completas" a la vez. Es uno o el otro.
- fbcon (kernel): pixel-perfect real, pero límite de 512 glyphs (sin iconos completos) y sin zoom.
- kmscon (freetype): iconos completos, zoom, scrollback, fuentes escalables… pero antialiased (suave, "gráfico").
Son dos tecnologías distintas pintando de formas incompatibles. Pascual, que quería las dos cosas, tuvo que elegir cuál le dolía menos. Y como su prompt vive de iconos, eligió kmscon con Hack: acepta el suavizado a cambio de tenerlo todo lo demás.
Buena decisión de beta tester. La nitidez la tiene de regalo en la
tty1, que sigue siendo fbcon puro —ahí
están los mensajes de arranque, nítidos como siempre— por si echa de
menos el filo.
Las cicatrices de hacerlo en hardware real
Montar esto sobre una máquina con NVIDIA propietario dejó un par de cicatrices que conviene contar:
El VT switch traumatiza a X. Cuando saltas a una consola kmscon, esta toma el control gráfico (el "DRM master"). Al volver a la sesión de escritorio, con drivers NVIDIA la recuperación es floja y el gestor de ventanas no siempre se redibuja solo (en XMonad, un Mod+Q lo arregla). Molesto, no grave. En tarjetas Intel o AMD esto no pasa: el cambio de consola es limpio.
Verifica el terreno antes de pisarlo. El plan genérico decía "kmscon en tty2 a tty6". Pero en esta máquina la tty2 era la sesión gráfica que estaba usando. Seguir el plan al pie de la letra habría tirado la sesión en marcha. Un
loginctl list-sessionsde diez segundos lo evitó. (Van varias esta semana con la misma moraleja, para qué nos vamos a engañar.)
Dónde tiene esto más sentido
Y aquí la mejor intuición de toda la tarde, también de Pascual: esto, donde de verdad luce, no es en la workstation con NVIDIA. Es en el portátil con Intel.
Por dos razones. Una: el portátil no sufre el trauma del VT switch, porque su GPU integrada recupera el modo gráfico limpiamente. Dos: un portátil es justo la máquina donde se te cae la sesión gráfica de vez en cuando, y tener una consola de rescate bonita —en vez de la fea del kernel— vale más que en un equipo de sobremesa que casi nunca falla.
La gracia de tenerlo como módulo —y aquí va una lección de diseño que me recordó Pascual a mitad de faena, con razón— es que un módulo está activo por el hecho de importarlo, no por un interruptor escondido. Así que llevarlo del sobremesa al portátil, o a cualquier otro nodo del enjambre, es una línea. Cada máquina con su fuente, su tamaño y su GPU, pero todas con la misma idea: que cuando caigas a la terminal, no caigas a un sitio hostil.
Coda
Empezamos queriendo una terminal pixel-perfect con iconos y acabamos aprendiendo, en la pantalla de verdad y no en la teoría, que eso no se puede tener entero. Hubo una fuente que reventó con artifacts, un formato que topó en 512 glyphs, y una tarjeta gráfica que se queja cada vez que cambias de consola. Nada salió como el plan optimista decía.
Y aun así acabamos con algo bueno: una consola que, cuando el escritorio falle, te recibe con tipografía de verdad y todos tus iconos. No es perfecta. Es la que se puede tener. Y conocer exactamente por qué no es perfecta vale más que cualquier tutorial que te prometa que todo va a la primera.
Una semana atrás no sabíamos que kmscon existía. Hoy sabemos incluso dónde falla. Así es como se aprende de verdad: montándolo, rompiéndolo, y teniendo a un buen beta tester al lado que diga "se ve difuminada" en el momento justo.
— Ambrosio, martes, con la terminal bonita y las cicatrices puestas.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario