Créer et contrôler des scripts de démarrage dans BusyBox

11

J'ai compilé un noyau Linux personnalisé dans BusyBox. BusyBox initne prend pas en charge les niveaux d'exécution. Lorsque le noyau démarre dans BusyBox, il s'exécute d'abord initpour rechercher le niveau d'exécution spécifié dans /etc/inittab. BusyBox initfonctionne très bien sans /etc/inittab. Quand aucun inittabn'est trouvé, il a le comportement suivant:

::sysinit:/etc/init.d/rcS

Cette partie est très claire pour moi, mais j'aimerais savoir comment gérer les démons qui démarrent la mise en réseau, créent des ports série ou démarrent des javaprocessus. J'ai regardé dans les scripts qui résident /etc/init.d/mais je ne comprends pas comment les gérer. Je recherche un bon tutoriel ou une bonne solution pour contrôler ces services moi-même sans outil automatisé comme buildroot. Je veux comprendre comment ces scripts fonctionnent et comment créer des périphériques /dev/(pour l'instant je n'ai que consoleet ttyAM0).

Shantanu Banerjee
la source

Réponses:

9

Pour buildroot, tous vos scripts doivent être placés $path_to_buildroot/output/target/etc/init.davant de construire l'image. Dans mon cas, ce répertoire contient rcSet quelques scripts nommés S [0-99] script_name. Vous pouvez donc créer votre propre script start \ stop.

rcS:

#!/bin/sh

# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
    *.sh)
        # Source shell script for speed.
        (
        trap - INT QUIT TSTP
        set start
        . $i
        )
        ;;
    *)
        # No sh extension, so fork subprocess.
        $i start
        ;;
    esac
done

et par exemple S40network:

#!/bin/sh
#
# Start the network....
#

case "$1" in
  start)
    echo "Starting network..."
    /sbin/ifup -a
    ;;
  stop)
    echo -n "Stopping network..."
    /sbin/ifdown -a
    ;;
  restart|reload)
    "$0" stop
    "$0" start
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $?
Renat Zaripov
la source
S[0-99]script_namela syntaxe du nom de fichier s'exécutera S10*avant S2*et interrompra le script.
Tim
@Tim pas nécessairement "casser le script", juste un zéro-pad. Bien sûr S20*court après S10*, si vous voulez quelque chose à venir avant que S10vous devez l' appeler S01*, S02*etc. NBD.
thom_nic
5

C'est une mauvaise idée de changer votre fs dans le dossier "cible". En effet, les modifications apportées output/target/ne survivent pas à la make cleancommande.

Dans le manuel de buildroot décrit comment le faire correctement

Vous devez créer un répertoire quelque part qui superpose partiellement le système de fichiers. Par exemple, vous pouvez créer le répertoire "your-overlay" dans le répertoire buildroot où vous créez cette structure

your-overlay/etc/init.d/<any_file>

Ensuite, vous devez définir le chemin d'accès à cette superposition dans defconfig

System configuration > Root filesystem overlay directories

(ou trouvez BR2_ROOTFS_OVERLAY)

De plus, le chemin recommandé pour cette superposition est board/<company>/<boardname>/rootfs-overlay

Kenjy Minamori
la source
Exemple de configuration lors de l'utilisation de Buildroot comme sous-module: github.com/cirosantilli/linux-kernel-module-cheat/blob/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1
OP n'utilise que BusyBox et indique qu'il veut atteindre son objectif sans buildroot. Je ne vois pas cette réponse pertinente à la question. Il s'agit plus d'un commentaire de la réponse acceptée.
Tim