« Astuces - systemd » : différence entre les versions

De Wiki doc

(→‎Modification d'un service : Ajout de la section du temps générique + modification du nom de la section sur le temps d'attente spécifique d'un service + correction de mise en forme de mots.)
(Aération du code + corrections typographiques + déplacement de la section "Désactiver la journalisation dans le shell" dans la page "Paramètres linux".)
 
Ligne 1 : Ligne 1 :
[[Category:systemd]]
[[Category:systemd]]
Ce document regroupe les choses qu'on sais faire avec le fameux Systemd... Je ne dirai pas ce que je pense de ce "logiciel" car je risque de déraper...
=Désactiver la journalisation dans le shell=
Sur un système basique (debootstrap), quand on branche une clé USB, un câble réseau, etc... Ça crache les logs directement dans le shell comme sur un équipement Cisco. Pour désactiver ça, il faut créer le fichier suivant avec ce contenu :
vim /etc/sysctl.d/20-quiet-printk.conf
kernel.printk = 3 3 3 3
Un simple redémarrage suffit pour prendre en compte le changement. Si vous voulez appliquer le changement immédiatement (vous êtes en plein test et redémarrer n'est pas envisageable), exécutez simplement cette commande (non testé mais ça viens de la même source donc il n'y a pas de raison que cela ne fonctionne pas) :
echo "3 3 3 3" > /proc/sys/kernel/printk
==Sources de la section==
* https://wiki.archlinux.org/index.php/Silent_boot#sysctl
* https://unix.stackexchange.com/questions/44999/how-can-i-hide-messages-of-udev/45525#45525


=Redémarrer dans l'UEFI=
=Redémarrer dans l'UEFI=
Il est possible de redémarrer la machine directement dans le menu de configuration de l'UEFI via la commande suivante:
Il est possible de redémarrer la machine directement dans le menu de configuration de l{{'}}''UEFI'' via la commande suivante :
  systemctl reboot --firmware-setup
  systemctl reboot --firmware-setup


Ligne 23 : Ligne 10 :
=Modification d'un service=
=Modification d'un service=
==Temps d'attente spécifique==
==Temps d'attente spécifique==
Un truck ultra pète couille avec ''Systemd'' c'est le temps définit à l'attente de finalisation d'une tâche. Un exemple que vous avez sûrement déjà rencontré: Avec ''Ubuntu'' (vu dernièrement avec la ''16.04'') si vous allumez la machine sans connecter le câble réseau vous avez l'obligation d'attendre au démarrage 5min03 avant de pouvoir utiliser la machine !!! Mais pourquoi avoir développé ça bon sang ? Ils ne testent pas leur système ? Ils ne se rendent pas compte que c'est inutilisable ? On va régler ça avec la bidouille suivante qui consiste à passer de 5min d'attente à 5 secondes, c'est déjà plus supportable.
Un truck ultra pète couille avec ''Systemd'' c'est le temps définit à l'attente de finalisation d'une tâche. Un exemple que vous avez sûrement déjà rencontré : Avec ''Ubuntu'' (vu dernièrement avec la ''16.04'') si vous allumez la machine sans connecter le câble réseau vous avez l'obligation d'attendre au démarrage 5min03 avant de pouvoir utiliser la machine !!! Mais pourquoi avoir développé ça bon sang ? Ils ne testent pas leur système ? Ils ne se rendent pas compte que c'est inutilisable ? On va régler ça avec la bidouille suivante qui consiste à passer de 5min d'attente à 5 secondes, c'est déjà plus supportable.


  vim /etc/systemd/system/network-online.target.wants/networking.service
  vim /etc/systemd/system/network-online.target.wants/networking.service


Changez la valeur <source lang="bash" inline>TimeoutStartSec=5min</source> en:
Changez la valeur <source lang="bash" inline>TimeoutStartSec=5min</source> en :
 
  TimeoutStartSec=5
  TimeoutStartSec=5
''Note: l'unité par défaut est la seconde.''
''Note: l'unité par défaut est la seconde.''


Rechargez la configuration de ''Systemd'' (ou redémarrez le système)
Rechargez la configuration de ''Systemd'' (ou redémarrez le système)
  systemctl daemon-reload
  systemctl daemon-reload


==Temps d'attente générique==
==Temps d'attente générique==
Il est possible d’interagir avec le temps d'attente de démarrage et d'arrêt par défaut d'un service (au cas où celui-ci n'est pas renseigné dans son fichier) en spécifiant les valeurs suivantes dans la configuration globale <source lang="bash" inline>/etc/systemd/system.conf</source>:
Il est possible d’interagir avec le temps d'attente de démarrage et d'arrêt par défaut d'un service (au cas où celui-ci n'est pas renseigné dans son fichier) en spécifiant les valeurs suivantes dans la configuration globale <source lang="bash" inline>/etc/systemd/system.conf</source> :
 
  DefaultTimeoutStartSec=5s
  DefaultTimeoutStartSec=5s
  DefaultTimeoutStopSec=5s
  DefaultTimeoutStopSec=5s


Rechargez la configuration de ''Systemd''
Rechargez la configuration de ''Systemd''
  systemctl daemon-reload
  systemctl daemon-reload


==Gestionnaire utilisateur==
==Gestionnaire utilisateur==
Un service mystérieux ralenti considérablement l'extinction de certain Debian Stretch avec comme message '''a job is running for user manager debian'''. Encore un truck à la con. Il convient d'installer (pour je ne sais quelle raison) le service <source lang="bash" inline>watchdog</source> pour régler ça (pourquoi c'est pas installé de base si ça permet de régler le problème ?).
Un service mystérieux ralenti considérablement l'extinction de certain ''Debian Stretch'' avec comme message '''a job is running for user manager debian'''. Encore un truck à la con. Il convient d'installer (pour je ne sais quelle raison) le service <source lang="bash" inline>watchdog</source> pour régler ça (pourquoi c'est pas installé de base si ça permet de régler le problème ?).
 
  apt install watchdog
  apt install watchdog
  systemctl enable watchdog
  systemctl enable watchdog
Ligne 54 : Ligne 47 :
=Création d'un script de démarrage=
=Création d'un script de démarrage=
==Simple==
==Simple==
Cette section va expliquer comment faire un service Systemd qui exécute un script au démarrage du système.
Cette section va expliquer comment faire un service ''Systemd'' qui exécute un script au démarrage du système.


{{info|Ce logiciel étant un peu con, on ne peut pas simplement lui demander d'effectuer une commande, il faut obligatoirement passer par un script, même pour une seul et simple commande...}}
{{info|Ce logiciel étant un peu con, on ne peut pas simplement lui demander d'effectuer une commande, il faut obligatoirement passer par un script, même pour une seul et simple commande...}}


===Création du script du service===
===Création du script du service===
Pour l'exemple, je vais ajouter une règle [Iptables] pour faire du nat.
Pour l'exemple, je vais ajouter une règle [[Iptables]] pour faire du ''NAT''.
 
  vim /usr/bin/nat.sh
  vim /usr/bin/nat.sh
<source lang="bash">
<source lang="bash">
#!/bin/sh
#!/bin/sh
Ligne 66 : Ligne 61 :
iptables -t nat -A POSTROUTING -s 173.16.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 173.16.0.0/24 -o eth0 -j MASQUERADE
</source>
</source>
Donner les droits d’exécution
Donner les droits d’exécution
  chmod +x /usr/bin/nat.sh
  chmod +x /usr/bin/nat.sh


===Création du service Systemd===
===Création du service Systemd===
  vim /etc/systemd/system/nat.service
  vim /etc/systemd/system/nat.service
<source lang="bash">
<source lang="bash">
[Service]
[Service]
Ligne 78 : Ligne 77 :
WantedBy=default.target
WantedBy=default.target
</source>
</source>
Recharger la configuration de Systemd
 
Recharger la configuration de ''Systemd''
 
  systemctl daemon-reload
  systemctl daemon-reload
Activer le service au démarrage
Activer le service au démarrage
  systemctl enable nat.service
  systemctl enable nat.service
Démarrer le service (ceci a pour effet de lancer le script)
Démarrer le service (ceci a pour effet de lancer le script)
  systemctl start nat.service
  systemctl start nat.service
Désactiver le service au démarrage
Désactiver le service au démarrage
  systemctl disable nat.service
  systemctl disable nat.service


Ligne 91 : Ligne 98 :


==Invite au démarrage==
==Invite au démarrage==
Cette section va expliquer comment faire un écran posant des questions et exécutant des actions en fonction des réponses au démarrage de la machine (utile si vous faite votre propre distribution Linux).
Cette section va expliquer comment faire un écran posant des questions et exécutant des actions en fonction des réponses au démarrage de la machine (utile si vous faite votre propre distribution ''Linux'').
Je m'en suis servis afin de modéliser un système au démarrage d'un PXE squashfs en fonction de l'usage prévu par la personne qui démarre.
Je m'en suis servis afin de modéliser un système au démarrage d'un ''PXE squashfs'' en fonction de l'usage prévu par la personne qui démarre.
 
===Création du script du service===
===Création du script du service===
  vim /usr/bin/modelisation
  vim /usr/bin/modelisation
<source lang="bash">
<source lang="bash">
#!/bin/bash
#!/bin/bash
Ligne 163 : Ligne 173 :


===Création du service Systemd===
===Création du service Systemd===
  vim /etc/systemd/system/usage.service
  vim /etc/systemd/system/usage.service
<source lang="bash">
<source lang="bash">
[Unit]
[Unit]
Ligne 180 : Ligne 192 :
WantedBy=default.target
WantedBy=default.target
</source>
</source>
Explications : On crée un script [https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type= oneshot] avec pour script de démarrage ''/usr/bin/modelisation'' (les accents ne sont pas pris en charge). On demande à Systemd d’exécuter ce script dans le TTY2 (on fait ça car sinon le système crache des logs pendant qu'on répond aux questions) et de nettoyer la console lorsqu'il est terminé.
 
Explications : On crée un script [https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type= oneshot] avec pour script de démarrage ''/usr/bin/modelisation'' (les accents ne sont pas pris en charge). On demande à ''Systemd'' d’exécuter ce script dans le ''TTY2'' (on fait ça car sinon le système crache des entrées de journal pendant que l'on répond aux questions) et de nettoyer la console lorsqu'il est terminé.


===Activation du service au démarrage===
===Activation du service au démarrage===
On active le service au démarrage de la machine avec la commande suivante
On active le service au démarrage de la machine avec la commande suivante
  systemctl enable modelisation.service
  systemctl enable modelisation.service
Si vous voulez modifier le script vous devrez recharger la configuration de systemd après les changements avec celle-ci
 
Si vous voulez modifier le script vous devrez recharger la configuration de ''Systemd'' après les changements avec celle-ci
 
  systemctl daemon-reload
  systemctl daemon-reload
Pour supprimer le service au démarrage on utilise cette commande
Pour supprimer le service au démarrage on utilise cette commande
  systemctl disable modelisation.service
  systemctl disable modelisation.service
Lors de l'execution du script (pendant qu'il pose des questions), un '''systemctl status modelisation.service''' affichera
 
Lors de l'execution du script (pendant qu'il pose des questions), un <source lang="bash" inline>systemctl status modelisation.service</source> affichera
 
  ● modelisation.service - Modélisation d'un squashfs
  ● modelisation.service - Modélisation d'un squashfs
     Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
     Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
Ligne 198 : Ligne 218 :
             ├─387 /bin/bash /usr/bin/modelisation
             ├─387 /bin/bash /usr/bin/modelisation
             └─394 dialog --title Mod lisation syst me --yesno Voulez-vous installer un mod le d'utilisation ? 5 51
             └─394 dialog --title Mod lisation syst me --yesno Voulez-vous installer un mod le d'utilisation ? 5 51
Lorsqu'il sera terminé. la commande affichera
Lorsqu'il sera terminé. la commande affichera
  ● modelisation.service - Modélisation d'un squashfs
  ● modelisation.service - Modélisation d'un squashfs
     Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
     Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
Ligne 205 : Ligne 227 :
  août 16 15:12:32 systemd systemd[1]: Starting Modélisation d'un squashfs...
  août 16 15:12:32 systemd systemd[1]: Starting Modélisation d'un squashfs...
  août 16 15:12:34 systemd systemd[1]: Started Modélisation d'un squashfs.
  août 16 15:12:34 systemd systemd[1]: Started Modélisation d'un squashfs.
Après un redémarrage, il n'y a plus qu'a répondre à vos propres questions !
 
Après un redémarrage, il n'y a plus qu'a répondre à vos propres questions.


===Sources de la section===
===Sources de la section===

Dernière version du 5 juin 2021 à 13:26


Redémarrer dans l'UEFI

Il est possible de redémarrer la machine directement dans le menu de configuration de l'UEFI via la commande suivante :

systemctl reboot --firmware-setup

Source de la section

Modification d'un service

Temps d'attente spécifique

Un truck ultra pète couille avec Systemd c'est le temps définit à l'attente de finalisation d'une tâche. Un exemple que vous avez sûrement déjà rencontré : Avec Ubuntu (vu dernièrement avec la 16.04) si vous allumez la machine sans connecter le câble réseau vous avez l'obligation d'attendre au démarrage 5min03 avant de pouvoir utiliser la machine !!! Mais pourquoi avoir développé ça bon sang ? Ils ne testent pas leur système ? Ils ne se rendent pas compte que c'est inutilisable ? On va régler ça avec la bidouille suivante qui consiste à passer de 5min d'attente à 5 secondes, c'est déjà plus supportable.

vim /etc/systemd/system/network-online.target.wants/networking.service

Changez la valeur TimeoutStartSec=5min en :

TimeoutStartSec=5

Note: l'unité par défaut est la seconde.

Rechargez la configuration de Systemd (ou redémarrez le système)

systemctl daemon-reload

Temps d'attente générique

Il est possible d’interagir avec le temps d'attente de démarrage et d'arrêt par défaut d'un service (au cas où celui-ci n'est pas renseigné dans son fichier) en spécifiant les valeurs suivantes dans la configuration globale /etc/systemd/system.conf :

DefaultTimeoutStartSec=5s
DefaultTimeoutStopSec=5s

Rechargez la configuration de Systemd

systemctl daemon-reload

Gestionnaire utilisateur

Un service mystérieux ralenti considérablement l'extinction de certain Debian Stretch avec comme message a job is running for user manager debian. Encore un truck à la con. Il convient d'installer (pour je ne sais quelle raison) le service watchdog pour régler ça (pourquoi c'est pas installé de base si ça permet de régler le problème ?).

apt install watchdog
systemctl enable watchdog
systemctl start watchdog

Sources de la section

Création d'un script de démarrage

Simple

Cette section va expliquer comment faire un service Systemd qui exécute un script au démarrage du système.

INFORMATION

Ce logiciel étant un peu con, on ne peut pas simplement lui demander d'effectuer une commande, il faut obligatoirement passer par un script, même pour une seul et simple commande...

Création du script du service

Pour l'exemple, je vais ajouter une règle Iptables pour faire du NAT.

vim /usr/bin/nat.sh
#!/bin/sh
iptables -F -t nat
iptables -t nat -A POSTROUTING -s 173.16.0.0/24 -o eth0 -j MASQUERADE

Donner les droits d’exécution

chmod +x /usr/bin/nat.sh

Création du service Systemd

vim /etc/systemd/system/nat.service
[Service]
ExecStart=/usr/bin/nat.sh

[Install]
WantedBy=default.target

Recharger la configuration de Systemd

systemctl daemon-reload

Activer le service au démarrage

systemctl enable nat.service

Démarrer le service (ceci a pour effet de lancer le script)

systemctl start nat.service

Désactiver le service au démarrage

systemctl disable nat.service

Source de la section

Invite au démarrage

Cette section va expliquer comment faire un écran posant des questions et exécutant des actions en fonction des réponses au démarrage de la machine (utile si vous faite votre propre distribution Linux). Je m'en suis servis afin de modéliser un système au démarrage d'un PXE squashfs en fonction de l'usage prévu par la personne qui démarre.

Création du script du service

vim /usr/bin/modelisation
#!/bin/bash
# Ce script permet de modéliser une machine démarrant en PXE sur un squashfs afin de gagner du temps lors de phases de tests. Il était prévu de le charger via le réseau mais systemd oblige, je n'ai pas eu le choix de le mettre local (quelle merde ce truck...)
 
# On passe sur le TTY2
chvt 2

# Définition des variables
noyaux=/boot/
aptupdate="debconf-apt-progress -- apt update"
aptinstall="debconf-apt-progress -- apt install -y"

# Création de fichiers vides visant à berner la détection du noyaux des paquets lors de leur installation (nécessaire pour l'installation de certains paquets qui exigent que le noyau soit dans /boot alors que ça n'a aucune importance)
mkdir $noyaux
touch $noyaux/vmlinuz-2 $noyaux/initrd.img-2


dialog --title "Modélisation système" --yesno "Voulez-vous installer un modèle d'utilisation ?" 5 51

if [ $? -eq 0 ]
then
	#On passe à l'invite suivante
	true
elif [ $? -eq 1 ]
then
	#On repasse sur le TTY1
	chvt 1
	#On sort du programme
	exit 0;
else
	#On repasse sur le TTY1
	chvt 1
	exit 1;
fi

exec 3>&1;
choixmodele=$(dialog --menu "Choisir un modèle à installer :" 20 40 3 1 Serveur\ IPSec 2 Serveur\ IPSec\ avec\ wireshark 3 Système\ de\ base 2>&1 1>&3);
exec 3>&-;

if [ $choixmodele -eq 1 ]
then
	echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections;
	$aptinstall strongswan strongswan-pki openvswitch-switch;
elif [ $choixmodele -eq 2 ]
then
	echo "wireshark-common wireshark-common/install-setuid boolean true" | debconf-set-selections;
	echo "strongswan-starter strongswan/runlevel_changes select" | debconf-set-selections
	$aptupdate
	$aptinstall strongswan strongswan-pki openvswitch-switch xorg blackbox wireshark;
elif [ $choixmodele -eq 3 ]
then
	# On repasse sur le TTY1
	chvt 1
	exit 0;
else
	# On repasse sur le TTY1
	chvt 1
	exit 1;
fi

# On repasse sur le TTY1
chvt 1
 
# On sort avec le code 0 (tout est bon)
exit 0

Création du service Systemd

vim /etc/systemd/system/usage.service
[Unit]
Description=Modélisation d'un squashfs
After=getty@tty2.service
 
[Service]
Type=oneshot
ExecStart=/usr/bin/modelisation
StandardInput=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes
 
[Install]
WantedBy=default.target

Explications : On crée un script oneshot avec pour script de démarrage /usr/bin/modelisation (les accents ne sont pas pris en charge). On demande à Systemd d’exécuter ce script dans le TTY2 (on fait ça car sinon le système crache des entrées de journal pendant que l'on répond aux questions) et de nettoyer la console lorsqu'il est terminé.

Activation du service au démarrage

On active le service au démarrage de la machine avec la commande suivante

systemctl enable modelisation.service

Si vous voulez modifier le script vous devrez recharger la configuration de Systemd après les changements avec celle-ci

systemctl daemon-reload

Pour supprimer le service au démarrage on utilise cette commande

systemctl disable modelisation.service

Lors de l'execution du script (pendant qu'il pose des questions), un systemctl status modelisation.service affichera

● modelisation.service - Modélisation d'un squashfs
   Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
   Active: activating (start) since Wed 2017-08-16 15:19:20 CEST; 6s ago
 Main PID: 387 (modelisation)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/modelisation.service
           ├─387 /bin/bash /usr/bin/modelisation
           └─394 dialog --title Mod lisation syst me --yesno Voulez-vous installer un mod le d'utilisation ? 5 51

Lorsqu'il sera terminé. la commande affichera

● modelisation.service - Modélisation d'un squashfs
   Loaded: loaded (/etc/systemd/system/modelisation.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

août 16 15:12:32 systemd systemd[1]: Starting Modélisation d'un squashfs...
août 16 15:12:34 systemd systemd[1]: Started Modélisation d'un squashfs.

Après un redémarrage, il n'y a plus qu'a répondre à vos propres questions.

Sources de la section