18
0
Fork 0

changement des sections

This commit is contained in:
Benoît S. 2016-12-14 16:07:01 +01:00
parent 21299ff14c
commit 8dcdb48a7a
1 changed files with 263 additions and 56 deletions

View File

@ -1,43 +1,161 @@
# Howto systemd
https://www.freedesktop.org/wiki/Software/systemd/
systemd est un gestionnaire de services (démon avec le PID 1) en alternative au System V. Il est utilisé par défaut depuis Debian 8.
## Utilisation de base
> **Note**: systemd ne prend aucune majuscule. Ce n'est pas SystemD ou systemD.
# systemctl list-units
# systemctl list-jobs
# systemctl status <service> -l
# systemctl stop/start/restart/reload <service>
# systemctl disable/enable <service>
# systemctl reboot
# systemctl poweroff
# journalctl
# journalctl -u <service>
# journalctl --since="2016-02-04 13:37:00" --until="2016-02-04 13:42:00"
Site officiel du projet : <https://www.freedesktop.org/wiki/Software/systemd/>
## Modifier un service
Toutes les man pages : <https://www.freedesktop.org/software/systemd/man/index.html>
Man pages utiles :
# cp -a /lib/systemd/system/<service>.service /etc/systemd/system/
# vim /etc/systemd/system/<service>.service
# systemctl daemon-reload
- <https://www.freedesktop.org/software/systemd/man/systemd.unit.html>
- <https://www.freedesktop.org/software/systemd/man/systemd.service.html>
- <https://www.freedesktop.org/software/systemd/man/systemd.exec.html>
Syntaxe des fichiers <service>.service : https://www.freedesktop.org/software/systemd/man/systemd.service.html
# Utilisation de base
## Status de systemd
Afficher le status :
~~~
$ systemctl status
~~~
Lister les unités qui tournent :
~~~
$ systemctl
$ systemctl list-units
~~~
Lister les unités en échecs :
~~~
$ systemctl --failed
~~~
Lister les unités installés :
~~~
$ systemctl list-unit-files
~~~
> **Note** : Les unités sont dans `/usr/lib/systemd/system/` (packagé par debian) et `/etc/systemd/system/` (géré par l'administrateur).
## Utilisation des unités
Démarrer une unité :
~~~
# systemctl start unit
~~~
Arrêter une unité :
~~~
# systemctl stop unit
~~~
Redémarrer une unité :
~~~
# systemctl restart unit
~~~
Recharger la configuration d'un unité :
~~~
# systemctl reload unit
~~~
Afficher le status d'une unité :
~~~
$ systemctl status unit
~~~
Savoir si une unité est activé ou non :
~~~
$ systemctl is-enabled unit
~~~
> **Note** : Attention, si l'unité est en fait un script d'init dans `/etc/init.d/`, `is-enabled` ne fonctionne pas.
Activer une unité au boot :
~~~
# systemctl enable unit
~~~
Désactiver une unité au boot :
~~~
# systemctl disable unit
~~~
Masquer une unité, rendant impossible tout stop/start/… :
~~~
# systemctl mask unit
~~~
Démasquer une unité :
~~~
# systemctl unmask unit
~~~
Afficher la man page correspondante au service de l'unité :
~~~
$ systemctl help unit
~~~
Recharger systemd pour prendre en compte les unités modifiés :
~~~
# systemctl daemon-reload
~~~
## Gestion de l'alimentation
Éteindre et redémarrer la machine :
~~~
# systemctl reboot
~~~
Éteindre et couper l'alimentation de la machine :
~~~
# systemctl poweroff
~~~
##### TODO
journald ? Autre page… ?
#### TODO
# Modifier une unité système
~~~
# cp -a /lib/systemd/system/<service>.service /etc/systemd/system/
# vim /etc/systemd/system/<service>.service
# systemctl daemon-reload
~~~
Exemple avec ssh.service sous Debian 8 :
~~~
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
@ -49,67 +167,156 @@ Exemple avec ssh.service sous Debian 8 :
[Install]
WantedBy=multi-user.target
Alias=sshd.service
~~~
## Utilisation avancée
> **Note* : Chaque fois qu'une unité est modifié, il est nécessaire de recharger systemd avec `systemctl daemon-reload`.
# Modifier partiellement une unité
On peut « override » une partie de l'unité en créant un fichier dans `/etc/systemd/system/unit.d/` qui précisera les modifications à faire.
La meilleure méthode pour faire ceci est d'utiliser `systemctl edit <unit>`.
Exemple avec ElasticSearch : TODO
# Utiliser les templates d'unités
On peut créer/utiliser des templates d'unités. Cela permet de gérer à la volée des instances de services. Par exemple pour redis via `/etc/systemd/system/redis@.service`.
~~~
[Unit]
Description=Advanced key-value store instance %i
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/%i.conf
ExecStartPost=/bin/chgrp %i /var/run/redis/%i.sock
ExecStop=/usr/bin/redis-cli shutdown
Restart=always
User=redis
Group=%i
[Install]
WantedBy=multi-user.target
~~~
`%i` correspond au nom d'instance après le `@`.
On pourra ensuite démarrer l'instance foo et bar avec :
~~~
# systemctl start redis@foo redis@bar
~~~
# systemd par utilisateur
systemd fonctionne avec le PID 1. Mais il est aussi possible de lancer des instaces par utilisateur avec le paramètre `--user`. C'est très pratique pour donner les droits à un utilisateur de gérer lui même ses services. (Instances Tomcat par exemple).
Dans un premier temps il faut s'assurer d'avoir le paquet `libpam-systemd` installé. Ensuite si l'on veut que l'utilisateur `foo` ait toujours une session ouverte (pour faire tourner un service) il faut utiliser loginctl :
~~~
# loginctl enable-linger foo
~~~
De cette façon systemd tournera toujours même si l'utilisateur n'est pas connecté.
Exemple d'unité utilisateur pour tomcat :
`/etc/systemd/user/tomcat.service`
~~~
[Unit]
Description=Tomcat %u.
After=network.target
[Service]
WorkingDirectory=/home/%u
Environment="CATALINA_BASE=/home/%u/tomcat"
EnvironmentFile=/home/%u/tomcat/conf/env
UMask=0002
ExecStart=/usr/share/tomcat7/bin/startup.sh
ExecStop=/usr/share/tomcat7/bin/shutdown.sh
ExecStopPost=/bin/sh -c date | /usr/bin/mail -s "%H/%u : Shutdown instance" foo@bar.com
Type=forking
[Install]
WantedBy=default.target
~~~
L'utilisateur pourra gérer lui même le service.
~~~
$ systemctl --user enable tomcat
$ systemctl --user start tomcat
$ systemctl --user status -l tomcat
$ systemctl --user restart tomcat
$ systemctl --user stop tomcat
~~~
# Utilisation avancée
# systemctl show <service>
## Débug
Debug au démarrage accessible sur tty9 :
Débug au démarrage accessible sur tty9 :
# systemctl enable debug-shell
~~~
# systemctl enable debug-shell
~~~
Débug d'une unité :
~~~
# systemctl stop unit
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/unit
~~~
Analyser ce qui prend du temps au démarrage :
~~~
# systemd-analyze
Startup finished in 5.019s (firmware) + 6.128s (loader) + 5min 35.864s (kernel) + 20min 3.148s (userspace) = 25min 50.160s
# systemd-analyze blame | head -3
2.029s systemd-udev-settle.service
1.400s docker.service
1.215s uml-utilities.service
Debug sur le démarrage :
# Migrer de sysvinit à systemd
# systemd-analyze
Startup finished in 5.019s (firmware) + 6.128s (loader) + 5min 35.864s (kernel) + 20min 3.148s (userspace) = 25min 50.160s
# systemd-analyze blame | head -3
2.029s systemd-udev-settle.service
1.400s docker.service
1.215s uml-utilities.service
Cette action est souvent requise lorsque l'on migre de Debian Wheezy à Jessie.
## Migrer de sysvinit à systemd
~~~
# apt install systemd-sysv
The following packages will be REMOVED:
sysvinit-core
# reboot
~~~
# apt install systemd-sysv
The following packages will be REMOVED:
sysvinit-core
# reboot
Vérifier que GRUB ne se lance pas avec l'option `init=/lib/sysvinit/init`.
Vérifier que GRUB ne se lance pas avec l'option _init=/lib/sysvinit/init_
# FAQ
## FAQ
### Bind9
## Bind9
Sous Debian 8, l'unité par défaut ne gère par les options dans /etc/default/bind
Voir http://trac.evolix.net/infogerance/wiki/HowtoDebian/MigrationWheezyJessie#Bind
### strace Apache (TODO)
## strace Apache (TODO)
Une astuce efficace pour stracer un serveur de type Apache était : strace -s65535 -ff /etc/init.d/apache2 restart. Ensuite on joue la requête et on des infos (impossible à faire en prod bien sûr!).
Avec systemd, le strace ne suit pas les forks malgré -ff. À voir pourquoi systemd empêche ça…
### networking
## networking
Sous Debian 8, le démarrage du système se bloque complètement (dead lock) si l'initialisation de process dépendant du réseau (comme NFS, NTP, firewalling…) se fait avant que le réseau soit démarré.
Notamment quand ils sont démarrés via des hooks dans /etc/network/if-*/…cela n'était pas bloquant avec SysV, cf https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754218#30
Astuces "bourrin" : ajouter "exit 0" dans /etc/init.d/networking et voir le souci via systemctl status networking -l ; modifier JobTimeoutUSer => "systemctl show networking -p JobTimeoutUSer"
### Failed to get D-Bus connection: Unknown error -1
## Failed to get D-Bus connection: Unknown error -1
Si en utilisant *systemctl* vous obtenez une erreur "Failed to get D-Bus connection: Unknown error -1" vérifiez si vous êtes bien passé à systemd et n'êtes resté à sysvinit !
### systemd-fsck : Dependency failed for File System Check on /dev/disk/xxx
## systemd-fsck : Dependency failed for File System Check on /dev/disk/xxx
Par défaut, systemd-fsck attend 1m30 l'accès à chaque device disque. Pour diverses raisons (accès à un SAN externe, etc.) cela peut échouer, vous aurez alors :