Implémentations alternatives, généralement basées sur un langage de script :
https://linuxfr.org/news/petit-etat-de-l-art-des-systemes-d-initialisation-1
init
par défaut par pratiquement toutes les distributions
majeures (RHEL, Fedora, Ubuntu, Debian, openSUSE, Arch Linux, NixOS, etc.)init
systemctl
/
et /usr
montées par
l'initrd)systemd-cgls
(/usr)/lib/systemd/system
: Fournies par la distribution (lecture seule);
/run/systemd/system
: Générées à l'exécution, non persistantes;
/etc/systemd/system
: Crées et modifiées par l'administrateur.
Ordre de priorité : /etc/
/run/
/usr/lib/
Liste des units :
systemctl list-unit-files
systemctl list-units
# systemctl cat httpd.service
[Unit]
Description=Apache Web Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
ExecStop=/usr/bin/apachectl graceful-stop
ExecReload=/usr/bin/apachectl graceful
PrivateTmp=true
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
# systemctl show -p Description httpd.service
[Unit]
Description=Apache Web Server
# systemctl start httpd.service
[Unit]
Description=Apache Web Server
[Service]
Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
# systemctl stop httpd.service
[Unit]
Description=Apache Web Server
[Service]
Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
ExecStop=/usr/bin/apachectl graceful-stop
# systemctl kill --signal=SIGTERM httpd.service
# systemctl reload httpd.service
[Unit]
Description=Apache Web Server
[Service]
Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
ExecStop=/usr/bin/apachectl graceful-stop
ExecReload=/usr/bin/apachectl graceful
systemctl status
systemctl show -p Requires nginx
systemctl show -p Wants nginx
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx
systemctl show -p After nginx
systemctl show -p Before nginx
systemctl list-dependencies --after nginx
systemctl list-dependencies --before nginx
Démarrer nginx après mysql et seulement si son lancement a réussi :
$ cat /etc/systemd/system/nginx.service.d/after-mysql.conf
[Unit]
Requires=mysql.service
After=mysql.service
[Unit]
Description=Apache Web Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
ExecStop=/usr/bin/apachectl graceful-stop
ExecReload=/usr/bin/apachectl graceful
[Install]
WantedBy=multi-user.target
# systemctl enable httpd.service
ln -s /usr/lib/systemd/system/httpd.service \
/etc/systemd/system/multi-user.target.wants/
# systemctl disable httpd.service
rm /etc/.../multi-user.target.wants/httpd.service
# systemctl mask httpd.service
ln -s /dev/null /etc/systemd/system/httpd.service
journalctl -e
: affiche les logs les plus récents du boot courantjournalctl -b -1
: affiche les logs du boot précédentjournalctl -b -0 _PID=333
: limite l'affichage aux logs émis par le PID
333 pour ce démarragejournalctl -k
: équivalent de dmesg
(logs du noyau)journalctl -e -u nginx.service
: affiche tous les logs liés au service
nginxjournalctl -f -n 50
: affiche les 50 dernières lignes de log puis affiche les logs
au fur et à mesurejournalctl /usr/bin/dbus-daemon
: tous les logs émis par le binaire
/usr/bin/dbus-daemon
# systemctl --state failed
# systemctl status foo.service
# systemctl show foo.service
# systemctl cat foo.service
systemd.unit=rescue.target
systemd.unit=emergency.target
systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
systemd.debug-shell
(tty9
)systemd.confirm_spawn=true
# systemctl list-jobs
# systemctl list-dependencies
# systemd-analyze dot home.mount | dot -Tsvg > plt.svg
$ firefox plt.svg
# systemd-analyze plot > boot.svg
Vérifier /etc/systemd/journald.conf
:
[Journal]
...
Storage=persistent
# journalctl -b -1
Essentiel :
Optionnel :
Support de « toutes » les options proposées par le noyau :
Exemples : Durcissement système à l'aide de systemd (SSTIC 2017)
resolved
)- Développeurs principaux : Lennart Poettering, Kay Sievers, Harald Hoyer,
Daniel Mack, Tom Gundersen, David Herrmann
--- # Démons principaux **Système** > `systemd` (PID 1), `udevd`, `journald`, `logind` **Utilisateur, lancé à la demande** > `systemd --user` **Système, lancés à la demande** > `localed`, `hostnamed`, `timedated` **Système, optionnels, lancés à la demande** > `timesyncd`, `machined`, `networkd`, `resolved`, `socket-proxyd`
(explicite)
# Gestion des dépendances (implicite)
- Activation via une socket TCP ou UNIX
- Activation via D-Bus
---
# Units : multi-users.target ``` [Unit] Description=Multi-User System Documentation=man:systemd.special(7) Requires=basic.target Conflicts=rescue.service rescue.target After=basic.target rescue.service rescue.target AllowIsolate=yes ``` ---
# Démarrage du système - Démarrage de `default.target` - Boot $\Leftrightarrow$ `systemctl start default.target` - Résolution des dépendances - Démarrage des units - Apparition des devices --- # Démarrage du système ![](img/boot.png) ---
# Usage : Démarrage lorsque le réseau est OK Exemple sous Debian : - Target : `network-online.target}; - Pas de dépendance par défaut; - Choisir ce qui permet d'atteindre l'état « réseau OK »; \pause{ - Les interfaces définies dans le fichier `/etc/network/interfaces} sont configurées : - `\$ ln -s /lib/systemd/system/networking.service /etc/systemd/system/network-online.target.requires/ \pause{ - Service devant attendre que le réseau soit OK\@ : - `\$ cat /etc/systemd/system/foo.service.d/bar.conf ``` [Unit] Requires=network-online.target After=network-online.target ``` --- \begin{frame}[fragile]{Interaction \(\mathbf{udevd}\) / \(\mathbf{systemd}\) - Entrée dans `/etc/fstab} : ``` /dev/sda3 /home ext4 rw,nodev,nosuid 0 2 ``` - Exemple : \begin{enumerate \def\labelenumi{\arabic{enumi}. \setcounter{enumi}{-1 - `systemd-fstab-generator} \(\Rightarrow\) `home.mount - Attends la découverte du périphérique de type block : `dev-sda3.device}; - Vérification du système de fichier : `systemd-fsck@dev-sda.service}; - Monte le système de fichier. \end{enumerate ---
# Design - Similaire à syslog(-ng)/rsyslog : Récupère les messages envoyés par les processus sur la socket `/dev/log` et les stocke sur le disque - Démon lancé très tôt au boot et fortement intégré avec systemd - Cette intégration permets d'obtenir beaucoup plus d'informations que ce qui normalement possible avec (r)syslog(-ng) - Utilise un format de stockage personnalisé et compressé: [Journal File Format](https://www.freedesktop.org/wiki/Software/systemd/journal-files/) ---
# Débugger \(\mathbf{systemd}\)? Documentation : {\footnotesize - \url{https://freedesktop.org/wiki/Software/systemd/Debugging/ - \url{https://fedoraproject.org/wiki/How\_to\_debug\_Systemd\_problems - \url{https://wiki.archlinux.org/index.php/Systemd\#Troubleshooting - \url{https://wiki.debian.org/systemd\#Debugging --- # Design et fonctionnalités : Standardisation - Standardisation : chaque distribution avait ses propres scripts d'init et ses propres fichiers de configurations. - Tout est maintenant commun : - `/etc/hostname} $\Rightarrow$ `hostnamectl}; - `/etc/locale.conf}, `/etc/vconsole.conf $\Rightarrow$ `localectl}; - `/etc/localtime} $\Rightarrow$ `timedatectl}. - Mais pas encore supporté par toutes les distributions (attention notamment sur Debian \& Ubuntu). --- # `/run} - systemd a introduit le dossier `/run}; - Utilise le système de fichier `tmpfs} pour stocker les données temporairement; - Disponible très tôt au démarrage; - Utilisable pour stocker les informations non permanentes liées aux services; - Voir **file-hierarchy(7)}.%chktex 36 --- # tmpfiles.d - `/\{etc,usr/lib\}/tmpfiles.d/*.conf - Liste de dossiers ou fichiers à créer automatiquement au démarrage; - Exemple : `\$ cat /usr/lib/tmpfiles.d/tuned.conf ``` d /run/tuned 0755 root root - ``` - Voir **tmpfiles.d(5)}.%chktex 36 --- \begin{frame}[fragile]{sysusers.d - `/\{etc,usr/lib\}/sysusers.d/*.conf - Liste d'utilisateur système à créer automatiquement au démarrage si ils n'existent pas déjà; - Exemple : `\$ cat /usr/lib/sysuers.d/mariadb.conf ``` u mysql - "MariaDB" /var/lib/mysql ``` - Voir **sysusers.d(5)}.%chktex 36 ---