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.

Démarrage de Linux avec Systemd

Historique

01 octobre 2011 : Ébauche de cette page.
11 septembre 2012 : actualisation avec cauldron (mageia 3)
20 novembre 2013 : refonte et actualisation avec mageia 4
29 mars 2018 : actualisation avec mageia 6

Difficulté

Pour : linuxien averti.

 Introduction

La page : Démarrage de l'ordinateur a présenté la partie commune à tous les systèmes d'exploitation.

Dans la présente page, vous trouverez la suite, c'est-à-dire le démarrage de Linux.
System V (cinq) a longtemps été le système de démarrage de Linux, donc de Mandriva et également de Mageia 1.
Mageia 2 et les suivants utilisent maintenant systemd pour démarrer le système linux.

 Le noyau linux

Vous avez vu, sur la page précédente, que la noyau linux a pris la relève du BIOS ou de UEFI, grâce au chargeur de démarrage (GRUB2 par exemple).
Le noyau initialise différents composants matériels (processeur, périphériques, carte graphique ...)
Le noyau lance /usr/sbin/init qui est un lien vers /usr/lib/systemd/systemd
Pour des raisons de compatibilité, il existe également un fichier /usr/bin/systemd et qui pointe également vers /usr/lib/systemd/systemd.

Haut

 Le processus /usr/lib/systemd/systemd

Le noyau exécute donc le processus numéro 1, /usr/lib/systemd/systemd. Son fichier de configuration est : /etc/systemd/system.conf. Ce dernier permet de modifier le système de journalisation (logs) ainsi que quelques autres paramètres, surtout intéressants pour le débogage.

Le mode de démarrage de l'ordinateur (anciennement appelé le runlevel) est donné par le fichier /etc/systemd/system/default.target.

C'est un lien symbolique vers l'un des fichiers correspondant aux anciens runlevel, situés dans le répertoire /usr/lib/systemd/system/ :

Avant de poursuivre dans le processus de démarrage, il faut comprendre le système des unités de systemd.

Haut

 Les unités

Systemd fait appel à la notion d'Unités. Une unité représente un fichier de configuration. Entre autres, une unité peut être :

Ces fichiers et répertoires se trouvent dans le répertoire /etc/systemd/system, pour ceux qui sont paramétrables par l'administrateur système, et dans le répertoire /usr/lib/systemd/system pour les autres.

Haut

 Syntaxe des fichiers .service

Les unités .service permettent notamment de lancer une commande par une ligne ExecStart=

La syntaxe est inspirée des fichiers .desktop, avec des groupes fonctionnels [Unit], [Service] et [Install]

  1. [Unit] contient la description du service et la gestion des interactions avec les autres services (requires, conflicts, after ...)
  2. [Service] décrit les commandes lancées par le service et, éventuellement, celles pour le relancer, le tuer ...
  3. [Install] décrit comment il sera installé (demandé par, alias ...)
Pour les curieux, survolez : le fichier sddm.service (sddm-0.14.3-13.mga6)

[Unit]
Description=Simple Desktop Display Manager
Documentation=man:sddm(1) man:sddm.conf(5))
Conflicts=getty@tty1.service
After=systemd-user-sessions.service getty@tty1.service plymouth-quit.service

[Service]
ExecStart=/usr/sbin/sddm
Restart=Always

[Install]
Alias=display-manager.service

Quelques précisions

Conflicts= l'unité ne doit pas être démarrée si une ou plusieurs autres sont encore en cours d'exécution.

Requires= le fonctionnement de cette unité dépend d'une ou de plusieurs autres unités qui doivent également démarrer. Requires ne détermine pas l'ordre dans lequel les unités doivent être démarrées ou arrêtées. Elles peuvent démarrer simultanément.
Si le démarrage d'une ou de plusieurs autres unités demandées échoue, cette unité sera désactivée.

Wants= comme Requires, mais ici le fonctionnement d'une autre unité est optionnel.

Before, After= configure l'ordre dans lequel les unités doivent être démarrées.
Si une unité foo.service contient un argument Before=bar.service et si les deux unités sont demandées, le démarrage de bar.service est retardé jusqu'à ce que foo.service est mis en marche.

ExecStart= commande à exécuter pour démarrer

