EEIJ

Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux


Sommaire


Conforme à XHTML 1.0 Strict Conforme à CSS!

On se lasse de tout, sauf de comprendre.
Attribué à Virgile.

Le gestionnaire graphique XDM, sans autologin

Historique

2 août 2011 : Création de cette page.
2 juillet 2014 : actualisation avec Systemd
19 avril 2018 : Contrôle et actualisation avec mga6, ajout de systemd-cgls.

Difficulté

Pour : linuxien averti.

 Introduction

Habituellement, vous démarrez une session en mode graphique. La page Cliquez a montré que le script prefdm a déterminé quel est le gestionnaire de connexion graphique à utiliser.

Cette page montre le processus de démarrage lorsque le gestionnaire graphique est XDM. En tant que tel, XDM ne permet pas l'autologin et l'installation du paquetage autologin ne semble plus remplir cette fonction.

Important !
XDM est un gestionnaire de connexion, c'est-à-dire qu'il présente une fenêtre de connexion (login et mot de passe), à ne pas confondre avec le serveur X qui permet aux applications graphiques (et donc aussi à XDM) de dialoguer avec l'écran, le clavier et la souris.

Haut

 Description

Écran de connexion xdm

XDM est probablement le gestionnaire de connexion ayant l'aspect le plus épuré : une simple boîte de dialogue sur fond noir (ou sur le fond par défaut), avec un message d'accueil, un champ pour le nom de l'utilisateur, puis un champ pour le mot de passe. Il n'a ni liste d'utilisateurs, ni choix du bureau à afficher, mais il est très simple et convient même avec des processeurs assez anciens, ne gérant pas les instructions sse2.

Haut

 Utilisation classique

La plupart du temps, les applications sont installées sur l'ordinateur de l'utilisateur. Ce dernier se connecte à son ordinateur à l'aide d'un gestionnaire de connexion en mode graphique.

Utilisateur local sur le serveur X local

C'est donc le cas le plus courant.
Dans ce cas de figure, XDM réalise les opérations suivantes :

Haut

 Utilisation avec un poste déporté

Cela concerne, par exemple, des anciens ordinateurs, ayant une puissance relativement limitée. Ils peuvent encore être utilisés en tant que client léger. Il leur suffit alors d'avoir un minimum de mémoire et de ressources propres. Les programmes sont traités par un serveur d'applications distant. Le gestionnaire de connexion est habituellement fourni par le serveur alors que clavier, souris et afficheur se trouvent sur le poste client.

Les tâches sont donc réparties :

Le protocole XDMCP permet la communication entre le client léger et l'environnement graphique du serveur. Une liaison réseau est bien sûr indispensable.

Modes de connexion depuis un poste déporté

L'utilisation avec poste déporté ne sera pas traitée ici.

Haut

 Les fichiers de configuration

systemd a lancé prefdm et celui-ci à défini la commande permettant d'ouvrir la fenêtre de connexion : /usr/bin/xdm
(il faut bien sûr que xdm soit installé).

La configuration de xdm se fait en éditant quelques fichiers texte. Si vous devez modifier des fichiers de configuration, il est prudent de faire une copie de sauvegarde de ces fichiers, en les renommant autrement.

 /etc/X11/xdm/xdm-config

Il définit quelques paramètres et précise quels sont les autres fichiers de configuration et fichiers exécutables.

Pour les curieux, survolez : analyse du fichier /etc/X11/xdm/xdm-config

Le fichier

! $Xorg: xdm-conf.cpp,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
! $XFree86: xc/programs/xdm/config/xdm-conf.cpp,v 1.11 2004/01/09 00:25:25 dawes Exp $
!
DisplayManager.errorLogFile: /var/log/xdm.log
DisplayManager.pidFile: /var/run/xdm.pid
DisplayManager.keyFile: /etc/X11/xdm/xdm-keys
DisplayManager.servers: /etc/X11/xdm/Xservers
DisplayManager.accessFile: /etc/X11/xdm/Xaccess
DisplayManager.willing: su nobody -c /usr/share/X11/xdm/Xwilling
! All displays should use authorization, but we cannot be sure
! X terminals may not be configured that way, so they will require
! individual resource settings.
DisplayManager*authorize: true
DisplayManager._1.authorize: true
! The following three resources set up display :0 as the console.
DisplayManager._0.setup: /usr/share/X11/xdm/Xsetup_0
DisplayManager._0.startup: /usr/share/X11/xdm/Xstartup
DisplayManager._0.reset: /usr/share/X11/xdm/Xreset
DisplayManager._0.startAttempts: 1
!
DisplayManager*chooser: /usr/share/X11/xdm/chooser
DisplayManager*resources: /etc/X11/xdm/Xresources
DisplayManager*session: /usr/share/X11/xdm/Xsession
DisplayManager*authComplain: false
DisplayManager*authName: MIT-MAGIC-COOKIE-1

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
DisplayManager.requestPort: 0

