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ébugger ! 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. A 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 toute les sorties vers un fichier de log). Le symptôme est le suivant: parfois /usr//lib/apache2/mpm-prefork/apache2 échoue sans erreur. A ce stade, on ne 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 une relancement retardé de 15 secondes où les services sont tous lancés que d'avoir à me reconnecter à distance pour les réactiver manuellement.