ExecStop= commande à exécuter pour arrêter

Restart= précise comment un service peut être redémarré

BusName il s’agit d’un service D-Bus

Alias la présente unité peut également être installée en invoquant le nom de l'unité alias

Haut

 Syntaxe du fichier .socket

Il vient en complément d'un fichier .service et comprend les groupes fonctionnels [Unit], [Socket] et [Install]

  1. [Unit] contient la description du socket
  2. [Socket] décrit la ou les socket(s) qui peuvent être des sockets unix ou réseau (TCP, UDP)
  3. [Install] décrit comment il sera installé (demandé par, alias ...)
Pour les curieux, survolez : le fichier systemd-journald.socket (systemd-units-230-12.mga6)

[Unit]
Description=Journal Socket
Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
Before=sockets.target
IgnoreOnIsolate=yes

[Socket]
ListenStream=/run/systemd/journal/stdout
ListenDatagram=/run/systemd/journal/socket
SocketMode=0666
PassCredentials=yes
PassSecurity=yes
ReceiveBuffer=8M
Service=systemd-journald.service

Haut

 Syntaxe du fichier .target

Une cible (target) est un groupe fonctionnel d'unités. Elle est définie par un fichier .target.

Les fichiers des unités .target ne renseignent pas directement sur les commandes à exécuter. C'est un répertoire .target.wants qui donnent des liens vers des fichiers .service ou vers d'autres fichiers .target.

Dans la pratique, il peut y avoir deux répertoires .target.wants, l'un dans /etc/systemd/system, l'autre dans /usr/lib/systemd/system.

Pour les curieux, survolez : le fichier graphical.target (systemd-units-230-12.mga6)

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yest

Quelques précisions

Requires= le fonctionnement de cette unité dépend d'une autre unité qui doit également être démarrée.
Conflicts= cette unité ne doit pas être démarrée si une ou plusieurs autres unités sont en cours d'exécution.
After= cette unité doit être démarrée après une ou plusieurs autres. À la différence de Requires=, After= n'implique pas que ces unités doivent encore tourner.
AllowIsolate= cette unité peut éventuellement être lancée manuellement avec une commande :
systemctl isolate graphical.target

Haut

 Examen de quelques fichiers d'unités

Compte tenu du grand nombre d'unités, il serait fastidieux d'analyser tous les fichiers de définition. Voici quelques exemples.

La première unité que nous rencontrons est default.target

Afin de simplifier les écritures, les conventions suivantes s'appliquent :

L'unité default.target

Elle est définie par un fichier /etc/systemd/system/default.target

Le fichier /etc/systemd/system/default.target

C'est un lien qui renvoie à → (usr)/runlevelx.target
x=3 si vous démarrez en mode texte, sinon x=5, ce qui est généralement le cas.

En résumé

L'unité default.target renvoie vers l'unité qui doit effectivement être démarrée, en l’occurrence runlevel5.target en mode graphique.

L'unité runlevel3.target (systemd-units-230-12.mga6)

Cette unité est définie par un fichier (usr)/runlevel3.target et un répertoire (usr)/runlevel3.target.wants.

Le fichier (usr)/runlevel3.target

C'est un lien qui renvoie à → (usr)/multi-user.target

Le répertoire (usr)/runlevel3.target.wants

Il est actuellement vide

En résumé

Dans le mode console (runlevel3), runlevel3.target renvoie vers l'unité multi-user.target

L'unité runlevel5.target (systemd-units-230-12.mga65)

Cette unité est définie par un fichier (usr)/runlevel5.target et un répertoire (usr)/runlevel5.target.wants.

Le fichier (usr)/runlevel5.target

C'est un lien qui renvoie à → (usr)/graphical.target

Le répertoire (usr)/runlevel5.target.wants

Il est actuellement vide

En résumé

Dans le mode graphique (runlevel5), runlevel5.target renvoie vers l'unité graphical.target

L'unité multi-user.target (systemd-units-230-12.mga6)

Cette unité est définie par un fichier (usr)/multi-user.target, un répertoire (etc)/multi-user.target.wants et un autre répertoire (usr)/multi-user.target.wants.

Le fichier (usr)/multi-user.target

L'unité multi-user.target

Le répertoire (etc)/multi-user.target.wants

