Supervision des services système sous Linux avec runit et BusyBox

Introduction à la supervision avec runit

runit est un framework de supervision de services Unix léger et performant, conçu pour initialiser, surveiller et redémarrer automatiquement les processus système. Comparé aux systèmes d'initialisation traditionnels, runit offre une architecture beaucoup plus épurée, ce qui le rend particulièrement adapté aux systèmes embarqués ou aux environnements où les ressources sont limitées. Lorsqu'il est couplé à BusyBox, il fournit des capacités de gestion de services professionnelles sans nécessiter l'installation de composants supplémentaires.

Architecture et définition des services

La conception de runit repose sur une structure de répertoires simple. Chaque service est défini par un dossier contenant un script exécutable nommé run. Ce script doit se terminer par une commande exec pour remplacer le processus shell par le service lui-même, permettant ainsi à runit de superviser directement le processus cible et de détecter ses changements d'état.

mkdir -p /etc/runit/sv/syslog
cat << 'EOF' > /etc/runit/sv/syslog/run
#!/bin/sh
exec syslogd -n -O /var/log/messages
EOF
chmod 0755 /etc/runit/sv/syslog/run

Contrôle et gestion de l'état

L'utilitaire en ligne de commande sv permet d'interagir avec le superviseur pour contrôler le cycle de vie des processus. Il offre une interface unifiée pour vérifier l'état, arrêter ou relancer les daemons.

# Vérifier l'état actuel du daemon
sv status /etc/runit/sv/syslog

# Interrompre le service proprement
sv down /etc/runit/sv/syslog

# Forcer le démarrage du service
sv up /etc/runit/sv/syslog

Configuration des services essentiels

Journalisation système et noyau

La centralisation des logs est une composante critique de tout système d'exploitation. En plus du journaliseur standard, il est nécessaire de capturer les messages émis par le noyau Linux. Le script de supervision peut intégrer des vérifications pour s'assurer que les dépendances sont satisfaites avant le lancement.

mkdir -p /etc/runit/sv/klog
cat << 'EOF' > /etc/runit/sv/klog/run
#!/bin/sh
# Garantir que le service de log système est actif avant de continuer
sv start /etc/runit/sv/syslog || exit 1
exec klogd -n
EOF
chmod 0755 /etc/runit/sv/klog/run

Acquisition réseau dynamique

Pour les environnements nécessitant une configuration réseau automatisée, un client DHCP peut être supervisé de la même manière. L'utilisation de l'option -b permet au processus de passer en arrière-plan si le serveur DHCP ne répond pas immédiatement, évitant ainsi de bloquer le script run.

mkdir -p /etc/runit/sv/dhcpc
cat << 'EOF' > /etc/runit/sv/dhcpc/run
#!/bin/sh
exec udhcpc -R -b -p /var/run/udhcpc.eth0.pid -s /etc/udhcpc/default.script
EOF
chmod 0755 /etc/runit/sv/dhcpc/run

Intégration au démarage du système

Pour que runit prenne le relais lors du démarrage de la machine, il doit être déclaré dans le fichier de configuration de l'init de base (comme inittab pour BusyBox). Le processus runsvdir est chargé de scanner le répertoire des services actifs et de lancer un superviseur dédié pour chacun d'eux.

::respawn:/sbin/runsvdir -P /etc/runit/run

Activation par liens symboliques

Le mécanisme d'activation ou de désactivation d'un service repose sur la création ou la suppression de liens symboliques dans le répertoire de supervision active. Cela permet de séparer la définition des services de leur état d'exécution.

mkdir -p /etc/runit/run
ln -s /etc/runit/sv/syslog /etc/runit/run/
ln -s /etc/runit/sv/klog /etc/runit/run/
ln -s /etc/runit/sv/dhcpc /etc/runit/run/

Gestion des dépenadnces et bonnes pratiques

Contrairement à d'autres gestionnaires de services qui utilisent des fichiers de configuration déclaratifs pour résoudre les dépendances, runit adopte une approche programmatique. Les dépendances sont gérées directement dans la logique du script run. L'instrucsion sv start bloque jusqu'à ce que le service requis atteigne l'état "up", ou échoue si le service ne peut pas démarrer, ce qui interrompt l'exécution du script dépendant grâce à l'instruction exit 1.

Pour optimiser la configuration globale du système, il est recommandé de compiler BusyBox avec les applets spécifiques à runit (comme sv et runsv) et d'ajuster les paramètres du noyau pour minimiser l'empreinte mémoire, assurant ainsi une exécution fluide de la chaîne de supervision.

Étiquettes: runit busybox linux-init sysadmin embedded-linux

Publié le 3 août à 15h33