Xsession

De Astillas.net

Enlaces y referencias

Conceptos

Xsession es el nombre de un mecanismo para gestionar una sesión gráfica bajo el sistema X Window. No está diseñado para ser ejecutado directamente por un usuario, sino dentro de un entorno especial asociado con la inicialización de un un servidor X, bien empleando un lanzador (generalmente algo como startx o xinit), bien usando un gestor de acceso como xdm o kdm.

Gestores de acceso

Los gestores de acceso pueden iniciar diferentes sesiones empaquetadas bajo un nombre y en archivos con extensión .desktop. En Debian pueden estar situados en varios sitios:

  • /usr/share/xsessions
  • /var/lib/menu-xdg/xsessions
  • /usr/share/apps/kdm/sessions

Sesiones empaquetadas

Para que un gestor de acceso gráfico pueda poner en marcha diferentes sesiones y gestores de ventanas existe un mecanismo de empaquetado de las mismas en archivos con extensión .desktop. El formato es el que se recoge en la especificación oficial con alguna diferencia que otra que aún no he conseguido documentar pero que todos los gestores de acceso reconocen.

Un ejemplo funcional de sesión gráfica es el siguiente:

[Desktop Entry]
Encoding=UTF-8
Name=Empresa
Comment=Escritorio de Empresa, S.L. (fluxbox)
Exec=/etc/X11/Xsession
Terminal=False
Type=Xsession

Funcionamiento

Variables y valores

Variable Valor predeterminado Uso
OPTIONFILE /etc/X11/Xsession.options Configuración global de Xsession.
SYSRESOURCES /etc/X11/Xresources Recursos gráficos globales.
USRRESOURCES $HOME/.Xresources Recursos gráficos de usuario.
SYSSESSIONDIR /etc/X11/Xsession.d Archivo raíz donde se almacenan las fases de arranque de la sesión gráfica.
USERXSESSION $HOME/.xsession Programa de usuario para lanzar la sesión gráfica. Si no es ejecutable se emplea un shell para ejecutarlo.
USERXSESSIONRC $HOME/.xsessionrc Definición del entorno de la sesión gráfica.
ALTUSERXSESSION $HOME/.Xsession Nombre alternativo para el programa lanzador de la sessión gráfica.
ERRFILE $HOME/.xsession-errors Archivo al cual enviar la salida estándar de errores de todos los programas que se ejecuten en la sesión X.

Parámetros globales

Los parámetros están activos si aparecen en el archivo. En caso contrario están todos ellos desactivados.

allow-failsafe
Permite que se use el parámetro failsafe para la sesión gráfica en la que no se invoca a ningún gestor de ventanas; únicamente aparece un terminal gráfico (si es posible y existe) en una esquina de la pantalla.
allow-user-resources
Permite que se carguen los recursos gráficos del usuario si existe un archivo llamado $HOME/.Xresources.
allow-user-xsession
Permite emplear la sesión gráfica del usuario si dispone de un archivo llamado $HOME/.xsession.
use-ssh-agent
Permite arrancar la sesión gráfica con el programa ssh-agent si éste existe en el sistema.
use-session-dbus
Activa el bus de la sessión si el paquete dbus está instalado.

Puesta en marcha

En un sistema Debian Xsession es un programa localizado en /etc/X11/Xsession que realiza varias operaciones al comenzar.

  1. Declara un juego de funciones y variables.
  2. Intenta crear un registro para la sesión X. Aborta si no lo consigue y registra el comienzo de la sesión en caso contrario.
  3. Verifica que el directorio temporal no esté lleno intentando crear un archivo con algún contenido. Aborta en caso contrario.
  4. Verifica el directorio /etc/X11/Xsession.d.
  5. Ejecuta run-parts sobre él para averiguar qué archivos debe cargar y ejecutar y en qué orden.

En el último punto es importante discernir que los archivos que carga y ejecuta lo son mediante el mecanismo source del shell, por lo que pueden tener acceso a las variables y funciones definidas al comienzo.

Fases de arranque

Cada fase de arranque corresponde con un programa escrito en lenguaje del shell al que se llama script. Existe un puñado de ellos incluídos en la distribución base que bastan para crear la sesión gráfica, aunque si miramos en un sistema ya en funcionamiento podremos ver que hay varios scripts más en el directorio /etc/X11/Xsession.d

ls -al
total 60
drwxr-xr-x  2 root root 4096 jul 28 14:45 .
drwxr-xr-x 11 root root 4096 jul 27 09:19 ..
-rw-r--r--  1 root root 2024 may  3  2010 20x11-common_process-args
-rw-r--r--  1 root root  878 may  3  2010 30x11-common_xresources
-rw-r--r--  1 root root  187 mar  8  2008 40x11-common_xsessionrc
-rw-r--r--  1 root root 1535 may  3  2010 50x11-common_determine-startup
-rw-r--r--  1 root root  197 may  6  2010 52libcanberra-gtk-module_add-to-gtk-modules
-rw-r--r--  1 root root  697 ene 30  2010 55gnome-session_gnomerc
-rw-r--r--  1 root root  368 dic 21  2010 75dbus_dbus-launch
-rw-r--r--  1 root root 1027 feb 25  2010 90consolekit
-rw-r--r--  1 root root  591 oct  4  2008 90gpg-agent
-rw-r--r--  1 root root  266 oct  7  2010 90unclutter
-rw-r--r--  1 root root  629 may  3  2010 90x11-common_ssh-agent
-rwxr-xr-x  1 root root 1553 jun 21 16:47 98vboxadd-xclient
-rw-r--r--  1 root root  166 feb 13  2007 99x11-common_start

unos los han añadido otros paquetes como unclutter y libcanberra-gtk-module y otros pueden estar allí instalados por el administrador local.

Los preinstalados son los siguientes:

20x11-common_process-args Analiza los parámetros que ha recibido el programa Xsession y determina tanto el tipo de sesión que se pide como tal vez el programa que lanza la sesión.
30x11-common_xresources Carga mediante xrdb -merge los recursos gráficos que encuentra en dos localizaciones:
  • El directorio /etc/X11/Xresources empleando de nuevo run-parts sobre él.
  • El archivo $HOME/.Xresources si existe y puede hacerlo.
40x11-common_xsessionrc Carga el entorno de usuario mediante el archivo $HOME/.xsessionrc.
50x11-common_determine-startup
90x11-common_ssh-agent Comprueba que no exista ya un agente SSH en funcionamiento y, si la configuración lo permite, marca el agente para que se emplee en la fase final.
99x11-common_start Lanza la sesión gráfica mediante un shell si el programa no es ejecutable y empleando el agente SSH si es necesario. En cualquier caso se usa la orden exec para no crear un nuevo proceso.

Personalizando la sesión gráfica

En el caso de necesitar retocar la sesión gráfica podemos incluír un archivo en el flujo de preparación, justo después del primero de ellos que es el que se encarga de inicializar las variables de entorno.

Por ejemplo, podemos crear un archivo llamado /etc/X11/Xsession.d/25x11_local_settings:

#/bin/sh

# Creamos algunos directorios 
ARCHIVOS=$HOME/Archivos
if [ ! -d $ARCHIVOS ]; then 
    mkdir -p $ARCHIVOS/Documentos $ARCHIVOS/Compartidos "${ARCHIVOS}/Recibidos"
fi

# Copiamos algunos ajustes particulares 
if [ ! -e $HOME/.Xresources ]; then 
    cp -f /etc/empresa/lib/xresources $HOME/.Xresources
fi

# exit