Ce répertoire contient plusieurs liens symboliques : acpid.service, cpupower.service, crond.service, shorewall.service, shorewall6.service, pointant tous vers des fichiers du même nom dans le répertoire → (usr)/. D'autre liens peuvent encore exister en fonction des applications installées.

Le répertoire (usr)/multi-user.target.wants

Ce répertoire contient également plusieurs liens symboliques : dbus.service, getty.target, plymouth-quit-wait.service, plymouth-quit.service, rpcbind.target, systemd-ask-password-wall.path, systemd-logind.service, systemd-update-utmp-runlevel.service, systemd-user-sessions.service, pointant tous vers des fichiers du même nom dans le répertoire → (usr)/

En résumé

Le fichier multi-user.target nous dit que l'unité basic.target est nécessaire et qu'elle doit déjà être en cours d'exécution. Les répertoires (etc)/multi-user.target.wants et (usr)/multi-user.target.wants nous disent que plusieurs autres unités sont nécessaires (souvent des services). Cela dépend des applications et surtout des serveurs qui sont installés.

Haut

L'unité graphical.target (systemd-units-230-12.mga6)

Elle est définie par un fichier (usr)/graphical.target, un répertoire (etc)/graphical.target.wants et un autre répertoire (usr)/graphical.target.wants

Le fichier (usr)/graphical.target

L'unité graphical.target

Le répertoire (etc)/graphical.target.wants

Ce répertoire contient plusieurs liens symboliques : rtkit-daemon.service, upower.service, pointant tous vers des fichiers du même nom dans le répertoire → (usr)/. D'autre liens peuvent encore exister en fonction des applications installées.

Le répertoire (usr)/graphical.target.wants

Ce répertoire contient également un lien symbolique : systemd-update-utmp-runlevel.service, pointant vers le fichier du même nom dans le répertoire → (usr)/

En résumé

Le fichier (usr)/graphical.target nous dit que l'unité (usr)/multi-user.target est nécessaire et qu'elle doit déjà être en cours d'exécution, que, si possible, le service (usr)/display-manager doit tourner, mais que (usr)/rescue.target ne doit pas être démarré.

Haut

L'unité basic.target (systemd-units-230-12.mga6)

Cette unité est définie par un fichier (usr)/basic.target et deux répertoires (etc)/basic.target.wants et (usr)/basic.target.wants.

Le fichier (usr)/basic.target

L'unité basic.target

Le répertoire (etc)/basic.target.wants

Ce répertoire contient plusieurs liens symboliques vers les fichiers éponymes de (usr)/ : dnf-makecache.timer, ip6tables.service, iptables.service, shorewall.service, shorewal5.service

Le répertoire (usr)/basic.target.wants

Ce répertoire contient également des liens symboliques vers les fichiers éponymes de (usr)/ : alsa-restaure.service, alsa-state.service, fedora-auto-relabel-mark.service, fedora-auto-relabel.service, fedora-loadmodules.service, mandriva-everytime.service, mandriva-save-dmesg.service

En résumé

Le fichier basic.target nous dit que l'unité sysinit.target est nécessaire, que les unités sockets.target, timers.target, paths.target et slices.target sont souhaitées et qu'elles doivent toutes déjà être activées.
Les deux répertoires basic.target.wants nous disent que plusieurs autres services sont nécessaires.

Haut

Les unités display-manager.service et prefdm.service (systemd-units-230-12.mga6)

Les unités du type .service ne nécessitent qu'un seul fichier de configuration. Le fichier (usr)/display-manager.service pointe vers le fichier → (usr)/prefdm.service.

L'unité prefdm.service

Haut

 Les outils pour analyser

Afin de suivre le déroulement du processus de démarrage, quelques commandes sont utiles.

Pour des informations plus complètes, voyez la page : Archlinux

systemctl list-units

Elle permet de lister toutes les unités présentes sur le systèmes sans renseigner sur la chronologie.
Les commandes suivantes peuvent être exécutées :
systemctl list-units : liste les unités actives
systemctl list-units -a (ou --all) : liste toutes les unités pouvant être démarrées, actives ou non
systemctl list-units -t service (ou --type=service) : liste tous les services actifs

