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 vt220 hasta vt510
  • Desplazamiento de pantalla pulsando Mayús+RePag, Mayús+AvPag, Mayús+↑ y Mayú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.

kms-en-aldos

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  

kms-en-aldos-kms-conf

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

Bibliografía.

Entrada Anterior