Entender como funciona el entorno gráfico de Linux, es para mi una tarea bastante difícil, sobre la que tengo que volver una y otra vez.
En principio Linux no necesita un entorno gráfico, se puede interactuar con el núcleo directamente a través de comandos. Sin embargo lo más normal es configurarlo para que arranque en modo gráfico, mostrándonos un gestor de pantalla (Display Manager) como GDM, KDM o Lightdm (entre otros muchos) en una consola que está ejecutando el Servidor X Xorg.
Un gestor de pantalla es un servicio (se arranca y para con service <nombre_servicio> start/stop) que nos muestra una ventana de login en modo gráfico (greeter) desde la que poder acceder a nuestro entorno de escritorio (Desktop Environment). Ejemplos de entornos de escritorio son: Gnome, KDE, Mate etc. El gestor de pantalla que usamos en Max es lightdm, y el entorno de escritorio es Mate.
Aunque al arrancar en modo gráfico vemos directamente el greeter del gestor de pantalla, hay que tener en cuenta que el sistema nos está mostrando la consola tty7 que está ejecutando el Servidor X Xorg (el gestor de pantalla está enviando al servidor X las instrucciones para pintar la pantalla de login o greeter). Hay otras 6 consolas tty1 a tty6 que no están ejecutando ningún servidor X, estas consolas están disponibles en modo texto y se puede acceder a ellas con (Ctrl + Alt + F1 a F6 o Host F1 a F6 desde Virtual Box).
Desde estas consolas se puede entrar en el sistema y detener/reiniciar el gestor de pantalla con el comando (para lightdm):
$sudo service lightdm stop/restart
El gestor de pantalla del sistema (ej: Lightdm) al arrancar arranca el servidor Xorg en la consola tty7, y al parar para también el servidor Xorg en la consola tty7 pero podemos pararlo y arrancarlo para que muestre su salida en cualquiera de las consolas restantes.
Historia y arquitectura
En el paradigma X Windows, en su versión más simple, tenemos un sistema formado por dos ordenadores: el terminal del usuario y el servidor remoto. Aunque hoy en día normalmente el propio ordenador del usuario desempeña ambos roles. La razón de que esto sea así se remonta a los orígenes de Unix (XDM 1988), que estaba diseñado para que un servidor central "pesado" diera servicio de ejecución de programas con salida gráfica a una serie de usuarios conectados con terminales "ligeros".
Al arrancar el Servidor X, este se conectaba con el Display Manager e iniciaba una sesión (protocolo XDMCP), una vez iniciada la sesión, los usuarios ejecutaban los programas de forma remota (ej: xterm, xedit) en el servidor "pesado" donde residía el Display Manager, y la salida gráfica de estos programas se enviaba al "Servidor X" para que la pintara en la pantalla del usuario. Del mismo modo el "Servidor X" tenía que recoger los eventos de entada del usuario (teclado, ratón, etc) y enviarlos al Display Manager usando XDMCP para que los notificara al programa remoto (ej: xterm, xedit).
Como se ve se trata de una solución muy compleja y bastante confusa, ya que el programa servidor (X server) se ejecuta en el terminal "ligero" que realmente es un cliente, y el programa cliente (El Display Manager) se ejecuta en el ordenador servidor "pesado". Además, para complicar/flexibilizar las cosas todavía más, el programa "X server" puede pintar en la pantalla del monitor local o redirigir su salida gráfica a cualquier otro monitor conectado a la red mediante la definición de la variable local DISPLAY (ejemplo export DISPLAY = 192.168.1.5:10.0).
En la implementación actual del paradigma Xserver de la mayoría de las distribuciones Linux, tanto el "Servidor X" como el DisplayManager se ejecutan en el mismo terminal. El Display Manager (ej: Lightdm) arranca primero y luego lanza el servidor X en la consola tty7 para dibujar en ella la pantalla de login (Greeter).
El resto de las consolas (tty1 a tty6) permanecen en modo texto, pero en ellas se puede iniciar manualmente un Servidor X sin necesidad de tener un Display Manager, con el comando:
$startx
Una vez arrancado el Servidor X podemos ejecutar programas con salida gráfica en la consola de texto (Ctrl + Alat + t para xterm).
$firefox
El Servidor X del terminal del usuario inicia sesión en el Display Manager y recibe
la salida gráfica de los programas ejecutados en remoto (xedit y xterm).
Image from wikimedia commons, public domain: enlace
Drivers entrada
El servidor X recibe los eventos de entrada generados por el usuario, para abstraer el servidor X del dispositivo físico de entrada, el servidor X usa varios drivers (evdev, libinput, synaptics etc). Estos drivers del servidor X se colocan sobre los módulos del kernel cargados por udev al detectar el dispositivo físico, de modo que puedan tener acceso a sus eventos de entrada en /dev/input/eventx. libinput solo soporta dispositivos evdev, de hecho libinput es un fino envoltorio alrededor de evdec, toda la inicialización del dispositivo se hace en evdev y luego se crea una estructura con parámetros de configuración y gestores de eventos (callbacks) específicos para cada tipo de dispositivo en función de las etiquetas pasadas hacia arriba por udev (e.j. ID_INPUT_TOUCHPAD),
Para ver los drivers instalados en el sistema:
$sudo dpkg -l | grep xorg
Para añadir o eliminar drivers, simplemente hay que usar dpkg -i <driver package>/ dpkg -r <driver-package>
Para ver los drivers que se están usando
$cat /var/log/Xorg.0.log | grep driver
Para ver la información de un dispositivo en concreto
$cat /var/log/Xorg.0.log | grep <nombre dispositivo>
Los dispositivos de entrada se pueden gestionar con xinput, tambien se pueden cambiar sus propiedades.
$xinput --list
$xinput --list id
$xinput --list-props id
Los ficheros de configuración de Xorg en los que se asocia a cada dispositivo su driver se pueden encontrar en:
/etc/X11/xorg.conf.d/ (configuraciones específicas del usuario)
/usr/share/X11/xorg.conf.d/ (configuración por defecto de los paquetes)
Modificando estos ficheros o creando otros específicos se pueden cambiar propiedades de los dispositivos de entrada, deshabilitar dispositivos y también establecer que driver (libinput, evdev o synaptics) se asicia a cada dispositivo.
Drivers vídeo
Para saber el driver de la tarjeta de vídeo del kernel hay que usar el comando:
$sudo lshw
Para buscar los drivers de vídeo de xorg instalados en el sistema
$sudo dpkg -l | grep xserver-xorg-video
Si xorg no puede encontrar un driver mejor usará el driver genérico vesa, aunque desgraciadamente sin aceleración 2D ni 3D
Los ficheros de configuración de Xorg en los que se asocia a cada dispositivo su driver se pueden encontrar en:
/etc/X11/xorg.conf.d/
/usr/share/X11/xorg.conf.d/
Modificando estos ficheros o creando otros específicos se pueden cambiar propiedades de los dispositivos de vídeo.
Configuración de dispositivos de entrada en xorg
Como ya se ha mencionado antes el servidor X recibe la entrada del usuario a través de los drivers evdev o libinput.
El usuario puede definir configuraciones de partida (ejemplo: matriz de calibración, tap to click, natural scrolling, keyboar modes etc) para estos dispositivos a través de ficheros con nombres como 99-atmet-matrix.conf en el directorio /etc/X11/xorg.conf.d. También se pueden guardar estos ficheros en /usr/share/X11/xorg.conf.d/, pero corremos el riesgo de perderlos en las actualizaciones del sistema.
Las configuraciones se aplican al arrancar el servidor x, o en el caso de dispositivos plug and play, cada vez que se conecta y desconecta el dispositivo.
Abajo en la página se incluyen ejemplos de este tipo de ficheros .conf
La sintaxis de las InputClass de estos ficheros es independiente del driver xorg (evdev o libinput), pero el nombre de las opciones de configuración (options) tiene que ser el que corresponda al driver (evdev o libinput) que recibe los eventos de entrada del dispositivo que queremos configurar.
Enlaces:
Explicación del entorno X: enlace
Guia para principiantes al gestor de pantalla y ventanas Xorg: enlace
Usa un dispositivo android como tableta de entrada en Linux: enlace
Usar tu tableta android como un segundo monitor: enlace
Arracar un cliente ligero contra un gestor de pantalla remoto: enlace
Habilitar XDMCP en lightdm: enlace
Configuración de dispositivos de entrada en xorg.conf.d: enlace