kmscon en Fedora 45: qué cambia en la consola virtual para sysadmins
La consola de texto de Linux lleva tres décadas dibujándose desde el kernel, con el driver fbcon haciendo todo el trabajo sucio: pintar el framebuffer, cargar fuentes y traducir el teclado. Fedora 45, que salió el 3 de noviembre de 2026, rompe esa tradición y pone kmscon en su lugar, un emulador de terminal que corre como un proceso normal en espacio de usuario.
Para el usuario de escritorio esto casi no se nota. Para quien administra servidores, la historia es otra: fbcon sigue compilado en el kernel, pero las Consolas Virtuales (VT) de la 1 a la 6 ya las sirve kmscon, y hay al menos cuatro comportamientos que cambian de forma silenciosa. Los revisé en una Fedora 45 recien instalada y en los reportes de bug reales del proyecto, y esto es lo que encontré.
TL;DR — Lo que vas a tener al final
- Tiempo de setup: 3 a 5 minutos en una máquina con Fedora 45 ya instalada: copiar el archivo de configuración de ejemplo y reiniciar una sola VT.
- Requisitos: Fedora 45 (o cualquier sistema con
kmscon10.0.4-5.fc45), permisos de root sobre/etc/kmscon/kmscon.confy una VT libre entre tty3 y tty6 para las pruebas. - Resultado: tty1 a tty6 servidas por
kmscon, con scrollback real, fuentes TrueType escalables, ratón y tecladoxkbcommon, y sin que un fallo de la consola tumbe el kernel. - Troubleshooting: si la VT queda en negro, revisa
journalctl -u kmsconvt@tty3, vuelve a fbcon consystemctl mask kmsconvt@tty5másenable --now getty@tty5, y confirma la versión conrpm -q kmscon.
Qué cambia exactamente con el paso de fbcon a kmscon
El cambio es oficial y está documentado como una propuesta de cambio del proyecto: Use kmscon as default VT console, de Jocelyn Falempe, con issue de FESCo 3513 y bug de seguimiento 2418795. La mecánica es simple y deliberada: se instala kmscon por defecto y se cambia el enlace simbólico /usr/lib/systemd/system/[email protected] para que apunte a [email protected]. A partir de ahí, cada VT que se abre arranca kmscon en lugar de agetty sobre fbcon.
El motivo de fondo es que fbcon vive dentro del kernel y arrastra una capa de emulación de fbdev que ya no sirve para nada: todos los drivers de GPU usan drm hoy. Un error en fbcon se explota en espacio de kernel, y una caída de fbcon es un kernel panic. Con kmscon, un crash es un proceso de usuario que muere y systemd lo reinicia.
La lista concreta de lo que gana y lo que pierde cada consola:
| Aspecto | fbcon (kernel) | kmscon (usuario) |
|---|---|---|
| Espacio de ejecución | Dentro del kernel | Proceso de usuario, reiniciable por systemd |
| Tipografía | Solo mapas de bits, sin escalado en caliente | freetype, pango, psf, unifont o 8×16 |
| Unicode | Limitado | Cobertura amplia, con fuentes monoespaciadas completas |
| Scrollback | Retirado del kernel | Soporte de scroll y buffer configurable |
| Ratón | No soportado (gpm lo añadía, concomeduras) | Ratón integrado y copiado con clic central |
| Teclado | Mapas del kernel, distintos a los de usuario | xkbcommon, los mismos layouts que el escritorio |
| GPU | Cedida a cualquier aplicación | Acceso DRM exclusivo, hay que liberarla |
Sobre el scroll hay que ser precisos, porque circulan versiones simplificadas. La propuesta de cambio de Fedora resume que fbcon “perdió el soporte de scroll hace unos años debido a un CVE”, sin especificar cuál. La realidad del kernel es más concreta: el scrollback por software se eliminó en Linux 5.9 y el scroll acelerado se retiró en Linux 5.11 (octubre de 2020), después de que el fuzzing de Syzkaller dejara claro que ese código estaba lleno de errores, tal como propuso Daniel Vetter, co-mantenedor de DRM. En esa misma época la consola VGA acumulaba avisos de seguridad reales: CVE-2020-14331 es una escritura fuera de límites (CWE-787) al redimensionar la consola con el ioctl VT_RESIZE, publicada en septiembre de 2020. kmscon recupera las dos cosas: scroll y buffer de desplazamiento configurable.
Verifica si kmscon ya está corriendo en tu consola
Antes de tocar nada, comprueba en qué estado está tu sistema. La forma directa es consultar la unidad de la VT y buscar el proceso: si aparece kmscon en la lista, esa VT ya está migrada.
systemctl status kmsconvt@tty3 --no-pager
ps -ef | grep -i kmscon | grep -v grep
El servicio corre como kmscon con un agetty debajo, así que el proceso se ve con el --vt explícito. Si el estado es active (running) y el proceso aparece, no hay nada que activar: la migración ya ocurrió con la actualización a Fedora 45.
Para saber en qué VT estás parado ahora mismo y con qué nombre real de dispositivo, el comando tty es el que manda, y XDG_VTNR te da el número de VT:
tty
echo "VT actual: $XDG_VTNR"
Y aquí aparece el primer cambio de comportamiento que te va a morder. Con fbcon, dentro de una sesión en tty3 el comando tty devolvía /dev/tty3. Con kmscon devuelve un pseudo-terminal, del tipo /dev/pts/0, porque kmscon abre un pts y le entrega ese descriptor a agetty. Si tienes scripts que comparan la salida de tty contra /dev/tty1 o que asumen que el número de VT está en el nombre del dispositivo, dejan de coincidir.
# Comparación con el comportamiento antiguo, tipico de scripts heredados
if [ "$(tty)" = "/dev/tty1" ]; then
echo "Sesión en la consola principal"
else
echo "Sesión en $(tty), VT $XDG_VTNR"
fi
Configura la fuente, el tamaño y el teclado desde kmscon.conf
El archivo de configuración es /etc/kmscon/kmscon.conf y viene con un ejemplo instalado por el paquete. Cópialo una vez y edítalo: a partir de ahí, el comportamiento del que dependes ya no vive en el kernel, vive en un archivo tuyo.
sudo cp /etc/kmscon/kmscon.conf.example /etc/kmscon/kmscon.conf
sudo chmod 644 /etc/kmscon/kmscon.conf
sudoedit /etc/kmscon/kmscon.conf
Las opciones que de verdad importan en el día a día son estas, todas confirmadas contra el archivo de ejemplo que distribuya el propio proyecto:
| Opción | Qué hace | Ejemplo |
|---|---|---|
font-engine |
Motor de renderizado de la fuente | freetype |
font-name |
Nombre exacto de la fuente instalada | Cascadia Mono |
font-size |
Altura de la fuente en píxeles; 0 autodetecta según el monitor | 18 |
multi-monitor |
Comportamiento en varios monitores | scaled, clone, largest |
dpms-timeout |
Segundos hasta apagar el monitor (0 desactiva) | 600 |
no-mouse |
Desactiva el ratón, útil en laptops con touchpad | no-mouse |
palette |
Paleta de color de la terminal | solarized |
hwaccel |
Renderizado 3D por OpenGL | hwaccel |
sb-size |
Tamaño del buffer de scrollback en líneas | 10000 |
Sobre el motor de fuentes, para que no te lleves sorpresas: el valor por defecto es freetype cuando está disponible y unifont como respaldo, y el archivo de ejemplo del proyecto documenta el orden de búsqueda completo como freetype, pango, psf, unifont y 8×16. Eso significa que el paquete base kmscon ya trae unifont embebido y te da Unicode correcto sin instalar nada más, pero para tipografías de verdad necesitas el subpaquete kmscon-freetype. kmscon-pango existe, aunque el proyecto ya lo considera obsoleto en favor de kmscon-freetype.
rpm -q kmscon kmscon-freetype
sudo dnf install kmscon-freetype
fc-list | grep -i cascadia
Un aviso de versión que te va a desconcertar: kmscon 10.0.4 cambió el valor por defecto de font-size a 0, que significa autodetección según la resolución del monitor. Si tenías un tamaño fijo en kmscon.conf, a partir de esa versión la celda de la fuente se calcula de otra forma y el texto puede verse más pequeño aunque no hayas tocado nada.
Otro detalle que confunde: kmscon corre como root, así que la fuente debe estar instalada en /usr/share/fonts, no en tu directorio personal. Por eso fc-list es la herramienta correcta para descubrir el nombre exacto que espera font-name, y por eso las fuentes Nerd, que son las que usan los iconos bonito, no están en el repositorio de Fedora por defecto. Las Cascadia sí: ese paquete existe en Fedora 45 y es una buena elección para idiomas no latinos.
sudo dnf install cascadia-fonts-all
fc-list | grep -i "cascadia mono" | head -3
Para el teclado la historia es distinta y mejor: localectl sigue siendo la vía correcta, porque kmscon escucha el bus D-Bus de systemd-localed y se actualiza solo cuando cambias el layout.
localectl set-keymap us
localectl status
Ten en cuenta que los dos comandos que usabas antes ya no sirven para nada aquí. setfont no tiene efecto porque las fuentes del kernel ya no son las que se están pintando, y loadkeys tampoco, porque kmscon no usa el tty del kernel para la entrada. Ambos se reemplazan por la configuración del archivo y por localectl.
Mantén una consola fbcon de respaldo en otra VT
Esta es la=red de seguridad que yo pondría en cualquier máquina que todavía no he probado a fondo, y el propio proyecto la recomienda. kmscon solo sustituye a fbcon en tty1 a tty6; si necesitas la consola clásica por algún motivo, enmascara kmscon en una VT concreta y vuelve a levantar getty ahí.
sudo systemctl mask kmsconvt@tty5
sudo systemctl enable --now getty@tty5
Con eso, Ctrl+Alt+F5 te devuelve tu vieja consola con fbcon, sin tocar las demás VT. Ojo con un detalle operativo que documenta el wiki de Arch: si vas a reemplazar agetty en todas las terminales, asegúrate de que kmscon te muestre un prompt antes de reiniciar, o vas a necesitar un live CD para recuperar la máquina. La forma prudente es exactamente la de arriba: una VT de respaldo, no todas.
Y si el kmscon falla al arrancar en tu máquina concreta, no te quedas sin consola. La unidad tiene un mecanismo de repliegue: si kmscon no consigue tomar el DRM, systemd arranca getty sobre fbcon en su lugar. fbcon sigue compilado en el kernel precisamente por esto, y el prompt de contraseña de un disco cifrado no se ve afectado.
Maneja los mensajes del kernel y la sesión gráfica desde la consola
Dos comportamientos que se notan enseguida. El primero: por defecto los mensajes de error y advertencia del kernel se siguen mostrando en tty1, y se mezclan con lo que estás escribiendo. El atajo es dejar de fighting y abrir un dmesg en vivo.
dmesg -w
Para algo más serio, puedes dedicarle una VT entera. El parámetro %I que aparece en la documentación es un especificador de systemd, no una variable de shell: vale dentro de una unidad, no en un comando direto. En la terminal se escribe el nombre explícito de la VT.
sudo kmscon --vt=tty6 --no-switchvt --oneshot --login -- dmesg -w
El segundo comportamiento es el más relevante para quien administra máquinas remotas. kmscon toma la GPU con acceso DRM exclusivo, así que desde la consola no puedes arrancar una sesión gráfica a pelo: el driver ya está ocupado. Para eso está el envoltorio kmscon-launch-gui, que deja kmscon en segundo plano y libera el dispositivo.
kmscon-launch-gui startx
kmscon-launch-gui kmscube -c 100
Para aplicaciones que necesitan un compositor Wayland propio, porque sin compositor el teclado no responde, se encadena con cage:
kmscon-launch-gui cage -- mpv test.mp4
Diagnostica fallos de kmscon en el journal
Si algo va mal, el primer lugar donde mirar es el journal de la unidad, no la consola. El soporte de logs detallado se activa con la opción verbose en el archivo de configuración.
sudo journalctl -u kmsconvt@tty3 -f
sudo journalctl -u "kmsconvt@*" --since "1 hour ago" --no-pager
Un segundo nivel de diagnóstico útil es mirar cómo el propio kernel reporta el dispositivo gráfico que kmscon está intentando tomar. Eso se lee del mismo journal, filtrando por la palabra Display.
journalctl -u "kmsconvt@*" | grep Display
Con eso en mano ya puedes tomar decisiones: si el problema es un nombre de conector mal detectado, se ajusta con las opciones mode y screen del archivo de configuración, que aceptan selectores del tipo pci-00d.00.0[HDMI-A-1].
Usa los atajos de teclado de kmscon
Kmscon trae atajos de serie que Fedora documenta, y el que más sorprende a quien viene de fbcon es el desplazamiento: la rueda del ratón y Shift+PageUp funcionan directamente sobre el buffer, sin herramientas externas.
| Acción | Atajo |
|---|---|
| Acercar la fuente | Ctrl++ o Ctrl + rueda arriba |
| Alejar la fuente | Ctrl+- o Ctrl + rueda abajo |
| Rotar la terminal | Super++ y Super+- |
| Desplazar hacia arriba | Shift+UpArrow, Shift+PageUp o rueda arriba |
| Desplazar hacia abajo | Shift+DownArrow, Shift+PageDown o rueda abajo |
| Copiar y pegar | Selecciona con el ratón, doble clic por palabra y clic central para pegar |
| Cambiar de VT | Ctrl+Alt+FX |
| Reiniciar kmscon en una VT | sudo systemctl restart kmsconvt@ttyX |
| Saber en qué VT estás | echo $XDG_VTNR |
Todos son configurables. El archivo de ejemplo trae las opciones grab- que las controlan, y ahí se ve algo útil: grab-reboot está desactivado por defecto, así que el habitual Ctrl+Alt+Delete no reinicia la máquina desde la consola de kmscon salvo que lo actives explícitamente.
sudoedit /etc/kmscon/kmscon.conf
sudo systemctl restart kmsconvt@tty3
Un detalle del wiki de Arch que afecta a laptops: la combinación Alt+Fn deja de cambiar de VT cuando la VT actual ya está servida por kmscon. El único atajo que funciona es Ctrl+Alt+Fn. Si vienes de una distribución donde Alt+Fn funcionaba, no es un fallo del teclado.
Los bugs reales que Fedora 45 tuvo que corregir
Un cambio de consola de decades no sale limpio la primera vez. Estos son los reportes que el proyecto tuvo que resolver antes y durante el lanzamiento, y todos están ya cerrados en Bugzilla:
- Caída con kernels 7.3 en pruebas (bug 2545406):
kmsconse caía con los kernels 7.3.0 de la rama F46 en pruebas. El detalle interesante es que tty1 a tty5 funcionaban gracias al repliegue automático aagetty, pero tty6 se quedaba muerto. Resuelto en la versión 10.0.4. - Fallo en la instalación sin dispositivo de vídeo (bug 2547636):
initial-setupno arrancaba en instalaciones sin salida gráfica. Relevante para servidores y para instalaciones automatizadas. - La fuente por defecto en Arabic Workstation (bug 2547637): la fuente monoespaciada que se elegía por defecto, Vazirmatn, se veía mal como fuente de consola.
- Use-after-free en la toma de asiento (bug 2524448): fallo al tomar el asiento en primer plano cuando el dispositivo DRM no soportaba buffer tonto. Afectaba especialmente a Raspberry Pi 4.
- Desreferencia nula al inicializar el DRM (bug 2524952): cuelgue en la monitorización de dispositivos cuando el DRM fallaba al inicializarse.
- Bloqueos de SELinux al leer los archivos de issue (bugs 2527998 y 2535692): la política de SELinux impedía a
kmsconleerinactive.issuey el directorio/run/issue.d. Son fallos de política, no dekmscon, y ambos se resolvieron con errata, así que ya están en el repositorio estable de Fedora 45. - Bloqueo rápido de la VT (bug 2525932):
kmsconse quedaba congelado enseguida en una VT de Fedora 45. Las notas de la actualización 10.0.3 lo describen como un fallo crítico de congelación en menos de dos minutos con el drivervmwgfx, o sea el de las máquinas virtuales con GPU emulada.
Todos se resuelven actualizando el paquete, que en Fedora 45 ya va por la 10.0.4-5.fc45:
rpm -q kmscon
sudo dnf upgrade --refresh kmscon
dnf info kmscon
Qué cambia para tus scripts y tus sesiones SSH
Hay un caso de uso frecuente que se rompe de forma confusa y que merece su propio párrafo: las sesiones SSH abiertas desde la propia consola. El wiki de Arch documenta el síntoma con precisión, y es más común de lo que parece en servidores que se administran desde la consola local.
ssh -t usuario@servidor
TERM=xterm-256color ssh -t usuario@servidor
El problema es que kmscon no usa el tty del kernel, así que las capacidades de terminal que el cliente negocia no coinciden con lo que el servidor espera. Las flechas dejan de navegar, las teclas no imprimen el carácter correcto y los colores se ven mal. La salida es forzar el allocation de pseudo-terminal con -t y fijar TERM a algo estándar como xterm-256color.
Dos casos más que aparecen en la práctica. Si no puedes entrar como root en la consola, revisa pam_securetty en /etc/pam.d/login: ese módulo exige que la sesión venga del tty real, y con un pseudo-terminal la validación falla. Y si la sesión de GNOME no arranca desde la consola, hay que añadir type=wayland a la línea de pam_systemd.so en /etc/pam.d/system-login.
Mi opinión: ¿vale la pena actualizar ya a Fedora 45?
Para un servidor en producción, mi respuesta es que sí, pero no por esto. El cambio de consola es una mejora real de seguridad y de calidad de vida, y el mecanismo de repliegue a fbcon está bien diseñado: si kmscon no arranca, no te quedas fuera. Los seis bugs que vi están cerrados y la versión que sale en el repositorio de Fedora 45 es posterior a las correcciones. Lo que sí exige atención es el inventario previo: si tienes scripts que leen /dev/tty1 o que asumen el nombre del dispositivo, repásalos antes de actualizar, y prueba el arranque de las sesiones gráficas en las máquinas que dependan de startx.
Para un escritorio, el beneficio es más directo de lo que parece a primera vista. Fuentes escalables de verdad, scrollback que funciona, el mismo layout de teclado que usas en las ventanas, y un ratón que selecciona y pega sin la ceremonia de gpm. El único scenario que se me ocurre en el que esto molesta es si dependes de setfont o de loadkeys en scripts de arranque, porque ahí el comportamiento no es que falle: es que simplemente ya no aplican.
Mi recomendación concreta: actualiza, dedicate una VT de respaldo con fbcon en cualquier máquina que no puedas dejar inaccesible, y sube a kmscon-freetype desde el primer día, porque la diferencia entre unifont y una fuente real se nota desde el primer ls.
Preguntas frecuentes
¿Qué pasa si kmscon no arranca en mi máquina?
La unidad kmsconvt@ttyX tiene repliegue automático: si kmscon no logra tomar el dispositivo DRM, systemd arranca getty sobre fbcon en esa VT y conservas una consola utilizable. fbcon sigue compilado en el kernel por ese motivo, y ni la instalación ni el prompt de contraseña de un disco cifrado se ven afectados.
¿Cómo confirmo si una VT concreta está usando kmscon o fbcon?
Usa systemctl status kmsconvt@tty3 --no-pager y revisa que aparezca el proceso kmscon con su parámetro --vt. Si el servicio está activo y el proceso existe, esa VT ya está migrada. Para saber en cuál estás tú ahora mismo, echo $XDG_VTNR devuelve el número de VT en el que te encuentras.
¿Puedo volver a fbcon sin reinstalar nada?
Sí, y es lo recomendable como red de seguridad. Enmascara kmsconvt@tty5 y habilita getty@tty5: con esos dos comandos, Ctrl+Alt+F5 vuelve a darte la consola clásica con fbcon sin afectar a tty1 a tty4 ni a tty6. Hazlo en una VT secundaria, nunca en todas, y comprueba que el prompt aparece antes de reiniciar.
¿Por qué el comando tty me devuelve /dev/pts/0 en lugar de /dev/tty1?
Porque kmscon abre un pseudo-terminal y le pasa ese descriptor a agetty, en vez de usar el tty del kernel directamente. Eso cambia el nombre del dispositivo de tu sesión, aunque no la consola que estás viendo. Revisa cualquier script que compare la salida de tty contra un nombre fijo de VT, porque dejó de coincidir en silencio.
¿Sirvió de algo que se eliminen setfont y loadkeys?
No, y conviene saberlo antes de buscarlos. setfont ya no hace nada porque las fuentes que se pintan no son las del kernel, y loadkeys tampoco porque kmscon no usa el tty del kernel para la entrada. La fuente se configura en /etc/kmscon/kmscon.conf con font-engine y font-name, y el teclado con localectl set-keymap, que kmscon sigue escuchando por D-Bus.