Analyse du fichier

DisplayManager.errorLogFile et DisplayManager.pidFile parlent d'eux-mêmes.
DisplayManager.keyFile indique le nom d'un fichier contenant une clé partagée entre xdm et les terminaux X, lorsque le protocole XDM-AUTHENTICATION-1 est utilisé. Par défaut, ce fichier n'existe pas et c'est MIT-MAGIC-COOKIE-1 qui est utilisé.
DisplayManager.servers spécifie, par le fichier /etc/X11/xdm/Xservers, le ou les serveurs X à démarrer (ne nécessitant pas XDMCP, donc locaux ),
DisplayManager.accessFile spécifie, par le fichier /etc/X11/xdm/Xaccess, les postes distants autorisés à accéder au serveur X.
DisplayManager.willing spécifie, le programme à exécuter lorsqu'une requête Broadcast XDMCP est reçue et que cet hôte est configuré pour offrir une gestion d'affichage XDMCP. La sortie de ce programme peut être affichée sur la fenêtre du Sélecteur. Si aucun programme n'est spécifié, la chaîne "Willing to manage" est envoyée.
DisplayManager*authorize, DisplayManager._1.authorize C'est une valeur booléenne qui contrôle si la commande xdm génère et utilise une autorisation pour les connexions sur le serveur local. Si la valeur est true, la commande xdm utilise les mécanismes d'autorisation indiqués par la ressource DisplayManager*authName (une liste, séparée par des espaces). Les connexions XDMCP peuvent spécifier le mécanisme à utiliser et, dans ce cas, la valeur de DisplayManager*authName est ignorée. Par défaut, DisplayManager*authorize est true et DisplayManager*AuthName est = MIT-MAGIC-COOKIE-1.
Remarque : * indique que tous les affichages sont concernés, alors que _1 ne concerne que l'afficheur :1 par exemple.
DisplayManager._0.setup spécifie, par le fichier /usr/share/X11/xdm/Xsetup_0, le programme qui est exécuté (en tant que root) avant d'afficher la fenêtre de login.
DisplayManager._0.startup spécifie, par le fichier /usr/share/X11/xdm/Xstartup, le programme qui est exécuté (en tant que root), après une authentification réussie.
DisplayManager._0.reset spécifie, par le fichier /usr/share/X11/xdm/Xreset, le programme qui est exécuté (en tant que root), à la fin d'une session.
DisplayManager._0.startAttempts spécifie, le comportement de xdm qui tente d'ouvrir des serveurs X.
DisplayManager*chooser spécifie, par le fichier /usr/share/X11/xdm/chooser, le programme qui est exécuté pour afficher un menu aux requêtes XDMCP indirectes.
DisplayManager.resources spécifie, par le fichier /etc/X11/xdm/Xresources, la configuration de la fenêtre de connexion.
DisplayManager*session spécifie, par le fichier /usr/share/X11/xdm/Xsession, les programmes qui sont exécutés (plus en tant que root) à l'ouverture d'une session.
DisplayManager*authComplain n'est actuellement pas utilisé.

Haut

 /etc/X11/xdm/Xservers : XDM gère les serveurs X

Il définit la liste des serveurs X que XDM doit démarrer, avec les attributs nécessaires.
Par défaut, seul un serveur local est démarré. D'autres serveurs locaux sont prédéfinis, mais non démarrés.

Normalement, XDM démarre le(s) serveur(s) X et affiche la fenêtre de connexion (utilisateur et mot de passe).

Certains cas particuliers peuvent être envisagés :

Pour les curieux, survolez : extrait du fichier /etc/X11/xdm/Xservers

# $XConsortium: Xserv.ws.cpp,v 1.3 93/09/28 14:30:30 gildea Exp $
#
:0 local /usr/bin/X -deferglyphs 16
:1 local reserve /usr/bin/X :1 -deferglyphs 16
:2 local reserve /usr/bin/X :2 -deferglyphs 16
:3 local reserve /usr/bin/X :3 -deferglyphs 16
:4 local reserve /usr/bin/X :4 -deferglyphs 16
:5 local reserve /usr/bin/X :5 -deferglyphs 16

