From f70d62a5a143563d96ee917176316c33e88bd18d Mon Sep 17 00:00:00 2001 From: gcolpart Date: Fri, 6 Jan 2017 14:27:50 +0100 Subject: [PATCH] relecture --- HowtoSystemd.md | 105 ++++++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 44 deletions(-) diff --git a/HowtoSystemd.md b/HowtoSystemd.md index 88f123c7..9109804a 100644 --- a/HowtoSystemd.md +++ b/HowtoSystemd.md @@ -3,24 +3,16 @@ categories: system sysadmin title: Howto 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. +* Manpages : -> **Note**: systemd ne prend aucune majuscule. Ce n'est pas SystemD ou systemD. +[systemd](https://www.freedesktop.org/wiki/Software/systemd/) est un gestionnaire de services (le fameux démon avec le PID 1) en alternative au System V. Il est installé par défaut depuis Debian 8. Son utilisation a suscitée des débats au sein de l'équipe, mais nous l'utilisons sur tous nos serveurs en Debian 8. -Site officiel du projet : - -Toutes les man pages : -Man pages utiles : - -- -- -- # Utilisation de base -## Status de systemd +## Statut systemd -Afficher le status : +Afficher le statut : ~~~ # systemctl status @@ -47,42 +39,46 @@ Lister les unités installées : > **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 + +## Gestion des unités + + Démarrer une unité : ~~~ -# systemctl start unit +# systemctl start ~~~ Arrêter une unité : ~~~ -# systemctl stop unit +# systemctl stop ~~~ Redémarrer une unité : ~~~ -# systemctl restart unit +# systemctl restart ~~~ Recharger la configuration d'une unité : ~~~ -# systemctl reload unit +# systemctl reload ~~~ -Afficher le status d'une unité : +Afficher le statut d'une unité : ~~~ -# systemctl status unit +# systemctl status +# systemctl status -l ~~~ Savoir si une unité est activée ou non : ~~~ -# systemctl is-enabled unit +# systemctl is-enabled ~~~ > **Note** : Attention, si l'unité est en fait un script d'init dans `/etc/init.d/`, `is-enabled` ne fonctionne pas. @@ -90,31 +86,31 @@ Savoir si une unité est activée ou non : Activer une unité au boot : ~~~ -# systemctl enable unit +# systemctl enable ~~~ Désactiver une unité au boot : ~~~ -# systemctl disable unit +# systemctl disable ~~~ Masquer une unité, rendant impossible tout stop/start/… : ~~~ -# systemctl mask unit +# systemctl mask ~~~ Démasquer une unité : ~~~ -# systemctl unmask unit +# systemctl unmask ~~~ Afficher la man page correspondante au service de l'unité : ~~~ -# systemctl help unit +# systemctl help ~~~ Recharger systemd pour prendre en compte les unités modifiées : @@ -122,7 +118,8 @@ Recharger systemd pour prendre en compte les unités modifiées : ~~~ # systemctl daemon-reload ~~~ - + + ## Gestion de l'alimentation Éteindre et redémarrer la machine : @@ -138,13 +135,11 @@ Recharger systemd pour prendre en compte les unités modifiées : ~~~ -##### TODO +# Écriture des unités -journald ? Autre page… ? + -#### TODO - -# Modifier une unité système +## Modifier une unité ~~~ # cp -a /lib/systemd/system/.service /etc/systemd/system/ @@ -174,10 +169,11 @@ Alias=sshd.service > **Note** : Chaque fois qu'une unité est modifiée, il est nécessaire de recharger systemd avec `systemctl daemon-reload`. -# Modifier partiellement une unité + +## 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. -Exemple avec l'unité de varnish : +Exemple avec l'unité de _varnish_ : Dossier `/etc/systemd/system/varnish.service.d`, fichier `/etc/systemd/system/varnish.service.d/varnish.service` : @@ -189,7 +185,7 @@ ExecReload=/etc/varnish/reload-vcl.sh # 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`. +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] @@ -216,17 +212,31 @@ 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 instances 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 : +systemd fonctionne avec le PID 1. Mais il est aussi possible de lancer des instances 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). +Il faut avoir le paquet `libpam-systemd` installé : une session systemd est lancée quand on est connecté à la machine : + +~~~ +$ systemctl --user status +● bar + State: running + Jobs: 0 queued + Failed: 0 units + Since: ven. 2016-12-23 21:15:33 CET; 1 weeks 6 days ago + CGroup: /user.slice/user-1001.slice/user@1001.service + ├─1758 /lib/systemd/systemd --user + └─1760 (sd-pam) +~~~ + +Attention, si l'on veut une session permanente pour un utilisateur, il faut l'activer avec `loginctl` (si l'on ne fait pas cela, les services lancés via `systemctl --user` seront coupés à la déconnexion). Par exemple pour l'utilisateur _foo_ : ~~~ # 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 : +Exemple d'unité utilisateur pour _Tomcat_ : `/etc/systemd/user/tomcat.service` @@ -249,7 +259,7 @@ Type=forking WantedBy=default.target ~~~ -L'utilisateur pourra gérer lui-même le service. +L'utilisateur pourra ainsi gérer lui-même le service : ~~~ $ systemctl --user enable tomcat @@ -259,7 +269,7 @@ $ systemctl --user restart tomcat $ systemctl --user stop tomcat ~~~ -Pour pouvoir gérer `systemctl --user` via `sudo -iu foo`, il est conseillé de mettre ceci dans `/etc/profile.d/systemd.sh` : +*Note* : pour pouvoir gérer `systemctl --user` via `sudo -iu foo`, on conseille de mettre dans `/etc/profile.d/systemd.sh` : ~~~ export XDG_RUNTIME_DIR="/run/user/$UID" @@ -267,7 +277,7 @@ export XDG_RUNTIME_DIR="/run/user/$UID" # Utilisation avancée -## Débug +## Debug Afficher plein d'informations sur l'unité : @@ -275,7 +285,7 @@ Afficher plein d'informations sur l'unité : # systemctl show ~~~ -Débug au démarrage accessible sur tty9 : +_Debug_ au démarrage accessible sur _tty9_ : ~~~ # systemctl enable debug-shell @@ -312,6 +322,7 @@ sysvinit-core Vérifier que GRUB ne se lance pas avec l'option `init=/lib/sysvinit/init`. + # FAQ ## Bind9 @@ -320,7 +331,7 @@ Sous Debian 8, l'unité par défaut ne gère par les options dans `/etc/default/ Voir -## strace Apache (TODO) +## strace Apache impossible 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… @@ -336,7 +347,9 @@ Astuces « bourrin » : ajouter `exit 0` dans `/etc/init.d/networking` et voir 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 + +Vous obtenez _systemd-fsck : Dependency failed for File System Check on /dev/disk/foo_ ? 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 : @@ -356,3 +369,7 @@ LABEL=foo /foo ext4 defaults,nofail,x-systemd.device-timeout=120 0 0 ~~~ Notamment `nofail` pour éviter que cela fasse échouer votre séquence de boot ! + +## systemd VS systemD VS SystemD + +**systemd** ne prend aucune majuscule. Ce n'est pas SystemD ou systemD. \ No newline at end of file