Erstellen und Steuern von Startskripten in BusyBox

11

Ich habe einen benutzerdefinierten Linux-Kernel in BusyBox kompiliert. BusyBox initunterstützt keine Runlevel. Wenn der Kernel in BusyBox hochfährt, wird er zuerst ausgeführt, initwobei nach dem angegebenen Runlevel gesucht wird /etc/inittab. BusyBox initfunktioniert gut ohne /etc/inittab. Wenn no inittabgefunden wird, hat es das folgende Verhalten:

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

Dieser Teil ist mir sehr klar, aber ich möchte wissen, wie Dämonen verwaltet werden, die das Netzwerk starten, serielle Schnittstellen erstellen oder javaProzesse starten . Ich habe in den Skripten nachgesehen, /etc/init.d/aber ich verstehe nicht, wie ich sie verwalten soll. Ich suche nach einem guten Tutorial oder einer Lösung, um diese Dienste selbst zu steuern, ohne ein automatisiertes Tool wie buildroot. Ich möchte verstehen, wie diese Skripte funktionieren und wie Geräte erstellt werden /dev/(im Moment habe ich nur consoleund ttyAM0).

Shantanu Banerjee
quelle

Antworten:

9

Für Buildroot müssen alle Ihre Skripte $path_to_buildroot/output/target/etc/init.dvor dem Build-Image abgelegt werden . In meinem Fall enthält dieses Verzeichnis rcSeinige Skripte mit dem Namen S [0-99] script_name. So können Sie Ihr eigenes Start / Stopp-Skript erstellen.

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

und zum Beispiel 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
quelle
S[0-99]script_nameDie Dateinamensyntax wird S10*vorher ausgeführt S2*und bricht das Skript.
Tim
@ Tim nicht unbedingt "das Skript brechen", nur Null-Pad. Sicher S20*läuft nach S10*, wenn Sie etwas kommen , bevor S10Sie es nennen müssen S01*, S02*usw. am nächsten Arbeitstag.
thom_nic
5

Es ist eine schlechte Idee, Ihre fs im "Ziel" -Ordner zu ändern. Dies liegt daran, dass Änderungen in output/target/den make cleanBefehl nicht überleben .

Im Buildroot-Handbuch wurde beschrieben, wie es richtig gemacht wird

Sie sollten irgendwo ein Verzeichnis erstellen, das das Dateisystem teilweise überlagert. Beispielsweise können Sie das Verzeichnis "your-overlay" im Buildroot-Verzeichnis erstellen, in dem Sie diese Struktur erstellen

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

Dann sollten Sie in defconfig den Pfad zu diesem Overlay festlegen

System configuration > Root filesystem overlay directories

(oder finden Sie BR2_ROOTFS_OVERLAY)

Der empfohlene Pfad für diese Überlagerung lautet außerdem board/<company>/<boardname>/rootfs-overlay

Kenjy Minamori
quelle
Beispiel-Setup bei Verwendung von Buildroot als Submodul: github.com/cirosantilli/linux-kernel-module-cheat/blob/…
Ciro Santilli 事件 改造 中心 法轮功 六四 事件
1
OP verwendet nur BusyBox und gibt an, dass er sein Ziel ohne Buildroot erreichen möchte. Ich sehe diese Antwort nicht relevant für die Frage. Es ist eher ein Kommentar zur akzeptierten Antwort.
Tim