Analyse du fichier

:0 : nom du display.
local : local (serveur X local à démarrer) ou foreign (serveur X distant déjà en marche)
/usr/bin/X : commande à exécuter
-deferglyphs 16 : valide la mise en cache des glyphes (forme des caractères) pour les fontes 16 bits

Haut

 /etc/X11/xdm/Xaccess

Il définit quels hôtes peuvent faire des requêtes à XDM sur cette machine, afin d'obtenir une invite d'authentification.
Cet accès peut être direct (le poste distant accède au serveur X) ou indirect (le poste distant reçoit la liste des serveurs X acceptant un accès grâce à une application chooser).

Par defaut, tous les hôtes locaux peuvent demander leur authentification, aucun poste distant n'est autorisé à un accès direct et tous les postes distants peuvent demander la liste des serveurs permettant un accès.

L'accès à distance ne sera pas abordé ici

Pour les curieux, survolez : extrait du fichier /etc/X11/xdm/Xaccess

# $Xorg: Xaccess,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
# $XFree86: xc/programs/xdm/config/Xaccess,v 1.5 2003/11/22 04:51:03 dawes Exp $
# Pour les requêtes directes : tous peuvent accéder
*
# Pour les requêtes indirectes : tout hôte distant peut accéder au chooser
* CHOOSER BROADCAST #any indirect host can get a chooser

Haut

 /etc/X11/xdm/Xresources

Il permet de configurer l'aspect de la fenêtre de connexion : message d'accueil, police de caractères, dimensions ...
Il serait également possible de définir un papier peint pour la fenêtre de connexion, mais ceci se fait dans le fichier /usr/share/X11/xdm/Xsetup_0.

Haut

 Le déroulement

La commande systemd-cgls permet de voir le déroulement global du démarrage.

Pour les curieux, survolez : la sortie de systemd-cgls, dans le même ordre qu'avec le démarrage de startx

Control group /:]
-.slice
├─init.scope
│ └─1 /sbin/init
├─system.slice
│ ├─systemd-journald.service
│ │ └─xxx /usr/lib/systemd/systemd-journald
│ ├─systemd-udevd.service
│ │ └─xxx /usr/lib/systemd/systemd-udevd
│ ├─systemd-logind.service
│ │ └─xxx /usr/lib/systemd/systemd-logind
│ ├─alsa-state.service
│ │ └─xxx /usr/sbin/alsactl -s -n 19 -c rdaemon
│ ├─irqbalance.service
│ │ └─xxx /usr/sbin/irqbalance --foreground
│ ├─dbus.service
│ │ └─xxx /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfi...
│ ├─gpm.service
│ │ └─xxx /usr/sbin/gpm -m /dev/input/mice -t exps2
│ ├─acpid.service
│ │ └─xxx /usr/sbin/acpid
│ ├─powernowd.service
│ │ └─xxx /usr/sbin/powernowd
│ ├─systemd-networkd.service
│ │ └─xxx /usr/lib/systemd/systemd-networkd
│ ├─network.service
│ │ ├─ xxx /sbin/ifplugd -I -b -i enp3s0
│ │ └─xxxx dhclient -1 -q -lf /var/lib/dhclient/dhclient--enp3s0.lease -pf /v...
│ ├─systemd-resolved.service
│ │ └─xxxx /usr/lib/systemd/systemd-resolved
│ ├─crond.service
│ │ └─xxxx /usr/sbin/crond -n
│ ├─prefdm.service
│ │ ├─ xxx /usr/bin/xdm -nodaemon
│ │ └─xxxx /usr/libexec/Xorg -deferglyphs 16 -auth /var/lib/xdm/authdir/authf...
│ ├─mandi.service
│ │ └─xxxx /usr/sbin/mandi
│ └─polkit.service
│   └─xxxx /usr/lib/polkit-1/polkitd --no-debug
└─user.slice
  └─user-1000.slice
    ├─user@1000.service
    │ ├─init.scope
    │ │ ├─xxxx /usr/lib/systemd/systemd --user
    │ │ └─xxxx (sd-pam)
    │ └─gpg-agent.service
    │   └─1901 /usr/bin/gpg-agent --daemon
    └─session-1.scope
      ├─xxxx /usr/bin/xdm -nodaemon
      ├─xxxx icewm-session
      ├─xxxx /usr/bin/dbus-launch --exit-with-session --sh-syntax
      ├─xxxx /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --se...
      ├─xxxx /usr/libexec/polkit-mate-authentication-agent-1
      ├─xxxx icewmbg
      ├─xxxx icewm --notify
      ├─xxxx /usr/libexec/at-spi-bus-launcher
      ├─xxxx /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/a...
      ├─xxxx /usr/libexec/at-spi2-registryd --use-gnome-session
      ├─xxxx icewmtray --notify
      ├─xxxx /usr/bin/xterm
      ├─xxxx bash
      └─xxxx systemd-cgls

