Systemd

De Banane Atomic
Aller à la navigationAller à la recherche

Commandes

Services

Bash.svg
# Démarrer une unité
sudo systemctl start <unit>
# Arrêter une unité
sudo systemctl stop <unit>
# Redémarrer une unité
sudo systemctl restart <unit>

# Inclure un service au démarrage
sudo systemctl enable <service_name>
# Retirer un service du démarrage
sudo systemctl disable <service_name>

# tester si un service va être lancé au démarrage
systemctl is-enabled <service_name>

# test si un service fonctionne
systemctl is-active <service_name>
if (systemctl is-active --quiet <service_name>); then
    sudo systemctl start <service_name>
fi

Debug

Bash.svg
# Lister les unités en fonctionnement
systemctl

# Lister les unités qui ont échouées
systemctl --failed

# Liste les unités installées, et indique celles qui sont chargées
systemctl list-unit-files
# Les fichiers des unités sont dans /usr/lib/systemd/system/ et /etc/systemd/system/
# filter avec | grep enabled

# Tester l'état d'un service
systemctl status <service_name>

# Afficher le contenu du fichier chargé pour un service donné
systemctl cat <service_name>

# Afficher le dépendances
systemctl list-dependencies <service_name>

# lancer directement le service en debug
SYSTEMD_LOG_LEVEL=debug /lib/systemd/<service_name>

Arrêt du système

Bash.svg
# arrêt de la machine
systemctl poweroff

# redémarrer
systemctl reboot

# mise en veille
systemctl suspend

# hibernation
systemctl hibernate

# combinaison de la mise en veille et de l'hibernation
systemctl hybrid-sleep
Les utilisateurs d'une session locale peuvent utiliser des commandes lié à l'arrêt du système sans sudo grâce à polkit
Allow Users to Shutdown

Fichiers services

/usr/lib/systemd/system units provided by installed packages
/etc/systemd/system units installed by the system administrator

Options

Type

simple si le processus configuré dans ExecStart est le processus principal du service.
forking si le processus configuré dans ExecStart va faire appel à fork(). Le processus parent se terminera à la fin du démarrage du service. Le processus fils devient le processus principal.
oneshot équivalent à simple, toutefois le processus principal doit se terminer avant que systemd ne démarre les unités suivantes. Possibilité d'utiliser RemainAfterExit.
dbus équivalent à simple, toutefois le service obtient un nom sur D-Bus tel que configuré dans BusName.
notify équivalent à simple, toutefois le service envoie une notification à la fin du démarrage.
idle équivalent à simple, toutefois l’exécution du service est retardé jusqu'à la répartition de tous les active jobs.

Étendre la configuration d'un service sans écraser la configuration par défaut

Optimisation

Bash.svg
# temps de démarrage
systemd-analyze

# graphique des temps de chargement
systemd-analyze plot > plot.svg; firefox plot.svg

Timers

Bash.svg
systemctl enable myunit.timer
systemctl start myunit.timer

systemctl is-enabled myunit.timer
systemctl is-active myunit.timer

systemctl list-timers
systemctl --user list-timers
/etc/systemd/system/myunit.timer
[Unit]
Description=Run foo weekly

# Monotonic timer: se déclenche 15mn après le démarrage puis toutes les semaines
[Timer]
OnBootSec=15min
OnUnitActiveSec=1w 

# Realtime timer: se déclenche toutes les semaines
[Timer]
OnCalendar=weekly
Persistent=true     
 
[Install]
WantedBy=timers.target
/etc/systemd/system/myunit.service
[Unit]
Description=...

[Service]
Type=oneshot
# systemd still considers the service as active after the process has exited
RemainAfterExit=yes
ExecStart=...
ExecStart=...
ExecStartPost=...

Services par utilisateurs

~/.config/systemd/user/myunit.service

Bash.svg
systemctl --user start myunit

journalctl

Bash.svg
# affiche tous les messages depuis le boot
journalctl -b
# affiche tous les messages de l'avant dernier boot
journalctl -b -1
# list the known boots
journalctl --list-boots

# display messages from today
journalctl --since today
# 10 minutes ago
journalctl --since "10 minutes ago"
# between 2 dates
journalctl --since "2021-01-30" --until "2021-01-31 18:30"

# affiche les messages de l'unité logrotate
journalctl -u logrotate

# affiche les messages de priorités 4 (warning) et au-dessus
journalctl -p 4
# emerg (0), alert (1), crit (2), err (3), warning (4), notice(5), info (6), debug (7)

# affiche les messages concernant gdm
journalctl -b -p 5 --no-pager | grep gdm

# affiche les messages en temps réel
journalctl -f

# connaître la place prise par les logs
journalctl --disk-usage

# Retain the logs of the last 30 days
sudo journalctl --vacuum-time=30d

# Retain only the past 40 MB
journalctl --vacuum-size=40M

# coloration de l'affichage
journalctl -b | ccze -A | less

How To Use Journalctl to View and Manipulate Systemd Logs

Configuration

/etc/systemd/journald.conf
# Specifies the maximum disk space that can be used by the journal in persistent storage.
# par défaut 10% de la partition
SystemMaxUse=100M

# Specifies the maximum disk space that can be used in volatile storage (within the /run filesystem).
RuntimeMaxUse=100M

Compatibilité avec syslog

« journal » remplace « syslog » mais certain programmes (Postfix) continue à utiliser explicitement syslog et ont besoin que celui-ci soit installé et démarré pour pouvoir loguer dans des fichiers (sinon tous va dans le journal).

Bash.svg
pacman -S syslog-ng
systemctl enable syslog-ng

Target comme kernel parameter

Bash.svg
systemd.unit=multi-user.target # Multi-user, non-graphical

Erreurs

Failed to get D-Bus connection: No connection to service manager.

systemd n'est pas chargé → Chargez systemd.

Migrer d'initscript vers systemd

Chargez systemd

Bash.svg
# installez systemd-sysvcompat
sudo pacman systemd-sysvcompat

# ou au boot, éditer grub (e)
# et ajouter init=/bin/systemd

Redémarrez
(GDM ne devrait pas se lancer car systemd n'utilise pas /etc/inittab)

Remplacez les DAEMONS par les unités systemd

dbus et alsa sont chargés automatiquement.
systemd possède son propre mécanisme de journalisation, syslog n'est plus requis par défaut.

Bash.svg
# Pour chaque daemon du fichier /etc/rc.conf, 
# utilisez la commande suivant pour inclure le service au démarrage dans systemd
sudo systemctl enable <service_name>

# Exemples
# syslog-ng
sudo systemctl enable syslog-ng.service
# networkmanager
sudo systemctl enable NetworkManager.service
sudo systemctl enable NetworkManager-wait-online.service
# crond
sudo systemctl enable cronie.service
# cupsd
sudo systemctl enable cups.service
# mysqld
sudo systemctl enable mysqld.service
# httpd
sudo systemctl enable httpd.service

Équivalent systemd des daemons initscript

GDM

systemd n'utilise pas le fichier /etc/inittab.

Bash.svg
sudo systemctl enable gdm.service