Il y a 8 ans… déjà je vous avais proposé un article pour installer un WATCHDOG (Chien de garde) sur votre Raspberry Pi. Il est peut être temps de remettre ça à jour… Je vous propose cet article qui est une synthèse d’articles dont la référence est dans les sources, en bas de l’article. Vous pourrez ainsi voir l’original [en Anglais]. Les différentes solutions ont été testées.
Au sommaire :
Utiliser le Watchdog (chien de garde) du Raspberry Pi
Matériel Utilisé
- Raspberry Pi 5 4Go RAM + boîtier officiel avec ventilateur
- Carte µSD 16Go
- Raspberry Pi OS Bookworm à jour à la date de l’article (08/2024)
- Clavier/souris
C’est quoi un Watchdog ?
Un Watchdog : ou comme beaucoup l’auront compris un « Chien de garde » est un mécanisme qui permet de vérifier que votre système n’est pas défaillant. Et réagir (ou pas) s’il y a défaillance. En terme plus simple, pour notre cas, faire redémarrer automatiquement le Raspberry Pi si ce dernier est planté.
Bref lui dire « Tu te plantes, et bien redémarre tout seul !«
Ce système, est accessible via les mécanismes standards de Linux.
Je vois déjà les commentaires du genre. « Mais un Raspberry Pi, ça plante jamais… et un Linux encore moins« . Certes, mais deux raisons à cela : d’une part ce qui peut faire « planter » nos Raspberry Pi, ce sont souvent les programmes que nous avons réalisés (boucle infinie oubliée, les « stack overflow », et j’en passe…). Et d’autre part, si votre Raspberry Pi se situe au fin fond du Morvan à plus d’une heure de route et qu’il ne répond plus. Ou qu’en pleine tempête de neige votre génial portail automatique, construit à base de Raspberry Pi, vous ignore…. Vous serez bien content qu’il se soit débrouillé tout seul pour redémarrer. Et dans ce cas là un bon redémarrage ne fait pas de mal. Je pense aussi aux portiers automatiques (sonnette / interphone / ouverture gâche) de certaines immeubles qui utilisent des Raspberry Pi : Sans cette option les conséquences sont non négligeables.
Comment tester le WatchDog ?
On peut « planter » le Raspberry Pi de plusieurs façons, en voici deux qui seront des bons tests pour le watchdog.
Méthode Kernel Panic
Avant de mettre le WatchDog en place je vous propose de voir comment on pourrait le tester. Sinon vous pourriez mettre le bazar en place et… s’il ne fonctionne pas il ne servirait à rien 😀
On peut créer un Kernel Panic ! Cette alerte signale toutes des erreurs impossibles à corriger ou à ignorer et qui interdisent la poursuite du fonctionnement normal de l’ordinateur. Le système s’arrête pour éviter tout dégât supplémentaire.
On peut déclencher manuellement un Kernel Panic avec la commande :
echo c > /proc/sysrq-trigger
Le c dans la commande echo c > /proc/sysrq-trigger est un raccourci pour “crash”. Il indique au noyau de provoquer un kernel panic intentionnellement. Cette commande est souvent utilisée pour tester les mécanismes de récupération du système ou pour générer des dumps de mémoire pour le débogage.
Pour exécuter cette commande il faut être root. Passez en root avec la commande
sudo su –
Pour sortir de ce mode root utilisez exit. Attention si vous lancez la commande pour provoquer un Kernel Panic sans avoir installé de watch dog… la seule solution est un reset hard ou une coupure de l’alimentation!
Méthode Fork Bomb
Présentation de la fork bomb
La fork bomb est une forme d’attaque par déni de service (DoS) contre un système Linux ou Unix. Elle utilise l’opération fork. La fonction :(){ :|:& }; : n’est rien d’autre qu’une fonction bash. Cette fonction est exécutée de manière récursive. Elle est souvent utilisée par un administrateur système pour tester les limites de processus de l’utilisateur sur le serveur. Les limites de processus Linux peuvent être configurées via /etc/security/limits.conf et PAM pour éviter la bombe bash fork(). Une fois fork bomb activée dans un système, il est souvent impossible de reprendre un fonctionnement normal sans redémarrer le système, car la seule solution pour arrêter la fork bomb, c’est de détruire toutes les instances de celle-ci.
La fork bomb est simplement une suite de caractères qui peut sembler bizarre mais représente en réalité un programme bash. Une fois lancé elle va bloquer le Raspberry Pi et le watchdog va redémarrer la machine (Presque 2 minutes sur un Pi 5 avec 4Go de RAM).
Pour lancer la fork bomb il suffit de rentrer ce code sur la ligne de commande :
:(){ :|:& };:
Plus d’infos dur la fork bomb
La fork() bomb est définie comme suit :
:(){
:|:&
}; :
:()
Définit la fonction appelée : . Cette fonction n’accepte aucun argument. La syntaxe des fonctions bash est la suivante :
1 2 3 4 5 6 |
fonction(){ arg1=$1 arg2=$2 echo 'toto..' #Suite de la fonction } |
😐 :
Ensuite la fonction s’appelle elle-même en utilisant une technique de programmation appelée récursivité et envoie la sortie vers un autre appel de la fonction ‘:‘. Le pire est que la fonction est appelée deux fois pour bombarder votre système.
&
Place l’appel de la fonction en arrière-plan afin que l’enfant ne puisse pas mourir et commence à manger les ressources du système.
;
Termine la définition de la fonction.
La fonction est appelée (exécutée) et la bombe fork() est activée.
La voici sous forme d’un code plus lisible :
1 2 3 |
bomb() { bomb | bomb & } ; bomb |
Nota : sur un Linux bien configuré, on peut éviter que la fork bomb bloque le system
Activer le WatchDog – Méthode 1
systemd fait partie intégrante du système d’exploitation du Raspberry Pi, on peut passer par ce mécanisme pour activer un WatchDog.
Ouvrez le fichier system.conf avec nano :
sudo nano /etc/systemd/system.conf
Ajoutez les deux lignes suivantes à la fin du fichier :
RuntimeWatchdogSec=15
RebootWatchdogSec=2min
Après avoir apporté des modifications à la configuration de systemd, vous pouvez sauvegarder et quitter en appuyant sur CTRL + X, suivi de Y ou O, puis de la touche ENTER.
Mais que veulent dire ces lignes ?
RuntimeWatchdogSec : Cette valeur est utilisée pour indiquer au WatchDog le temps qu’il doit attendre avant de réinitialiser votre Raspberry Pi.
En raison des limitations du Pi, cette valeur a une durée maximale de 15 secondes. Cela signifie que lorsqu’il est réglé sur 15, le Raspberry Pi sera réinitialisé si le Watchdog ne reçoit pas de message pendant 15 secondes.
RebootWatchdogSec : Cette valeur s’adresse au chien de garde du reboot et vous permet de déterminer combien de temps votre Raspberry Pi doit attendre la fin d’un redémarrage. S’il reste bloqué plus longtemps que le temps spécifié (2 minutes), le chien de garde forcera une nouvelle réinitialisation.
En activant le WatchDog sur le Raspberry Pi, nous avons apporté des modifications à la configuration de systemd. Pour que ces changements prennent effet, il faut redémarrer le démon systemd en exécutant la commande ci-dessous.
sudo systemctl daemon-reload
On peut aussi redémarrer complètement le système à l’aide de la commande
sudo reboot
Si vous avez opté pour cette méthode il n’y a plus rien à faire. De mon côté pour installer la Méthode 2, je vais supprimer les modifications dans le fichier system.conf pour pouvoir continuer…
Activer le WatchDog – Méthode 2
Cette deuxième méthode suppose que vous n’avez pas appliqué la méthode 1, ou alors si vous l’avez appliquée, vous devrez supprimer les deux lignes ajoutées dans system.conf.
Vérifiez d’abord que votre système est à jour
1 2 |
sudo apt update sudo apt upgrade |
Ajoutez le watchdog dans config.txt
Ajoutez le watchdog à config.txt :
sudo nano /boot/firmware/config.txt
et ajoutez tout à la fin :
dtoverlay=watchdog
Sauvegardez avec CTRL X et Y ou O pour enregistrer.
Installer le démon WatchDog
Dans une fenêtre de terminal, saisissez la ligne suivante pour installer le démon :
sudo apt install watchdog
Lorsque l’installation est terminée, configurez le démon du watchdog
Configurer le démon du WatchDog
Ouvrez le fichier de configuration avec nano pour le modifier
sudo nano /etc/watchdog.conf
Décommentez (enlevez le # au début) ou ajoutez ces lignes si elles n’existent pas :
watchdog-device = /dev/watchdog
max-load-1 = 24
La valeur max-load-1 définit la charge moyenne du système sur une minute au-delà de laquelle le watchdog redémarrera le système. Une valeur de 24 est trop élevée pour un Raspberry Pi avec seulement 4 cœurs. Une valeur plus raisonnable pourrait être autour de 4 à 6, ce qui correspondrait à une charge moyenne de 1 à 1,5 par cœur
Vous pouvez tester des valeurs entre 4 et 6 par exemple. Ici j’ai mis 5.
Sauvegardez avec CTRL X et Y ou O pour enregistrer.
Activer le chien de garde
Activez et démarrez le service watchdog :
sudo systemctl enable watchdog
sudo systemctl start watchdog
Il ne reste plus qu’à tester comme ci-dessus en devenant root puis en lançant
echo c > /proc/sysrq-trigger
Au bout de quelques secondes le Raspberry Pi redémarre.
Les autres paramètres
watchdog.conf permet de régler d’autres paramètres. Je ne les ai pas testés, je vous laisse RTFM lire la documentation et jouer avec ces paramètres.. Voici les principaux paramètres qui peuvent vous intéresser.
interval
– Définissez l’intervalle de vérification du watchdog. Une valeur courante est de 10 secondes :
interval = 10
realtime et priority
– Si vous avez des processus critiques en temps réel, vous pouvez définir ces paramètres pour donner la priorité au watchdog :
realtime = yes
priority = 1
ping
– Pour surveiller la connectivité réseau, vous pouvez ajouter des adresses IP à pinger et dans les paramètres suivants le nombre de pings et l’interface… :
ping = 8.8.8.8
ping = 8.8.4.4
Vous pouvez aussi lancer vos propres tests
repair-binary et test-binary
– Si vous avez des scripts de réparation ou de test, vous pouvez les définir ici :
repair-binary = /usr/sbin/repair_script
test-binary = /usr/sbin/test_script
N’hésitez pas à explorer le fichier de conf qui comporte énormément de possibilités (surveiller la température, la mémoire disponible…). Après avoir ajusté ces paramètres, n’oubliez pas de redémarrer le service watchdog pour appliquer les modifications :
sudo systemctl restart watchdog
Ces ajustements devraient vous aider à optimiser le fonctionnement du watchdog sur votre Raspberry Pi sous Bookworm.
Conclusion
Le watchdog peut être un dispositif physique, on a connu des timers (avec un 555 !) qui étaient réarmés par une sortie (GPIO) d’un système informatique. En cas de défaillance ou de plantage du système informatique, le timer n’était plus réarmé et un relais ou un transistor effectuaient un reset du système.
Dans le Raspberry Pi (et les systèmes récents), le watchdog a été intégré au CPU et une configuration suffit à le mettre en route et à le paramétrer.
J’espère que cet article vous permettra de découvrir et de mettre en œuvre le watchdog. Je pense à ceux qui gèrent des Raspberry Pi « isolés » comme les relais radioamateurs sur un point haut, difficilement accessibles (surtout en hiver) ou aux Raspberry Pi WebSDR situés en haut d’un pylône. Vous me direz dans ce cas il suffit de couper le courant, mais c’est mieux si le système s’autosurveille et redémarre tout seul en cas de problème… On pourrait ajouter la domotique, les dashboards d’entreprise, les stations météo, les systèmes de surveillance avec caméra etc…
Si vous trouvez une application à cet article, n’hésitez pas à mettre un commentaire ci-dessous !
Sources
https://pimylifeup.com/raspberry-pi-watchdog/
How to Set Up a Watchdog Timer on Raspberry Pi (fleetstack.io)
https://manpages.debian.org/testing/watchdog/watchdog.conf.5.en.html
https://www.cyberciti.biz/faq/understanding-bash-fork-bomb/
https://raspberrypi.stackexchange.com/questions/137527/how-to-configure-the-watchdog
Ping : Utiliser le Watchdog (chien de garde) du Raspberry Pi
Super François…..Merci
Merci Christian !
Vraiment intéressant pour de l’embarqué !!!
Merci !
Très intéressant.
Et très facile à utiliser.
Petite question : quelle serait la « mécanique » du watchdog embarqué sur le Pi ? Un petit bout de processeur qui monitore ce dernier ? Un circuit séparé ?
Je vais aller voir la doc 🙂
Bonjour
C est integre dans le CPU