Quelques précisions

Tout comme avec le démarrage avec startx, la tranche system démarre un certain nombre de services, dont journald, udevd (gestion des périphériques), logind (connexion) ...
Les services et processus sont exactement les mêmes, avec cependant un service supplémentaire : prefdm.service. Pour faciliter la comparaison avec startx, l'ordre des services n'est pas respecté et le numéro des processus n'est pas indiqué.

La tranche user démarre également des services, systemd user, pam et gpg-agent, mais lance surtout des applications. Ici, pas de login en mode texte, mais c'est xdm qui est utilisé et qui a été trouvé par la tranche system. Ensuite, c'est pareil qu'avec startx.

prefdm et lookupdm ont lancé la commande /usr/bin/xdm

 /usr/bin/xdm

xdm est un fichier compilé. Il est donc difficile de suivre son déroulement. En toute logique, il va lire le fichier principal de configuration.
On peut supposer que les autres exécutables sont lancés dans l'ordre du fichier de configuration, ce qui est confirmé en vérifiant le moment de leur exécution.

 /usr/share/X11/xdm/Xwilling

C'est le programme à exécuter lorsqu'une requête Broadcast XDMCP est reçue et que cet hôte est configuré pour offrir une gestion d'affichage XDMCP. La sortie de ce programme est affichée sur la fenêtre du Sélecteur.

L'accès à distance ne sera pas abordé ici

Pour les curieux, survolez : le fichier /usr/share/X11/xdm/Xwilling

#!/bin/sh
# $XFree86: xc/programs/xdm/config/Xwilling,v 1.1 1998/12/06 06:08:51 dawes Exp $
# The output of this script is displayed in the chooser window.
# (instead of "Willing to manage")
load="`uptime|sed -e 's/^.*load[^0-9]*//'`"
nrusers="`who|cut -c 1-8|sort -u|wc -l|sed 's/^[ ]*//'`"
s=""; [ "$nrusers" != 1 ] && s=s
echo "${nrusers} user${s}, load: ${load}"

Haut

 /usr/share/X11/xdm/Xsetup_0

Ce programme est exécuté (en tant que root) avant d'afficher la fenêtre de login.
Il définit la configuration du clavier, l'activation du pavé numérique, réalise divers scripts, définit le fond d'écran

Pour les curieux, survolez : extrait du fichier /usr/share/X11/xdm/Xsetup_0

#!/bin/sh
# $Id: Xsetup_0,v 1.12 2005/06/12 14:35:57 flepied Exp $
if [ -x /etc/X11/xinit/fixkeyboard ]; then
  /etc/X11/xinit/fixkeyboard
fi
if [ -x /etc/X11/xinit.d/numlock ]; then
  /etc/X11/xinit.d/numlock &
