systemd - Amorçage

Création : Debian 11.1 - Bullseye

Sommaire

1 - Principe

1.1 - Processus d'amorçage - Cibles

$ man bootup

Un schéma, extrait du manuel, est fourni ci-dessous

                                        cryptsetup-pre.target veritysetup-pre.target
|
(various low-level v
API VFS mounts: (various cryptsetup/veritysetup devices...)
mqueue, configfs, | |
debugfs, ...) v |
| cryptsetup.target |
| (various swap | | remote-fs-pre.target
| devices...) | | | |
| | | | | v
| v local-fs-pre.target | | | (network file systems)
| swap.target | | v v |
| | v | remote-cryptsetup.target |
| | (various low-level (various mounts and | remote-veritysetup.target |
| | services: udevd, fsck services...) | | remote-fs.target
| | tmpfiles, random | | | /
| | seed, sysctl, ...) v | | /
| | | local-fs.target | | /
| | | | | | /
\____|______|_______________ ______|___________/ | /
\ / | /
v | /
sysinit.target | /
| | /
______________________/|\_____________________ | /
/ | | | \ | /
| | | | | | /
v v | v | | /
(various (various | (various | |/
timers...) paths...) | sockets...) | |
| | | | | |
v v | v | |
timers.target paths.target | sockets.target | |
| | | | v |
v \_______ | _____/ rescue.service |
\|/ | |
v v |
basic.target rescue.target |
| |
________v____________________ |
/ | \ |
| | | |
v v v |
display- (various system (various system |
manager.service services services) |
| required for | |
| graphical UIs) v v
| | multi-user.target
emergency.service | | |
| \_____________ | _____________/
v \|/
emergency.target v
graphical.target

1.2 - Cible par défaut

$ ls -l /usr/lib/systemd/system/default.target
lrwxrwxrwx 1 root root 16 7 août 05:58 /usr/lib/systemd/system/default.target -> graphical.target
$ systemctl get-default
graphical.target

1.3 - Modification de la cible par défaut au prochain redémarrage

1.3.1 Modification dans systemd

$ sudo systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.

$ systemctl get-default
multi-user.target
$ systemd-analyze 
Startup finished in 1.984s (kernel) + 14.771s (userspace) = 16.755s
multi-user.target reached after 14.702s in userspace

$ systemctl status multi-user.target
● multi-user.target - Multi-User System
Loaded: loaded (/lib/systemd/system/multi-user.target; indirect; vendor preset: enabled)
Active: active since Sat 2021-11-27 16:28:06 CET; 23min ago
Docs: man:systemd.special(7)

nov. 27 16:28:06 raspi systemd[1]: Reached target Multi-User System

1.3.2 Modification de la ligne de commande du noyau

systemd.unit=multi-user

1.4 - Changement de cible en cours de fonctionnement

$ sudo systemctl isolate <nom_de_la_cible>
$ systemctl cat graphical.target |grep Isolate
AllowIsolate=yes
$ sudo systemctl isolate graphical.target

$ sudo systemctl isolage multi-user.target
$ sudo systemctl poweroff    # Arrêt du système et de l'alimentation

$ sudo systemctl reboot # Arrêt et redémarrage du système
$ sudo systemctl suspend # L'état du système est sauvegardé en RAM et \
l'alimentation du système est minimisé, mais non arrêté
$ sudo systemctl hibernate # L'état du système est sauvegardé sur disque et l'alimentation est arrêté
$ sudo systemctl hybrid-sleep # L'état du système est sauvegardé en RAM puis sur disque

$ sudo systemctl emergency # mode mono-utilisateur sans systèmes de fichiers montés, ni services disponibles, \
shell d'urgence disponible sur la console principale de l'utilisateur qui interagit avec le système

$ sudo systemctl rescue # système basique avec systèmes de fichiers montés et quelques services de bases disponibles, \
shell de secours sur la console principale

Ces commandes sont (à peu près) équivalentes à

$ sudo systemd isolate <nom_cible.target>

1.5 - Dépendances

$ systemctl list-dependencies
default.target
● ├─avahi-daemon.service
● ├─cron.service
● ├─dbus.service
● ├─dhcpcd.service
● ├─e2scrub_reap.service
● ├─networking.service
......
● ├─basic.target
● │ ├─-.mount
● │ ├─tmp.mount
.....
● │ ├─sysinit.target
● │ │ ├─dev-hugepages.mount
● │ │ ├─dev-mqueue.mount
● │ │ ├─fake-hwclock.service
● │ │ ├─kmod-static-nodes.service
......
$ systemctl list-dependencies local-fs.target
local-fs.target
● ├─-.mount
● ├─boot.mount
● ├─systemd-fsck-root.service
● └─systemd-remount-fs.service
$ systemctl list-dependencies local-fs.target --all
local-fs.target
● ├─-.mount
● │ └─-.slice
● ├─boot.mount
● │ ├─-.mount
● │ │ └─-.slice
.......

2 - Analyse du démarrage

2.1 - systemd-analyze

$ systemd-analyse --version |head -1
systemd 247 (247.3-6+rpi1
$ systemd-analyze --version -H pi@raspi.local |head -1
systemd 247 (247.3-6)

2.2 - Systemd-analyse time

La commande systemd-analyze (équivalente à systemd-analyze time) fournit des informations sur les durées des différentes étapes d'amorçage

$ systemd-analyze
Startup finished in 4.553s (firmware) + 2.060s (loader) + 3.036s (kernel) + 15.566s (userspace) = 25.216s

fournit la décomposition du temps total d'amorçage (depuis la mise sous-tension, jusqu'à la fin des services lancés par systemd), en étapes successives

$ systemd-analyze |tail -1
graphical.target reached after 15.552s in userspace

fournit la durée de la phase systemd depuis le lancement de systemd, jusqu'à la cible par défaut (ici graphical.target)

$ systemd-analyze 
Startup finished in 2.243s (kernel) + 19.601s (userspace) = 21.844s
multi-user.target reached after 17.640s in userspace

2.3 - systemd-analyze blame

$ systemd-analyze blame
13.770s dhcpcd.service
2.793s systemd-random-seed.service
1.946s man-db.service
1.456s dev-mmcblk0p2.device
1.127s rc-local.service
559ms systemd-journal-flush.service
545ms systemd-udev-trigger.service
513ms networking.service
....

2.4 - Systemd-analyze critical-chain

$ systemd-analyze critical-chain 
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.


multi-user.target @17.640s
└─dhcpcd.service @3.869s +13.770s
└─basic.target @3.808s
└─sockets.target @3.808s
└─triggerhappy.socket @3.807s
└─sysinit.target @3.792s
└─systemd-update-utmp.service @3.455s +131ms
└─systemd-tmpfiles-setup.service @3.281s +141ms
└─local-fs.target @3.208s
└─boot.mount @3.140s +66ms
└─systemd-fsck@dev-disk-by\x2dpartuuid-8acef004\x2d01.service>
└─dev-disk-by\x2dpartuuid-8acef004\x2d01.device @2.640s

Le temps affiché

2.5 - Systemd-analyze plot

$ systemd-analye plot >plot.svg
$ gthumb plot.svg
(pc) $ sudo aptitude install librsvg2-bin

(pc) $ rsvg-convert -o plot.png plot.svg
(pc) $ rsvg-convert -f pdf -o plot.pdf plot.svg

plot.svg

end of plot