systemd
27/02/2018systemd
- 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 serviceAfter
: dépendances, sshd démarre si et seulement sinetwork.target
(le réseau) etauditd.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 fichierExecStartPre
: commande pour démarrer le serviceExecStart
: commande pour démarrer le serviceExecReload
: commande pour recharger la configuration du serviceKillMode
: commande pour arrêter le service
[Install]
WantedBy=multi-user.target
Alias=sshd.service
WantedBy
: cible dans laquelle le service doit être démarréeAlias
: 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'