[Unit]Description=Apache Web Server
[Service]Type=forking
PIDFile=/run/httpd/httpd.pid
ExecStart=/usr/bin/apachectl start
Units : httpd.service
# 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
Units : 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
Gestion des dépendances
Dépendance : Requires= / Wants=
systemctl show -p Requires nginx
systemctl show -p Wants nginx
systemctl list-dependencies nginx
systemctl list-dependencies --reverse nginx
Ordre : After= / Before= :
systemctl show -p After nginx
systemctl show -p Before nginx
systemctl list-dependencies --after nginx
systemctl list-dependencies --before nginx
Comment ordonner le lancement d'un service?
Démarrer nginx après mysql et seulement si son lancement a réussi :
- 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
---