Ralentir la séquence de boot d'un Sheevaplug pour plus de sérénité…🔗
Un Plugcomputer est décidément un matériel bien spécial… Depuis le début, j'ai toujours eu des problèmes de boot sur mon Sheevaplug. Concrètement cela se manifeste par le fait qu'après le reboot de la machine, un certain nombre de services ne sont pas lancés. Il faut se connecter sur la machine pour relancer manuellement les services. Cette relance manuelle ne pose aucun problème: tous les services se lancent correctement. Mais c'est assez pénible et on se met à craindre chaque reboot de la machine qui, chez moi, indique une panne de courant.
De plus, ce problème est très variable: parfois, deux services sont non lancés, parfois, c'est juste un seul… Pas facile à débuguer ! J'ai essayé de jouer sur les priorités de lancement mais sans succès (du moins, avec un succès restreint).
Dernièrement, je me suis battu avec Apache. À chaque reboot, le service n'était pas lancé. Rien dans les logs… la relance manuelle via SSH ne posait jamais de problème. J'ai essayé d'y voir un peu plus clair en trickant le fichier d'init (cette machine ne bénéficie pas de systemd) mais tout ce que je pouvais constater, c'est que le service ne se lance pas et ce, sans aucun message d'erreur (même en balançant toutes les sorties vers un fichier de log). Le symptôme est le suivant: parfois /usr/lib/apache2/mpm-prefork/apache2
échoue sans erreur. À ce stade, on ne peut pas faire grand-chose: impossible d'avoir des informations sur ce qui plante.
Ce symptôme qui est un vrai problème est, à mon avis, dû au fait qu'une machine basée sur un SOC et qui utilise un périphérique de masse lent comme une carte SD est assez mal ordonnancée. Je suppose que certains systèmes indispensables à Apache ne sont pas correctement initialisés au moment du boot. Comme il m'est impossible de diagnostiquer plus avant, j'ai imaginé une solution de contournement à peu de frais…
Pourquoi pas retarder le lancement des services utilisateurs avec une simple commande sleep ? J'ai donc conçu un script sysv qui fait tout simplement ça. En voici le contenu (je l'ai mis dans /etc/init.d/slowboot
):
#!/bin/sh ### BEGIN INIT INFO # Provides: slowboot # Required-Start: $network # Required-Stop: $network # Default-Start: S # Default-Stop: 0 6 ### END INIT INFO PATH=/sbin:/bin:/usr/sbin:/usr/bin . /lib/lsb/init-functions # Sheevaplug boots too fast for himself. # Some services cannot be launched correctly if you don't # make a pause to the booting process. # This scripts just wait 15 seconds ! NAME=slowboot case $1 in start|force-reload|restart) log_action_begin_msg "Slowing done boot !" sleep 15 log_action_end_msg 0 ;; stop) exit 0 ;; status) exit 0 ;; *) echo "Usage: $0 {start|stop|restart}" exit 2 ;; esac
Pour l'activer, lancer la commande suivante:
# update-rc.d slowboot start 14 S
Cela permet de l'activer au moment du lancement des scripts /etc/rcS.d (les scripts systèmes lancés avant le niveau précisé par inittab) à la position 14 (chez moi, ça correspond à peu près après le lancement du réseau).
Une fois activé, mes problèmes ont disparu. 15 secondes sur une séquence de boot d'environ 2 minutes, ce n'est franchement pas la mer à boire. En tout cas, je préfère un lancement retardé de 15 secondes où les services sont tous lancés que d'avoir à me reconnecter à distance pour les réactiver manuellement.