Difficulté: Débutant
Ce cours vous donnera les bases pour utiliser un shell Linux. Ce cinquième cours sera orienté vers la gestion de services avec Systemd et la manipulation d’utilisateurs.
Systemd
Systemd signifie system daemon, un daemon est une application qui tourne en arrière-plan. C’est le premier programme qui démarre après avoir chargé le kernel Linux. Il permet d’orchestrer le démarrage de tous les services du système. Un service est un programme, démarré de façon automatique par le système, parfois selon certaines conditions.
Fichier service
Pour créer un service, on doit tout d’abord créer un fichier de service. On créée un fichier dans /etc/systemd/system/ portant le nom de notre service et se terminant par l’extension .service.
1
mickael@culture-numerique:~$ sudo touch /etc/systemd/system/myservice.service
L’architecture d’un fichier de service est comme suit:
[Unit]
Description=
Wants=network-online.target
After=network.target network-online.target
[Service]
Restart=
Type=
User=
Group=
ExecStartPre=
ExecStart=
ExecStartPost=
WorkingDirectory=
[Install]
WantedBy=multi-user.target
- La section Description dans [Unit] permet de donner une description au service.
- La section Restart dans [Service] permet de définir une politique de redémarrage: always redémarrera le service à chaque fois qu’il se finit, on-failure redémarrera le service à chaque fois que son code de sortie sera différent de 0, on-success redémarrera le service à chaque fois que son code de sortie sera 0, no ne redémarrera jamais le service.
- La section Type permet de définir le type de service: généralement, on utilise simple pour un processus qui reste attaché au shell qui l’exécute, pour un processus qui se détache du shell, on utilise forking.
- Les sections User et Group permettent de définir un utilisateur et un groupe qui vont exécuter le service.
- Les sections ExecStartPre et ExecStartPost permettent d’exécuter une commande avant le démarrage et après l’extinction du service.
- La section ExecStart permet de définir la commande exécutée par le service.
- La section WorkingDirectory permet de définir un dossier à partir duquel le service va être exécuté.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mickael@culture-numerique:~$ sudo cat /etc/system/system/myservice.service
[Unit]
Description=My custom service
Wants=network-online.target
After=network.target network-online.target
[Service]
Restart=always
Type=simple
User=svc_myservice
Group=svc_myservice
ExecStartPre=echo "Service démarré" > /var/log/myservice/myservice.log
ExecStart=/usr/bin/python3 /opt/myservice/myservice.py
ExecStartPost=echo "Service terminé" > /var/log/myservice/myservice.log
WorkingDirectory=/opt/myservice
[Install]
WantedBy=multi-user.target
systemctl
systemctl (lire system control) est la commande permettant de gérer systemd. Elle requiert une élévation de privilèges pour être exécutée. Elle permet de démarrer, arrêter, redémarrer, recharger des services, et bien d’autres choses encore.
Recharger la liste des services
Une fois un fichier de service créé, il faut recharger la liste des services pour le prendre en compte. C’est valable aussi lorsqu’on modifie ou supprime un fichier de service. Pour cela, on utilise la commande systemctl daemon-reload.
Démarrer un service
Pour démarrer un ou des services, on utilise la commande systemctl start suivie du ou des services à démarrer.
1
mickael@culture-numerique:~$ sudo systemctl start myservice
Observer l’état d’un service
Pour observer l’état d’un ou de plusieurs services, on utilise la commande systemctl status suivie du ou des services à observer.
1
2
3
4
5
6
7
8
9
10
11
12
mickael@culture-numerique:~$ sudo systemctl status myservice
● myservice.service - My custom service
Loaded: loaded (/etc/systemd/system/myservice.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-06-22 15:46:02 CEST; 1 days ago
Main PID: 524074 (python3)
Tasks: 11 (limit: 1074)
Memory: 103.1M (high: 350.0M max: 450.0M available: 246.8M)
CPU: 9.655s
CGroup: /system.slice/myservice.service
└─524074 /usr/bin/python3 /opt/myservice/myservice.py
Jun 22 15:36:16 culture-numerique python3[524075]: i am writing a log
Cette commande permet d’obtenir l’état actuel du service (à la ligne Active), ainsi que son temps d’exécution, mais aussi les dernières lignes envoyées dans son STDOUT et STDERR.
Eteindre un service
Pour éteindre un ou plusieurs services, on utilise la commande systemctl stop suivie du ou des services à éteindre.
1
mickael@culture-numerique:~$ sudo systemctl stop myservice
Activer le démarrage automatique d’un service
Pour activer le démarrage automatique d’un ou de plusieurs services, on utilise la commande systemctl enable suivie du ou des services. Pour désactiver ce démarrage automatique, on utilise la commande systemctl disable.
1
mickael@culture-numerique:~$ sudo systemctl enable myservice
systemctl enable et systemctl disable supportent une option –now qui permet d’allumer le service en l’activant ou d’éteindre le service en le désactivant. {.prompt-info}
Commandes
useradd
useradd est une commande permettant d’ajouter des utilisateurs au système. Elle requiert une élévation de privilèges pour être exécutée.
PARAMETRES: l’utilisateur à créer
OPTIONS:
- -m: signifie make home, permet de créer un dossier home pour l’utilisateur.
- -G: signifie groups, permet d’ajouter l’utilisateur à des groupes.
- -s: signifie shell, permet de spécifier le chemin du shell à utiliser pour l’utilisateur (par défaut, sh).
1
mickael@culture-numerique:~$ sudo useradd -m -s $(which bash) cedric
userdel
userdel est une commande permettant de supprimer des utilisateurs du système. Elle requiert une élévation de privilèges pour être exécutée.
PARAMETRES: l’utilisateur à supprimer
OPTIONS:
- -r: signifie remove, permet de supprimer le dossier home de l’utilisateur.
1
mickael@culture-numerique:~$ sudo userdel -r cedric
usermod
usermod est une commande permettant de modifier des utilisateurs du système. Elle requiert une élévation de privilèges pour être exécutée.
PARAMETRES: l’utilisateur à modifier
OPTIONS:
- -a: signifie append, permet d’ajouter une liste de goupes avec l’option -G.
- -G: signifie groups, permet de définir la liste des groups supplémentaires auxquels l’utilisateur appartiendra.
- -r: signifie remove, permet de supprimer l’utilisateur des groupes supplémentaires spécifiés par -G.
- -s: signifie shell, permet de spécifier le chemin du shell à utiliser pour cet utilisateur.
1
mickael@culture-numerique:~$ sudo usermod -a -G sudo gabriel
passwd
passwd est une commande qui permet de modifier un mot de passe. Par défaut, elle change le mot de passe de l’utilisateur. Pour changer le mot de passe d’autres utilisateurs, elle requiert une élévation de privilèges.
PARAMETRES: l’utilisateur dont on veut changer le mot de passe. Si vide, cible l’utilisateur actuel.
OPTIONS:
- -d: signifie delete, peremt de supprimer le mot de passe d’un compte, rendant l’authentification par mot de passe indisponible.
1
2
3
4
5
6
7
8
mickael@culture-numerique:~$passwd
Changing password for mickael.
Current password:
New password:
Retype new password:
passwd: password updated successfully
mickael@culture-numerique:~$ sudo passwd -d gabriel
passwd: password changed.
journalctl
journalctl est une commande permettant de visualiser les sorties STDOUT et STDERR de tout systemd. Elle nécessite une élévation de privilèges. Une fois ouvert, on peut naviguer avec les flèches, et quitter avec q.
OPTIONS:
- -e: signifie end, permet de commencer la lecture à partir des dernières entrées.
- -f: signifie follow, permet de suivre les entrées au moment où elles sont écrites.
- -u: signifie unit, permet de spécifier un service dont on veut voir les entrées.
1
2
3
4
5
6
7
8
9
10
mickael@culture-numerique:~$ sudo journalctl -xu myservice
Jun 22 15:36:16 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:17 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:18 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:19 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:20 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:21 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:22 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:23 culture-numerique python3[524075]: i am writing a log
Jun 22 15:36:24 culture-numerique python3[524075]: i am writing a log