Systemd

De Justine's wiki
Aller à la navigation Aller à la recherche

Structure générale de Systemd

https://christine.website/talks/systemd-the-good-parts-2021-05-16

À CONTINUER

Timers Systemd

À CONTINUER

Résumé des commandes

https://www.linuxtrainingacademy.com/systemd-cheat-sheet/

Informations

  • systemctl list-dependencies : Show a unit’s dependencies
  • systemctl list-sockets : List sockets and what activates
  • systemctl list-jobs : View active systemd jobs
  • systemctl list-unit-files : See unit files and their states
  • systemctl list-units : Show if units are loaded/active
  • systemctl get – default : List default target (like run level)

Travailler sur les services

  • systemctl stop service : Stop a running service
  • systemctl start service : Start a service
  • systemctl restart service : Restart a running service
  • systemctl reload service : Reload all config files in service
  • systemctl status service : See if service is running/enabled
  • systemctl enable service : Enable a service to start on boot
  • systemctl disable service : Disable service–won’t start at boot
  • systemctl show service : Show properties of a service (or other unit)
  • systemctl -H host status network : Run any systemctl command remotely

Travailler sur le système

  • systemctl reboot : Reboot the system (reboot.target)
  • systemctl poweroff : Power off the system (poweroff.target)
  • systemctl emergency : Put in emergency mode (emergency.target)
  • systemctl default : Back to default target (multi-user.target
  • systemctl suspend : Mettre en veille
  • systemctl hibernate : Mode hibernation

Travailler avec les logs

  • journalctl : Show all collected log messages
  • journalctl -u network.service : See network service messages
  • journalctl -f : Follow messages as they appear
  • journalctl -k : Show only kernel messages

Travailler avec les targets

  • systemctl isolate multi-user.target : Passer sur la target multi-user
  • systemctl set-default -f multi-user.target : Changer la target par défaut
  • systemctl list-unit-files | grep target  : Voir les targets configurées sur le système
  • systemctl show -p Wants -p Requires <target> : Voir les unités regroupées dans une target


Équivalence Sysvinit vers Systemd

Sysvinit: service SERVICE_NAME start
Systemd: systemctl start SERVICE_NAME (Example: systemctl start cron.service)
Notes: Used to start a service (not reboot persistent)

Sysvinit: service SERVICE_NAME stop
Systemd: systemctl stop SERVICE_NAME
Notes: Used to stop a service (not reboot persistent)

Sysvinit: service SERVICE_NAME restart
Systemd: systemctl restart SERVICE_NAME
Notes: Used to stop and then start a service

Sysvinit: service SERVICE_NAME reload
Systemd: systemctl reload SERVICE_NAME
Notes: When supported, reloads the config file without interrupting pending operations.

Sysvinit: service SERVICE_NAME condrestart
Systemd: systemctl condrestart SERVICE_NAME
Notes: Restarts if the service is already running.

Sysvinit: service SERVICE_NAME status
Systemd: systemctl status SERVICE_NAME
Notes: Tells whether a service is currently running.

Sysvinit: chkconfig SERVICE_NAME on
Systemd: systemctl enable SERVICE_NAME
Notes: Turn the service on, for start at next boot, or other trigger.

Sysvinit: chkconfig SERVICE_NAME off
Systemd: systemctl disable SERVICE_NAME
Notes: Turn the service off for the next reboot, or any other trigger.

Sysvinit: chkconfig SERVICE_NAME
Systemd: systemctl is-enabled SERVICE_NAME
Notes: Used to check whether a service is configured to start or not in the current environment.

Sysvinit: chkconfig –list
Systemd: systemctl list-unit-files –type=service (or) ls /etc/systemd/system/*.wants/
Notes: Print a table of services that lists which runlevels each is configured on or off

Sysvinit: chkconfig –list | grep 5:on
Systemd: systemctl list-dependencies graphical.target
Notes: Print a table of services that will be started when booting into graphical mode

Sysvinit: chkconfig SERVICE_NAME –list
Systemd: ls /etc/systemd/system/*.wants/SERVICE_NAME.service
Notes: Used to list what levels this service is configured on or off

Sysvinit: chkconfig SERVICE_NAME –add
Systemd: systemctl daemon-reload
Notes: Used when you create a new service file or modify any configuration

Runlevels to Targets Cheat Sheet
Sysvinit: 0
Systemd: runlevel0.target, poweroff.target
Notes: Halt the system.

Sysvinit: 1, s, single
Systemd: runlevel1.target, rescue.target
Notes: Single user mode.

Sysvinit: 2, 4
Systemd: runlevel2.target, runlevel4.target, multi-user.target
Notes: User-defined/Site-specific runlevels. By default, identical to 3.

Sysvinit: 3
Systemd: runlevel3.target, multi-user.target
Notes: Multi-user, non-graphical. Users can usually login via multiple consoles or via the network.

Sysvinit: 5
Systemd: runlevel5.target, graphical.target
Notes: Multi-user, graphical. Usually has all the services of runlevel 3 plus a graphical login.

Sysvinit: 6
Systemd: runlevel6.target, reboot.target
Notes: Reboot

Sysvinit: emergency
Systemd: emergency.target
Notes: Emergency shell

Changing runlevels:
Sysvinit: telinit 3
Systemd: systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3)
Notes: Change to multi-user run level.

Sysvinit: sed s/^id:.*:initdefault:/id:3:initdefault:/
Systemd: ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
Notes: Set to use multi-user runlevel on next reboot.

Création d'un service avec systemd

https://doc.ubuntu-fr.org/creer_un_service_avec_systemd

Comme Upstart, systemd utilise des fichiers de configuration correspondant aux différents services à manipuler. Il n'est (en général) plus nécessaire de créer des fichiers bash pour gérer le service, systemd s'occupe de tout (lancement, arrêt, redémarrage, status, gestion des logs, etc) Ces fichiers de configuration se trouvent dans /etc/systemd/system/ et permettent d'indiquer les conditions d'activation ou désactivation d'un service, leur propriétaire, etc.

Une fois le fichier créé:

<source lang="bash"> systemctl enable <nom du service>.service systemctl start <nom du service>.service systemctl status <nom du service>.service </source>

Types de services

  • Service simple : Lance un processus principal. Si le processus a besoin de canaux de communication comme des sockets, ils doivent être prêts avant l'activation du processus. Ainsi, systemd peut traiter les autres unités sans se préoccuper de la fin du lancement d'une unité de type "simple".
  • Service "forking" : C'est lorsqu'un processus père lance un processus fils. Le père s'arrête quand le fils est en place avec tous ses canaux de communication en place. Le processus fils continue à fonctionner en tant que le processus principal du service. systemd poursuit le traitement des autres unités une fois que le processus père se termine. Ce type de service correspond aux services UNIX traditionnels.
  • Oneshot : Similaire à un service simple, mais systemd attend que le processus se termine avant de continuer ses traitements.

Ce type de service est typiquement utilisé comme équivalent aux commandes lancées au démarrage via les scripts d'init system V. Cela permet à systemd de remplacer ce mécanisme. De ce fait, avec systemd des nouveaux services apparaissent, alors qu'ils auraient été simplement des scripts d'init avec SysVinit.

  • dbus : Un service de type dbus est similaire à un service de type simple. Cependant, le processus du service doit obtenir un nom via D-Bus. systemd pourra alors traiter les autres unités.
  • notify : Un service de type notify est similaire à un service de type simple. Cependant, c'est le processus du service qui avertira systemd (via la fonction sd_notfy(3)) qu'il peut traiter les autres unités.

Dbus : Logiciel de communication inter-processus développé par RHEL.

Exemples de fichiers

OneShot

Exemple d'Iptables

<source lang="bash"> [Service] Type=oneshot

  1. Signifie que quand la commande start est terminée, le processus est toujours considéré comme lancé.
  2. Utile pour les oneshot qui lancent une commande mais n'ont pas de processus derrière.

RemainAfterExit=yes

  1. Commande à exécuter au lancement du processus. Obligatoire.

ExecStart=/usr/libexec/iptables.init start

  1. Commande a exécuter pour arrêter le service. Facultatif.

ExecStop=/usr/libexec/iptables.init stop </source>

Service Simple

Exemple de deluged (un client bittorent)

<source lang="bash"> [Unit]

  1. Donne une description du service (affichée pour le status)

Description=Deluge Bittorrent Client Daemon

  1. Indique un pré-requis au lancement du service (ici, être relié au réseau). Le service ne sera pas stoppé si on perd le réseau;
  2. Pour cela, il faut utilise une balise Requires=

After=network-online.target

[Service] Type=simple

  1. Propriétaire du processus

User=deluge Group=deluge UMask=007

ExecStart=/usr/bin/deluged -d

  1. Relancer le service si il crashe

Restart=on-failure

  1. Configures the time to wait before service is stopped forcefully.

TimeoutStopSec=300

[Install]

  1. Dans quel target doit être actif le service (cf la section sur les targets)

WantedBy=multi-user.target </source>

Modèle de service

Il est possible d'avoir des templates de services qui lanceront des copies : par exemple : getty@.service donnera getty@tty1.service, getty@tty2.service... etc. On peut aussi avoir une instance par utilisateur, par exemple.

<source lang="bash"> [Unit] Description=Syncthing - Open Source Continuous File Synchronization for %I Documentation=man:syncthing(1) After=network.target

  1. Spécifier les dépendances d'un service.

Wants=syncthing-inotify@.service

[Service]

  1. %i correspond à l'argument passé au lancement du service.

User=%i ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0 Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4 UMask=0002

[Install] WantedBy=multi-user.target </source>

Concernant user=%i, pour lancer les différentes instances avec les users différents:

systemctl enable syncthing@Connor.service
systemctl enable syncthing@Ripley.service
systemctl enable syncthing@Croft.service

Targets

Systemd introduit la notion de target au sein de ses unités. Une target permet de regrouper dans un seul paquet plusieurs autres unités et de retrouver la notion de runlevel de SystemV.

Runlevels

https://fr.wikipedia.org/wiki/Run_level Pour expliquer simplement la notion de runlevels, il s'agit d'un chiffre de 0 à 6 (et parfois "s") donné par sysvinit pour déterminer les fonctions activées : en gros, le niveau 6 est donné au démarrage, le niveau 0 à l'arrêt. On peut passer d'un niveau à l'autre de façon successive. L'idée est de dire que le système passe d'un état à l'autre et qu'à chaque état peut être associé un ensemble de services et autres. Par exemple, les runlevels de sysvinit sont :

  • 0 : Arrêt
  • 1 : Mono-utilisateur ou maintenance
  • 2 à 5 : Fonction de l'OS
  • 6 : Reboot

Pour les 2 à 5, on peut avoir :

  • 2 : Multi-user sans serveur applicatif
  • 3 : Multi-users avec serveurs applicatifs
  • 4 ou 5 pour lancer l'environnement graphique.

Tableau de correspondance target / runlevel

<source> Runlevel Systemd Target Notes 0 runlevel0.target, poweroff.target Arrête le système 1 runlevel1.target, rescue.target Mode single user 3 runlevel3.target, multi-user.target Mode multi-utilisateur, non graphique 2, 4 runlevel2.target, runlevel4.target, multi-user.target Mode défini par l'utilisateur, identique au 3 par défaut. 5 runlevel5.target, graphical.target Mode graphique multi-utilisateur 6 runlevel6.target, reboot.target Redémarre emergency emergency.target Shell d'urgence </source>

Voir les targets

<source> systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character.

graphical.target @1min 32.691s └─multi-user.target @1min 32.691s

 └─xinetd.service @1min 32.120s +570ms
   └─network-online.target @6.872s
     └─network.target @6.864s
       └─networking.service @6.706s +157ms
         └─network-pre.target @6.695s
           └─firewalld.service @4.043s +2.651s
             └─dbus.service @4.038s
               └─basic.target @4.033s
                 └─sockets.target @4.033s
                   └─dbus.socket @4.033s
                     └─sysinit.target @4.030s
                       └─apparmor.service @3.752s +276ms
                         └─local-fs.target @3.750s
                           └─opt.mount @3.730s +19ms
                             └─systemd-fsck@dev-mapper-vg_root\x2dlv_opt.service @3.558s +169ms
                               └─local-fs-pre.target @3.556s
                                 └─multipathd.service @3.222s +333ms
                                   └─systemd-udev-settle.service @2.097s +1.124s
                                     └─systemd-udev-trigger.service @1.914s +182ms
                                       └─systemd-journald.socket @1.911s
                                         └─-.mount @1.902s
                                           └─systemd-journald.socket @1.911s
                                             └─...

</source>