Survolez : extraits de la sortie de systemctl list-units pour une installation minimale (xdm, IceWM-light)
UNIT                                                           LOAD  ACTIVE SUB       DESCRIPTION
sys-devices-pnp0-00:09-tty-ttyS0.device  loaded active  plugged  /sys/devices/pnp0/00:09/tty/ttyS0
-.mount                                                     loaded active  mounted  /
systemd-ask-password-plymouth.path     loaded active  waiting   Forward Password Requests to Plymouth Directory Watch
prefdm.service                                          loaded active  running  Display Manager
basic.target                                               loaded  active active    Basic System
systemd-journald.socket                           loaded active running   Journal Socket

Avec la signification des 5 colonnes :

  • UNIT : Le nom d'une unité de systemd,
  • LOAD : information indiquant si l'unité a été chargée correctement,
  • ACTIVE : état général d'activation d'une unité,
  • SUB : état d'activation (dépend du type de l'unité : waiting, plugged, mounted, running, exited, listening, active ...),
  • DESCRIPTION : description brève.
systemctl show

systemctl show multi-user.target : pour voir toutes les caractéristiques d'une unité.
systemctl show -p "Wants" multi-user.target : pour voir quels services sont démarrés par une cible donnée (par ex. multi-user.target).
À la place de Wants, vous pouvez également demander "WantedBy", "Requires", "RequiredBy", "Conflicts", "ConflictedBy", "Before", "After".

systemd-cgls

Sous UNIX, un processus peut créer un fork (le programme relance une nouvelle instance, en tâche de fond). Il sort alors complètement de la supervision du processus qui l’a lancé. Prenons, par exemple, un script CGI lancé par un serveur Web. Lorsqu’il crée un fork, il devient orphelin et est rattaché au processus de PID 1. L’arrêt du serveur Web ne le concerne pas, et aucun script système n’est en mesure de le retrouver automatiquement pour le couper.

Le noyau Linux implémente un mécanisme appelé cgroups (control groups) qui permet de créer un groupe et d’y placer des processus. Tout processus créé au sein d’un cgroup y reste, résolvant ainsi notre problème de CGI fou.

La commande systemd-cgls permet d'afficher, de manière récursive, le contenu des groupes de contrôle (cgroup).

Survolez : la sortie de systemd-cgls pour une installation minimale (xdm, IceWM-light)
Control group /:
-.slice
┣ user.slice
┃  ┗ user-1000.slice
┃     ┣ user@1000.service
┃     ┃ ┣ gpg-agent.service
┃     ┃ ┃  ┗ 1829 /usr/bin/gpg-agent --daemon
┃     ┃ ┗ init.scope
┃     ┃     ┗ 1822 /usr/lib/systemd/systemd --user
┃     ┃     ┗ 1825 (sd-pam)
┃     ┗ session-c1.scope
┃         ┣ 1414 /usr/bin/xdm -nodaemon
┃         ┣ 1831 icewm-session
┃         ┣ 1880 /usr/bin/dbus-launch --exit-with-session --sh-syntax
┃         ┣ 1881 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --se...
┃         ┣ 1900 /usr/libexec/polkit-mate-authentication-agent-1
┃         ┣ 1907 icewmbg
┃         ┣ 1908 icewm --notify
┃         ┣ 1912 /usr/libexec/at-spi-bus-launcher
┃         ┣ 1916 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/a...
┃         ┣ 1919 /usr/libexec/at-spi2-registryd --use-gnome-session
┃         ┗ 1929 icewmtray --notify
┣ init.scope
┃  ┗ 1 /sbin/init
┗ system.slice
    ┣ irqbalance.service
    ┃  ┗ 660 /usr/sbin/irqbalance --foreground
    ┣ alsa-state.service
    ┃  ┗ 644 /usr/sbin/alsactl -s -n 19 -c rdaemon
    ┣ mandi.service
    ┃  ┗ 1811 /usr/sbin/mandi -d
    ┣ dbus.service
    ┃  ┗ 664 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfi...
    ┣ powernowd.service
    ┃  ┗ 708 /usr/sbin/powernowd
    ┣ prefdm.service
    ┃  ┣ 1238 /usr/bin/xdm -nodaemon
    ┃  ┗ 1277 /usr/libexec/Xorg -deferglyphs 16 -auth /var/lib/xdm/authdir/authf...
    ┣ network.service
    ┃  ┣ 954 /sbin/ifplugd -I -b -i enp3s0
    ┃  ┗ 1149 dhclient -1 -q -lf /var/lib/dhclient/dhclient--enp3s0.lease -pf /v...
    ┣ gpm.service
    ┃  ┗ 652 /usr/sbin/gpm -m /dev/input/mice -t exps2
    ┣ systemd-logind.service
    ┃  ┗ 636 /usr/lib/systemd/systemd-logind
    ┣ systemd-resolved.service
    ┃  ┗ 1218 /usr/lib/systemd/systemd-resolved
    ┣ crond.service
    ┃  ┗ 1230 /usr/sbin/crond -n
    ┣ polkit.service
    ┃  ┗ 1923 /usr/lib/polkit-1/polkitd --no-debug
    ┣ systemd-udevd.service
    ┃  ┗ 496 /usr/lib/systemd/systemd-udevd
    ┣ acpid.service
    ┃  ┗ 668 /usr/sbin/acpid
    ┣ systemd-journald.service
    ┃  ┗ 450 /usr/lib/systemd/systemd-journald
    ┣ systemd-networkd.service
    ┃  ┗ 699 /usr/lib/systemd/systemd-networkd
    ┗ chronyd.service
        ┗ 651 /usr/sbin/chronyd
