SystemD, une petite révolution dans le système d’initialisation
Une révolution a eu lieu dans le domaine des systèmes d’exploitation GNU/Linux. Le processus d’initialisation de l’OS, (qui s’occupe de gérer le démarrage, du lancement du noyau Linux à l’interface graphique, ainsi que la surveillance des processus) était jusqu’alors géré majoritairement par SysVinit.
A présent, le nouveau système d’initialisation Systemd (de Lennart Poettering) remplace peu à peu SysVinit, dans la plupart des distributions Linux (ex. Red Hat / Centos 7, Debian 8, Ubuntu 15.04, Fedora 15, Archlinux, gentoo…).
Il y a énormément de polémiques sur ce changement entre les « pros » et anti Systemd mais, ce n’est pas le sujet de cet article.
S’adapter à un nouveau système
Cet état de fait nous oblige (en tant qu’intégrateur Talend), à modifier la manière avec laquelle nous installons les différents services de la plateforme Talend sur un serveur GNU/Linux.
Par ailleurs, il faut savoir que Talend, depuis la version 5.6.1, supporte les distributions Red Hat / Centos 7, mais que la documentation concernant l’installation des services, est toujours restée sur l’utilisation de SysVinit (elle devrait être mise à jour pour Systemd à partir de la prochaine version 6).
Nous devons donc, nous adapter à ce nouveau système.
Comment mettre en place un service avec SystemD
Après avoir installé vos différentes briques Talend (TAC, commandLine, Jobserver, tlogserver…) à partir de l’installateur Talend et avoir sélectionné l’installation des services, vous trouverez, comme à leur habitude, les scripts de démarrage et d’arrêt des différents services Talend, dans le répertoire /etc/init.d/.
ETAPE 1 : VÉRIFICATION DES SCRIPTS DE SERVICES EXISTANTS
Dans ces scripts de services, assurez-vous de ne pas forcer pas le démarrage / l’arrêt avec un autre compte de service, comme il est d’usage de le faire. Voir dans l’exemple ci-dessous (remplacer ce qui est en gras par ce qui est souligné) :
start() {# the start has 2 cases:
# 1- tac is installed with embedded tomcat: (install_type=1)
# in this case, just call the start_tac.sh script in tac home directory
# 2- tac is installed on an external tomcat: (install_type=2)
# in this case, go to the /bin dorectory of tomcat and run the startup.sh
# (make sure catalina directory is correct above and /bin/startup.sh exists)
echo -n « starting talend administration center… »
if [ $INSTALL_TYPE -eq 1 ]; then
cd $TAC_HOME
#su – $user -c « cd $TAC_HOME && ./start_tac.sh »
cd $TAC_HOME./start_tac.sh
fi
Le compte de service sera défini dans un autre script spécifique à Systemd, que nous verrons par la suite. A présent, assurez-vous que ces scripts sont fonctionnels, à l’aide des commandes :
/etc/init.d/<le nom du script> start et /etc/init.d/<le nom du script> stop
ETAPE 2: DÉPLACEMENT DES SCRIPTS DE SERVICES
Lorsque vous êtes certains que ces scripts sont opérationnels, déplacez les dans le répertoire /usr/lib/systemd/scripts.
ETAPE 3 : DÉFINITION DU SCRIPT DE SERVICE SYSTEMD
Avec Systemd, vous devez créer un script de déclaration du service, dans le répertoire /usr/lib/systemd/system. La convention de nommage de ce fichier doit être : <nom du script de service>.service comme par exemple : talend-tac-561.service qui correspondra à mon script /usr/lib/systemd/scripts/talend-tac-561. Ceci dans l’optique d’une meilleure visibilité et maintenabilité.
Dans le script talend-tac-561.service, vous devez saisir les informations suivantes :
[Unit]
Description=Talend Administrator Center v5.6.1
After=syslog.target network.target mariadb.service httpd.service
[Service]
Type=oneshot
User=crouzeaud
ExecStart=/usr/lib/systemd/scripts/talend-tac-561 start
ExecStop=/usr/lib/systemd/scripts/talend-tac-561 stop
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Explication des éléments du script :
Dans la balise [Unit] vous trouverez la description du service avec l’argument Description=… L’argument After= permet de définir l’ordre de démarrage des services lorsque celui-ci est important.
Dans la balise [service] vous trouverez l’argument Type=oneshot qui permet de lancer la commande une seule fois puis de sortir. Avec ce type de démarrage, vous devez avoir en plus l’argument RemainAfterExit=yes, afin que Systemd considère que le processus est actif après la sortie.
Toujours dans cette même balise, l’argument [User]= permet de définir le compte de service (compte utilisateur qui exécutera le processus). Les arguments ExecStart= et ExecStop= spécifient les commandes qui seront utilisées pour démarrer et arrêter le service. L’argument TimeoutSec= permet quant à lui, de définir le temps d’attente maximum à partir duquel Systemd le considèrera comme ayant échoué.
Dans la balise [Install], vous trouverez l’argument WantedBy= qui signifie que ce service sera dépendant du service multi-user.target.
ETAPE 4 : LANCEMENT, RE-LANCEMENT ET ARRÊT DU SERVICE AVEC SYSTEMD
Maintenant que votre script Systemd de déclaration de service est prêt, vous pouvez lancer le service avec la commande sudo systemctl start talend-tac-561.service
Pour vous assurer que ce service est bien lancé, vous pouvez taper la commande sudo systemctl status talend-tac-561.service qui vous retournera l’état du service.
Par ailleurs, pour arrêter le service, vous devez utiliser la sudo systemctl stop talend-tac-561.service et sudo systemctl reload talend-tac-561.service dans le cas où vous souhaitez le redémarrer.
ETAPE 5 : DÉCLARATION DU SERVICE AU DÉMARRAGE DU SYSTÈME
Pour activer le service au démarrage du système, vous devez utiliser la commande sudo systemctl enable talend-tac-561.service
La commande systemctl is-enabled talend-tac-561.service vous permettra de vérifier si le service est bien activé au redémarrage de la machine.
Vous pouvez utiliser la commande systemctl list-units pour avoir la liste de tous les services. Il est possible de filtrer cette liste, avec des commandes comme systemctl list-units –type=service ou systemctl | grep talend
ETAPE 6 : MODIFICATION ULTÉRIEURE DU SCRIPT DE SERVICE
A chaque modification des scripts de service (Systemd et Bash), il est impératif de lancer la commande systemctl daemon-reload, afin que Systemd soit réinitialisé et qu’il scanne les nouveaux, et changements, d’units.
ETAPE 7 : RECHERCHE D’ERREUR ET SYSTÈME DE JOURNALISATION
Systemd dispose de son propre système de journalisation, interrogeable à l’aide de la commande journalctl. Ce dernier journalise toutes les étapes d’initialisation et de démarrage des services et ce, depuis le boot. Par exemple, vous pouvez utiliser les arguments suivants :
sudo journalctl -e pour aller en dernière page
sudo journalctl -xn permet d’avoir plus détail sur les n dernière lignes
Ces commandes vous permettront d’identifier les problèmes l’hors de la mise en place de vos scripts.
Gestion de démarrage et d’arrêt du système avec SystemD
Bien que les commande halt et reboot sont toujours fonctionnelles pour le démarrage et l’arrêt de l’ensemble du système, elles sont en réalité des alias des commandes :
$ systemctl reboot
$ systemctl poweroff
Cédric Rouzeaud
Sources utiles et informations complémentaires
man systemctl; man journalctl
http://fr.wikipedia.org/wiki/Systemd
http://www.freedesktop.org/wiki/Software/systemd/
https://wiki.archlinux.org/index.php/Systemd
http://wiki.call-cc.org/spiffy-systemd-scripts
Sections commentaires non disponible.