Adel ALLAM @apges01

systemd


systemd


  • system deamon
  • système d’initialisation
  • lance processus au démarrage
  • les gérer tout au long de leur exécution
  • conçu pour tourner avec le noyau Linux

systemd processus

  • premier processus lancé
  • dernier à s’arrêter
  • PID 1
  • PPID 0 (noyau)

history

  • successeur d’init System V, (init)
  • successeur d’upstart » (développé par Canonical (Ubuntu))
  • systemd est réputé pour être plus performant que ces derniers

working


systemd manipule des units qui sont de différents types:

  • cibles ou targets
  • services

Les units sont dans /lib/systemd/system/* sous forme de fichiers.

Dans systemd, il n’y a plus réellement de notions de « runlevels », ou niveaux d’exécutions, initialement présent dans init System V. Ces niveaux sont remplacés par des tagets. On peut encore trouver des traces de runlevels, mais sont souvent utilisés pour assurer une retro compatibilité avec « init ». Systemd est complètement compatible avec init, mais l’inverse n’est pas vrai.

Voici les correspondances entre les runlevels et les targets de systemd :

init (runlevel) systemd
0 poweroff.target
1 rescue.target
2/3/4 multi-user.target
5 graphical.target
6 reboot.target

Pour connaitre le runlevel d’une machine: $ systemctl get-default

On remarquera que la cible « default.target » qui se trouve dans /lib/systemd/system/* est un lien symbolique qui pointe vers le « .target » du runlevel actuel.

Changer runlevel : $ systemctl set-default multi-user.target. Ce qui aura pour effet de simplement modifier le lien symbolique de default.target.

Appliquer la nouvelle cible à l’exécution courante: $ systemctl isolate multi-user.target


service exemple


Les units dans /lib/systemd/system/* respectent toutes la même mise en forme, et partagent de nombreuses directives définies par systemd.

# /lib/systemd/system/sshd.service
[Unit]
Description=OpenBSD SecureShell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExistStatus=255
Type=notify

[Install]
WantedBy=multi-user.target
Alias=sshd.service

analyze

[Unit]
Description=OpenBSD SecureShell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
  • Description : description du service
  • After : dépendances, sshd démarre si et seulement si network.target (le réseau) et auditd.service sont actifs. Si ce n’est pas le cas, systemd se charge de les activer avant l’activation de sshd.
  • ConditionPathExists : on s’assure aussi que le fichier /etc/ssh/sshd_not_to_be_run n’existe pas
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExistStatus=255
Type=notify
  • EnvironmentFile : fichier avec variables à charger qui seront utilisées dans ce fichier
  • ExecStartPre : commande pour démarrer le service
  • ExecStart : commande pour démarrer le service
  • ExecReload : commande pour recharger la configuration du service
  • KillMode : commande pour arrêter le service
[Install]
WantedBy=multi-user.target
Alias=sshd.service
  • WantedBy : cible dans laquelle le service doit être démarrée
  • Alias : un alias

Remarque : pour les unités de type target (cible), il existe un répertoire .wants/ qui contient les dépendances de la cible, qui sont des liens symboliques. Par exemple la cible mutli-user.target possède un dossier multi-user.target.wants/.

Remarque : l’activation d’un service ajoute un lien vers l’unité active vers le .taget.want/ actuel.


commands


# lister les cibles ou services actifs
$ systemctl list-units -–type target
$ systemctl list-units –-type service

# afficher toutes les cibles ou services
$ systemctl list-units -–type target –all
$ systemctl list-units –-type service –all

# afficher une liste complète
$ systemctl list-unit-fils –-type target/service
$ systemctl list-unit-fils –-type service

# gérer un service
$ systemctl status sshd
$ systemctl start sshd
$ systemctl stop sshd
$ systemctl reload sshd
$ systemctl enable sshd
$ systemctl disable sshd
$ systemctl is-enabled sshd

# afficher les dépendances d’une unité
$ systemctl list-dependencies –-before ssh
$ systemctl list-dependencies –-after ssh

# gérer la machine
$ systemctl halt
$ systemctl poweroff
$ systemctl reboot
$ systemctl shutdown

# Masquage
# un service désactivé (disabled) et stoppé, peut tout de même tourner car il peut être issu d’une dépendance. On peut interdire ce comportement avec :
$ systemctl mask sshd
$ systemctl unmask sshd

systemd family


# logs
$ journalctl
$ journalctl -f # follow
$ journalctl -u apache2 # specific service
$ journalctl -f -u apache2
$ logger 'yolo' # envoyer un log
# network
$ networkctl # lol
# locales
$ localectl status
$ localectl list-loacles
$ localectl set-locale fr_FR.utf8
$ localectl list-keymaps
$ locatectl set-keymap
$ localectl list-x11-keymap-XXX
$ localectl set-x11-keymap fr
$ LANG=C ls --help
$ LANG=fr_FR.UTF-8 ls --help
# date en time
$ timedatectl status
$ timedatectl set-time '20:20'
$ timedatectl list-timezones
$ timedatectl set-timezone Europe/London
$ timedatectl set-ntp TRUE/FALSE
$ systemctl status systemd-timesyncd # use this service for ntp
$ vim /etc/systemd/timesyncd
...
NTP=fr.pool.ntp.org
...
$ systemctl restart systemd-timesyncd
# hostname
$ hostnamectl status
$ hostnamectl set-hostname vm-debian
$ hostnamectl set-location 'Room 110'
$ hostnamectl set-chassis '3'
$ hostnamectl set-deployement 'PRE-PROD'