Kmscon es un emulador de terminal muy simple basado en KMS (Kernel mode setting) y que fue diseñado con la intención de reemplazar la terminal virtual integrada en el núcleo de Linux (fbcon). Todo indica que algunas distribuciones Linux irán adoptando este interesante software como reemplazo permanente para fbcon, empezando por el futuro lanzamiento de Fedora 44. A continuación describo los procedimientos para utilizar kmscon en ALDOS.
Ventajas de utilizar kmscon en lugar de fbcon.
Kmscon se ejecuta en espacio de usuario mientras que fbcon es parte del núcleo de Linux. Por tanto si kmscon falla, sólo falla éste sin más consecuencias. Si en cambio falla fbcon, ocurre una falla general del sistema (kernel panic).
Desde hace muchos años Fbcon tiene muy pobre mantenimiento en el desarrollo del núcleo de Linux, prueba de ésto es que hace una década se perdió la funcionalidad de desplazamiento de pantalla como remedio para corregir una vulnerabilidad relevante. Requiere además la capa de emulación fbdev del núcleo de Linux, mientras que el resto del sistema utiliza los controladores para GPU del sistema utilizando la moderna interfaz drm. Requiere además un programa como agetty o mgetty para poder funcionar.
Kmscon en cambio utiliza una terminal virtual a través un dispositivo pts ―similar a las consolas gráficas desde los entorno de escritorio como lo hacen gnome-terminal, konsole, xfce4-terminal o xterm― y por tanto prescindiendo del uso de fbdev. Tiene además un mejor soporte para teclados, tipografías y un mejor esquema de seguridad. Su única desventaja es que por el momento es incapaz de permitir iniciar sesiones X11 o Wayland.
El código fuente de kmscon se encuentra en github.com/kmscon/kmscon.
Características de kmscon
- Tiene desarrollo activo mantenido por la comunidad de Freedesktop.org
- Implementación completa desde
vt220hastavt510 - Desplazamiento de pantalla pulsando
Mayús+RePag,Mayús+AvPag,Mayús+↑yMayús+↓ - Permite utilizar las mismas tipografías disponibles en el escritorio en lugar de tipograf
- Admite la impresión de glifos Unicode completos, incluidos los CJK
- Proporciona un manejo de teclado internacionalizado a través de
libxkbcommon, lo que permite utilizar todas las distribuciones de teclado compatibles con el teclado X11 - Renderizado acelerado por hardware
- Capacidad para múltiples asientos
Procedimientos para utilizar kmscon en ALDOS.
Los procedimientos descritos a continuación funcionarán con ALDOS y cualquier otra distribución Linux que utilice SysVinit en lugar de SystemD. Requieren de nivel técnico intermedio, saber utilizar vim y entender qué es y para qué sirve una terminal virtual.
Abra una terminal y cambie a root:
su -l
Instale el paquete correspondiente a kmscon:
yum -y install kmscon
Otras distribuciones Linux ― como Devuan― probablemente tengan que utilizar apt-get o dnf para instalar el software correspondiente.
Respalde el archivo /etc/pam.d/login:
cp -a /etc/pam.d/login /etc/pam.d/login.bak
Edite el archivo /etc/pam.d/login:
vim /etc/pam.d/login
Se encontrará el siguiente contenido:
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
Para poder utilizar kmscon es necesario que éste pueda acceder a los dispositivos especiales dentro de /dev/pts. Por tanto debe desactivarse el módulo pam_securetty.so. Tiene algunas implicaciones de seguridad menores. Este módulo de pam se encarga de limitar el acceso de root a los dispositivos especiales localizados dentro de /dev, es decir que sólo se puedan utilizar /dev/tty* y /dev/ttyS*. Una vez que el sistema utilice kmscon, este se encargará de gestionar la seguridad en los TTYs utilizados por éste.
Localice la línea auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so y comentarla con un #: ejemplo:
#%PAM-1.0
# auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
Respalde el archivo /etc/initab:
cp -a /etc/inittab /etc/inittab.bak
Edite el archivo /etc/inittab:
vim /etc/inittab
Se encontrará el siguiente contenido:
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/agetty 38400 tty1
2:2345:respawn:/sbin/agetty 38400 tty2
3:2345:respawn:/sbin/agetty 38400 tty3
4:2345:respawn:/sbin/agetty 38400 tty4
5:2345:respawn:/sbin/agetty 38400 tty5
6:2345:respawn:/sbin/agetty 38400 tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
La sección que nos interesa es la correspondiente a Run gettys in standard runlevels:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/agetty 38400 tty1
2:2345:respawn:/sbin/agetty 38400 tty2
3:2345:respawn:/sbin/agetty 38400 tty3
4:2345:respawn:/sbin/agetty 38400 tty4
5:2345:respawn:/sbin/agetty 38400 tty5
6:2345:respawn:/sbin/agetty 38400 tty6
Copie las líneas correspondientes a los TTY del 2 a 6 y reemplace en éstas /sbin/agetty 38400 ttyX por /usr/bin/kmscon --vt /dev/ttyX, donde X corresponde al número de TTY a utilizar. Comente las líneas originales con un #. Recomiendo dejar al menos el primer TTY intacto para permitir realizar correcciones en caso de ser necesario o poder iniciar una sesión X11 o Wayland cuando el caso lo amerite. Teniendo en consideración lo anterior, la sección quedaría así:
# Run gettys in standard runlevels
# Se deja la primer terminal con fbcon/agetty por precaución
1:2345:respawn:/sbin/agetty 38400 tty1
# Terminales fbcon/agetty
# 2:2345:respawn:/sbin/agetty 38400 tty2
# 3:2345:respawn:/sbin/agetty 38400 tty3
# 4:2345:respawn:/sbin/agetty 38400 tty4
# 5:2345:respawn:/sbin/agetty 38400 tty5
# 6:2345:respawn:/sbin/agetty 38400 tty6
# Terminales kmscon
2:2345:respawn:/usr/bin/kmscon --vt /dev/tty2
3:2345:respawn:/usr/bin/kmscon --vt /dev/tty3
4:2345:respawn:/usr/bin/kmscon --vt /dev/tty4
5:2345:respawn:/usr/bin/kmscon --vt /dev/tty5
6:2345:respawn:/usr/bin/kmscon --vt /dev/tty6
El archivo debería quedar del siguiente modo:
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# Run gettys in standard runlevels
# Se deja la primer terminal con fbcon/agetty por precaución
1:2345:respawn:/sbin/agetty 38400 tty1
# Terminales fbcon/agetty
# 2:2345:respawn:/sbin/agetty 38400 tty2
# 3:2345:respawn:/sbin/agetty 38400 tty3
# 4:2345:respawn:/sbin/agetty 38400 tty4
# 5:2345:respawn:/sbin/agetty 38400 tty5
# 6:2345:respawn:/sbin/agetty 38400 tty6
# Terminales kmscon
2:2345:respawn:/usr/bin/kmscon --vt /dev/tty2
3:2345:respawn:/usr/bin/kmscon --vt /dev/tty3
4:2345:respawn:/usr/bin/kmscon --vt /dev/tty4
5:2345:respawn:/usr/bin/kmscon --vt /dev/tty5
6:2345:respawn:/usr/bin/kmscon --vt /dev/tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
Revise con cuidado la sintaxis y evite cometer errores, porque este archivo es esencial para el arranque del sistema. Si todo se ve correctamente, guarde el archivo.
Ejecute lo siguiente para indicar a SysVinit que vuelva a leer la configuración de /etc/inittab:
init q
Cabe aclarar que las terminales antiguas con fbcon/agetty se seguirán mostrando hasta reiniciar el sistema o bien ingresar y salir desde cada una.
Valide pulsando las teclas CTRL+ALT+F2. Se mostrará la pantalla de ingreso antigua gestionada por fbcon y agetty.
Ingrese como root o usuario regular y cierre la sesión inmediatamente pulsando CTRL+D.
Después de cerrar la sesión se mostrará kmscon con el nuevo diálogo de acceso. Ingrese nuevamente para validar que todo funciona correctamente. Repita lo mismo pulsando CTRL+ALT+F3, CTRL+ALT+F4, CTRL+ALT+F5 y CTRL+ALT+F6.
SI todo funciona como se espera, reinicie el sistema y vuelva a validar el acceso a las terminales virtuales pulsando CTRL+ALT+F2, CTRL+ALT+F3, CTRL+ALT+F4, CTRL+ALT+F5 y CTRL+ALT+F6.

Recomendaciones.
Si lo considera apropiado, ensaye primero estos procedimientos en una máquina virtual. Una vez que haya tenido éxito y realizado pruebas, puede proceder a hacerlo en su equipo físico con ALDOS.
Si el procedimiento falla, será necesario rescatar el sistema utilizando un disco o USB vivo restaurando los respaldos de /etc/pam.d/login y /etc/inittab. Para restaurar los respaldos desde un medio vivo, monte la partición raíz de ALDOS y copie los archivos *.bak sobre los originales.
Puede personalizar el aspecto de kmscon ―como tipografía y tamaño de ésta o activar el soporte para ratón, entre otras cosas― editando el archivo /etc/kmscon/kmscon.conf. Por favor lea la documentación de kmscon.conf antes de realizar cambios:
man kmscon.conf

Cualquier cambio que realice en el archivo /etc/kmscon/kmscon.conf requerirá reiniciar el sistema para que surta efecto.