ps waxf -eo 'user,pid,cgroup,command'

Cette commande liste les processus actifs et présente le résultat selon la syntaxe donnée par l'option -eo

Survolez : extrait de la sortie de ps waxf -eo 'user,pid,cgroup,command'
USER    PID CGROUP                                             COMMAND
root      2    -                                                          [kthreadd]
root      3    -                                                            \_ [kworker/0:0]
...
root      1    8:devices:/init.scope,1:nam                /sbin/init
root    451  8:devices:/system.slice/sys                /usr/lib/systemd/systemd-journald
root    495  8:devices:/system.slice/sys                /usr/lib/systemd/systemd-udevd
root    635  8:devices:/system.slice/sys                /usr/lib/systemd/systemd-logind
...
root   1435  8:devices:/user.slice,1:nam                /usr/bin/xdm -nodaemon
paiiou 1848  8:devices:/user.slice,1:nam                   \_ icewm-session
paiiou 1924  8:devices:/user.slice,1:nam                       \_ icewmbg
paiiou 1925  8:devices:/user.slice,1:nam                       \_ icewm --notify
paiiou 1946  8:devices:/user.slice,1:nam                       \_ icewmtray --notify
...
systemd-analyze

Cet outil permet d'analyser le démarrage :

Survolez : extrait de la sortie de systemd-analyze blame
9.122s shorewall.service
8.956s systemd-udev-settle.service
7.481s dev-sda1.devicee
 ...
  14ms systemd-update-utmp-runlevel.service
   8ms fedora-wait-storage.service
   5ms tmp.mount
Haut

 Démarrage de systemd

Plusieurs services sont lancés avant qu'un utilisateur ne puisse se connecter.

 Quelques définitions préalables

Le siège

Il s'agit de tout le matériel assigné à une place de travail donnée. Il y a au moins un moniteur, un clavier et habituellement une souris. Il peut également inclure une caméra vidéo, une carte son ...
Ils sont identifiés par leur nom qui commence par seat suivi par au moins un caractère (Ex. seat0).

Dans un système classique, il n'y a qu'un seul siège. Mais un ordinateur peut en avoir plusieurs, permettant à plusieurs personnes de l'utiliser simultanément. Les sièges sont indépendants les uns des autres (affichage différent, éventuellement matériel différent ...). Tout matériel peut être attaché à un siège, mais alors à un seul siège à la fois L'interface réseau restera normalement non attachée afin de servir à tous les utilisateurs..

La session

Elle est déterminée par le moment où un utilisateur se connecte jusqu'au moment où il se déconnecte. Plusieurs sessions peuvent être attachées à un même siège, mais une seule peut être active.
Elle est constituée d'un groupe de process tournant sous le contrôle d'un seul utilisateur. La session peut démarrer et arrêter des process, mais ne peut pas s'échapper de la session.

Uniquement les démons du système (qui ne sont donc pas attachés à une session) peuvent engendrer de nouvelles sessions.