fi
for i in /etc/X11/xsetup.d/*.xsetup ; do
  [ -d $i ] && continue
  if [ -x $i ]; then
    if grep -q "# to be sourced" $i; then
      . $i
    else
      $i &
    fi
  fi
done
if [ -f /usr/share/mga/backgrounds/default.jpg ]; then
  /usr/bin/xloadimage -onroot -fullscreen /usr/share/mga/backgrounds/default.jpg
fi

Analyse du fichier

  • /etc/X11/xinit/fixkeyboard : lors de l'ouverture d'une session X à distance la configuration du clavier doit correspondre à celui de l'affichage distant.
  • /etc/X11/xinit.d/numlock :
    Ce script est exécuté pour activer, si nécessaire, le verrouillage numérique. Il vérifie d'abord que la variable $DISPLAY correspond bien à l'ordinateur local. En d'autres mots, le script vérifie que l'affichage se fait bien sur l'ordinateur local (et donc aussi le clavier).
    Si c'est le cas et si le verrouillage numérique est activé en mode texte (ce qui n'est pas le cas avec un portable), le script active également le verrouillage en mode graphique.
    Ainsi numlock est activé pour saisir le mot de passe.
  • for i in /etc/X11/xsetup.d/*.xsetup ; do : Exécution des scripts du répertoire /etc/X11/xsetup.d. Chez moi :
    - notification de l'utilisation du pilote graphique libre lorsque le pilote propriétaire est demandé, mais n'est pas trouvé.
    - speedboot
  • /usr/bin/xloadimage -onroot -fullscreen /usr/share/mga/backgrounds/default.jpg : permet d'afficher un fond d'écran lors de l'invite de connexion avec XDM.
Haut

 /usr/share/X11/xdm/Xstartup

Ce programme est exécuté (en tant que root) après l'authentification de l'utilisateur.
Le script vérifie si, pour une raison quelconque, la connexion n'est pas interdite et un message est alors délivré à l'utilisateur.
Ensuite, il donne les droits de l'utilisateur à /dev/console.
Pour terminer, il enregistre la session dans les fichiers /var/log/wtmp et /var/run/utmp. Ces fichiers conservent une trace de toutes les connexions et déconnexions.

Pour les curieux, survolez : le fichier /usr/share/X11/xdm/Xstartup

#!/bin/sh
if [ -f /etc/nologin ]; then
  xmessage -file /etc/nologin -timeout 30 -center
  exit 1
fi
/usr/share/X11/xdm/GiveConsole
# sessreg uses the parent pid, so we have to exec it
exec /usr/bin/sessreg -a -w "/var/log/wtmp" -u "/var/run/utmp" -x "/etc/X11/xdm/Xservers" -l $DISPLAY -h "" $USER

Analyse du fichier

  • /etc/nologin : Pour des raisons de maintenance, par exemple, l'administrateur système peut bloquer la connexion des utilisateurs et peut les avertir par un message.
  • GiveConsole : petit script qui confère la propriété du fichier "/dev/console" à l'utilisateur pour celui-ci puisse voir les messages envoyés.
  • sessreg : gérer les entrées utmp / wtmp pour les clients. Ces fichiers gardent une trace de toutes les connexions et déconnexions au système.
Haut

 /usr/share/X11/xdm/Xsession

Ce fichier exécute simplement le fichier /etc/X11/Xsession
/usr/share/X11/xdm/Xsession contient la ligne
exec /etc/X11/Xsession $*
Remarque : $* réprésente les arguments éventuels. Il n'y en a pas ici.

 /etc/X11/Xsession

Il est aussi bien utilisé par la commande startx que par les gestionnaires de connexion.

Ce script ouvre une session graphique correspondant aux éventuels paramètres spécifiés lors de la commande. Par défaut, aucun paramètre n'est spécifié.
Voici, en résumé, le processus :

Remarque : le fait de lancer une commande avec exec la_commande a pour conséquence de quitter ce script dès que la_commande est terminée. La suite de ce script n'est alors pas vue. Ceci permet de sortir du script Xsession dès qu'une commande adéquate est trouvée, sans exploer le reste du script.

Haut

 En résumé

Systemd a déjà initialisé le système XWindow. Il lance xdm.
XDM gère la connexion sur les terminaux X, ceux-ci pouvant être locaux ou à distance.
(En effet, par l'intermédiaire du protocole XDMCP, XDM permet de se connecter à des serveurs X distants et XDM permet à des serveurs X distants de se connecter à cette machine.)
Par défaut XDM est configuré pour le serveur X local, avec un terminal X.

Les principales étapes de XDM, en utilisation locale, sont :

/usr/bin/xdm

xdm est un fichier compilé. Il lit son fichier de configuration /etc/X11/xdm/xdm-config

Xsetup_0

définit et affiche l'écran de connexion

Xstartup

vérifie l'authentification de l'utilisateur

/usr/share/X11/xdm/Xsession

exécute simplement le fichier /etc/X11/Xsession, sans argument

/etc/X11/Xsession

Xsession assemble toutes les ressources X, définit la session à ouvrir, lance les commandes du répertoire /etc/X11/xinit.d et enfin ouvre votre session avec son bureau.

La définition du bureau à ouvrir suit une règle bien définie.
Aucun argument n'étant donné, le bureau est recherché, dans l'ordre suivant :

  1. celui de votre fichier ~/.desktop, s'il existe,
  2. à défaut, celui du fichier /etc/sysconfig/desktop, s'il y est défini,
  3. à défaut, le premier du répertoire /usr/share/xsessions
Haut