Habituellement une session comprend plusieurs démons procurant des services pour la session (le serveur-X procure des accès graphiques vers d'autres process de session, pulseaudio procure les accès audio ...)
Quand une session est engendrée, le premier processus (processus central) contrôle la session. Il l'initialise, engendre d'autres processus.

 Avant une session utilisateur

Pendant le démarrage, systemd démarre plusieurs démons pour gérer le système. Tous ces démons sont globaux et ne sont pas attachés à un siège ou à une session.

Après son démarrage, systemd met en place les cgroups (control groups) et il les monte dans /sys/fs/cgroup/.
Systemd recherche ensuite les unités à prendre en compte, dans /etc/systemd/system et dans /usr/lib/systemd/system. Une fois que la liste des unités est connue, systemd active l'unité default.target qui renvoie vers multi-user.target (en mode texte) ou graphical.target (en mode graphique).

À partir de là, le contenu change en fonction du mode de démarrage, mais la démarche reste la même.

  1. examen du lien vers l'unité effective de démarrage,
  2. recherche et règlement des conflits possibles avec cette première unité,
  3. installation, ensuite, des différentes unités induites par la première unité,
  4. installation de l'unité qui permet à l'utilisateur de se connecter,
  5. exécution des actions définies par les unités.

La tranche système : system.slice

Parmi ces démons se trouve systemd-login, responsable de la gestion des sessions et des sièges.

Avec systemd-cgls nous trouvons d'abord la tranche système system.slice qui regroupe les services relatifs au système, donc globaux (pour mémoire, il s'agit ici d'une installation minimale, sans le serveur-X) :

Pour les curieux, survolez : analyse avec systemd-cgls
Control group /:
-.slice
┣ init.scope
┃  ┗ 1 /sbin/init
┗ system.slice
    ┣ irqbalance.service
    ┃  ┗ 660 /usr/sbin/irqbalance --foreground
    ┣ alsa-state.service
    ┃  ┗ 644 /usr/sbin/alsactl -s -n 19 -c rdaemon
    ┣ mandi.service
    ┃  ┗ 1811 /usr/sbin/mandi -d
    ┣ dbus.service
    ┃  ┗ 664 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfi...
    ┣ powernowd.service
    ┃  ┗ 708 /usr/sbin/powernowd
    ┣ prefdm.service
    ┃  ┣ 1238 /usr/bin/xdm -nodaemon
    ┃  ┗ 1277 /usr/libexec/Xorg -deferglyphs 16 -auth /var/lib/xdm/authdir/authf...
    ┣ network.service
    ┃  ┣ 954 /sbin/ifplugd -I -b -i enp3s0
    ┃  ┗ 1149 dhclient -1 -q -lf /var/lib/dhclient/dhclient--enp3s0.lease -pf /v...
    ┣ gpm.service
    ┃  ┗ 652 /usr/sbin/gpm -m /dev/input/mice -t exps2
    ┣ systemd-logind.service
    ┃  ┗ 636 /usr/lib/systemd/systemd-logind
    ┣ systemd-resolved.service
    ┃  ┗ 1218 /usr/lib/systemd/systemd-resolved
    ┣ crond.service
    ┃  ┗ 1230 /usr/sbin/crond -n
    ┣ polkit.service
    ┃  ┗ 1923 /usr/lib/polkit-1/polkitd --no-debug
    ┣ systemd-udevd.service
    ┃  ┗ 496 /usr/lib/systemd/systemd-udevd
    ┣ acpid.service
    ┃  ┗ 668 /usr/sbin/acpid
    ┣ systemd-journald.service
    ┃  ┗ 450 /usr/lib/systemd/systemd-journald
    ┣ systemd-networkd.service
    ┃  ┗ 699 /usr/lib/systemd/systemd-networkd
    ┗ chronyd.service
        ┗ 651 /usr/sbin/chronyd

Partie responsable du démarrage graphique

Pour le démarrage en mode graphique, il y a des groupes supplémentaires :

Pour les curieux, survolez : analyse avec systemd-cgls
    ┣ prefdm.service
    ┃  ┣ 1238 /usr/bin/xdm -nodaemon
    ┃  ┗ 1277 /usr/libexec/Xorg -deferglyphs 16 -auth /var/lib/xdm/authdir/authf...

Prefdm.service recherche quel est le gestionnaire de connexion qu'il faut utiliser. Ici c'est xdm. Il lance également le serveur X

Haut

 Instance utilisateur

Dans les groupes de contrôle il y a l'unité systemd-logind.service qui est un service permettant de gérer les sessions utilisateur.

L'extrait de systemd-cgls montre le groupe de process (la tranche) user.slice, le sous-groupe user-1000.slice avec l'unité user@1000.service. Elle lance le service gpg-agent avec le process /usr/bin/gpg-agent --daemo et elle lance également le scope init avec les process //usr/lib/systemd/systemd --user et (sd-pam):

Control group /:
-.slice
┣ user.slice
┃  ┗ user-1000.slice
┃     ┣ user@1000.service
┃     ┃ ┣ gpg-agent.service
┃     ┃ ┃  ┗ 1829 /usr/bin/gpg-agent --daemon
┃     ┃ ┗ init.scope
┃     ┃     ┗ 1822 /usr/lib/systemd/systemd --user
┃     ┃     ┗ 1825 (sd-pam)
Haut

 Session utilisateur

Comme vu ci-dessus, nous trouvons les tranches utilisateur user.slice et user-1000.slice.
Cette dernière contient :

pam-systemd enregistre les sessions utilisateur à l'aide du gestionnaire systemd-login.service. Un nouveau scope est créé pour la session et ce scope est placé dans le sous-groupe de l'utilisateur. Extrait de systemd-cgls :

┗user.slice
   ┗user-1000.slice
      ┗session-c1.scope

Le groupe scope contient tous les process lancés par l'utilisateur.

Haut

 Connexion en mode texte

L'utilisateur démarre en mode texte et lance la commande systemd-cgls. Un extrait donne :

┗user.slice
   ┗user-1000.slice
     ┗session-c1.scope
        ┣ 1887 login -- paiiou
        ┣ 1911 -bash
        ┗ 1952 systemd-cgls

 Connexion en mode texte puis démarrage du mode graphique

Le fonctionnement du lancement de startx est décit ici : Cliquez.
Aucun gestionnaire de connexion n'est requis.

Dans l'exemple ci-dessous, l'utilisateur paiiou se connecte en mode texte et lance la commande startx, puis la commande systemd-cgls dans un terminal xterm de IceWM :

┗user.slice
   ┗user-1000.slice
     ┗session-c1.scope
       ┣ 1885 login -- paiiou
       ┣ 1910 -bash
       ┣ 194 /bin/sh /usr/bin/startx
       ┣ 1964 xinit /etc/X11/xinit/xinitrc -- vt1 -keeptty -auth /home/paiiou...
       ┣ 1965 /usr/libexec/Xorg :0 vt1 -keeptty -auth /home/paiiou/.serveraut...
       ┣ 1970 icewm-session
       ┣ 1997 /usr/bin/dbus-launch --exit-with-session --sh-syntax
       ┣ 1998 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --se...
       ┣ 2018 /usr/libexec/polkit-mate-authentication-agent-1
       ┣ 2020 icewmbg
       ┣ 2026 icewm --notify
       ┣ 2030 /usr/libexec/at-spi-bus-launcher
       ┣ 2034 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/a...
       ┣ 2037 /usr/libexec/at-spi2-registryd --use-gnome-session
       ┣ 2047 icewmtray --notify
       ┣ 2049 /usr/bin/xterm
       ┣ 2078 -bash
       ┗ 2106 systemd-cgls

Haut

 Connexion en mode graphique

Si l'utilisateur a décidé de démarrer en mode graphique avec xdm et IceWM, dmesg nous informe que :

Avec systemd-cgls, nous avons vu ci-dessus, dans la partie Avant une session utilisateur que nous trouvons d'abord la tranche système system.slice qui, comme pour le démarrage en mode texte, regroupe les mêmes services relatifs au système avec, en plus, une unité prefdm.service.

Il faut donc s'attendre à voir beaucoup de points communs avec le démarrage en mode texte : multi-user.target et toutes ses dépendances.
Avec, bien sûr, des éléments supplémentaires, dont le job prefdm.service/start qui recherche un écran graphique de connexion.

Choix du gestionnaire de connexion

prefdm.service lance la commande /etc/X11/prefdm -nodaemon

Déroulement de prefdm :

  1. récupère la langue système avec /etc/profile.d/10lang.sh afin d'avoir les traductions -> $LANG = fr.FR.UTF8
  2. vérifie si autologin est installé (/usr/sbin/autologin) et est configuré (/etc/sysconfig/autologin)
    Si oui, exécute le fichier /etc/sysconfig/autologin qui doit définir un utilisateur et doit valider par AUTOLOGIN=yes
    Mais autologin semble ne pas fonctionner actuellement.
  3. si un fichier /etc/sysconfig/desktop existe, vérifie si le gestionnaire de connexion est spécifié dans ce fichier et affecte sa valeur à dm
    $DISPLAYMANAGER peut prendre les valeurs : GNOME, gnome, Gnome, GDM, gdm, SDDM, sddm, PLASMA5, plasma5, WDM, wdm, XDM, xdm, SLiM, slim, LXDM, lxdm, selon la configuration faite.
    /etc/X11/prefdm en déduit une variable $dm dont la valeur peut être : GNOME, SDDM, WDM, XDM, SLiM, LXDM
  4. exécute le fichier /etc/sysconfig/firstboot s'il existe encore (Mageia ne l'utilise plus)
  5. exécute le fichier /etc/sysconfig/finish-install s'il existe (le paquetage finish-install permet d'affiner les installations oem et n'est habituellement pas installé)
  6. exécute le fichier /etc/X11/lookupdm "$dm". Son rôle est de vérifier si le gestionnaire que vous avez choisi est effectivement présent, et de choisir un gestionnaire par défaut, dans le cas où votre choix pose un problème :
    • si $dm est déjà définie, cherche dans /usr/share/dm.d un fichier *.conf contenant NAME=$dm et cherche l'exécutable associé (EXEC=)
    • sinon, cherche dans /usr/share/dm.d le premier fichier contenant le nom d'un exécutable (EXEC=)
    • renvoie le nom de cette commande
  7. exécute la commande et quitte ce script
  8. si la commande échoue, essaie gdm ou sddm

Comme en mode texte, nous trouvons ensuite les tranches utilisateur user.slice et user-1000.slice.
Cette dernière contient :

Voici le contenu de session-c1.scope :

Control group /:
-.slice
┣ user.slice
┃  ┗ user-1000.slice
┃     ┣ user@1000.service
┃     ┃ ┣ gpg-agent.service
┃     ┃ ┃  ┗ 1829 /usr/bin/gpg-agent --daemon
┃     ┃ ┗ init.scope
┃     ┃     ┗ 1822 /usr/lib/systemd/systemd --user
┃     ┃     ┗ 1825 (sd-pam)
┃     ┗ session-c1.scope
┃         ┣ 1414 /usr/bin/xdm -nodaemon
┃         ┣ 1831 icewm-session
┃         ┣ 1880 /usr/bin/dbus-launch --exit-with-session --sh-syntax
┃         ┣ 1881 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --se...
┃         ┣ 1900 /usr/libexec/polkit-mate-authentication-agent-1
┃         ┣ 1907 icewmbg
┃         ┣ 1908 icewm --notify
┃         ┣ 1912 /usr/libexec/at-spi-bus-launcher
┃         ┣ 1916 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/a...
┃         ┣ 1919 /usr/libexec/at-spi2-registryd --use-gnome-session
┃         ┗ 1929 icewmtray --notify

Mis à part la partie concernant la connexion de l'utilisateur, l'ouverture de la session IceWM en mode graphique est comparable à celle de la connexion en mode texte suivie de la commande startx.

Mais avant de démarrer la session l'unité prefdm avait recherché le gestionnaire de connexion à utiliser, comme indiqué plus haut, lookupdm a vérifié si le gestionnaire existe et en a extrait la commande /usr/bin/xdm ou /usr/bin/sddm, avec un argument -nodaemon.

Gestionnaire de connexion XDM (sans autologin)

Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire XDM Cliquez.

En travaux de mise à jourTravaux




Gestionnaire de connexion SDDM (avec ou sans autologin) Travaux

Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire SDDM Cliquez.

Haut