14

I have compiled a custom linux kernel in BusyBox. BusyBox init does not support runlevels. When the kernel boots up in BusyBox, it first executes init which looks for the specified runlevel in /etc/inittab. BusyBox init works just fine without /etc/inittab. When no inittab is found it has the following behavior:

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

This part is very clear to me, but I would like to know how to manage daemons that start up networking, create serial ports, or start java processes. I have looked in the scripts that reside in /etc/init.d/ but I don't understand how to manage them. I am looking for a good tutorial or solution to control these services myself without an automated tool like buildroot. I want to understand how these scripts work and how to create devices in /dev/ (right now I only have console and ttyAM0).

George M
  • 13,589
  • 4
  • 43
  • 53
Shantanu Banerjee
  • 449
  • 3
  • 6
  • 15

2 Answers2

13

For buildroot all your scripts must be placed in $path_to_buildroot/output/target/etc/init.d before build image. In my case this directory contains rcS and few scripts named S[0-99]script_name. So you can create your own start\stop script.

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

and for example 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 $?
Noam M
  • 441
  • 1
  • 7
  • 17
Renat Zaripov
  • 365
  • 3
  • 8
  • 1
    `S[0-99]script_name` filename syntax will run `S10*` before `S2*` and break the script. – Tim May 27 '18 at 09:01
  • 2
    @Tim not necessarily "break the script", just zero-pad. Sure `S20*` runs after `S10*`, if you want something to come before `S10` you need to call it `S01*`, `S02*`, etc. NBD. – thom_nic Jul 12 '18 at 15:35
8

It's bad idea to change your fs in "target" folder. This is because changes in output/target/ do not survive the make clean command.

In buildroot manual decribed how to do it correctly

You should create dir somewhere which partly overlay file system. For example you can create dir "your-overlay" in buildroot dir where you create this struct

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

Then you should set path to this overlay in defconfig

System configuration > Root filesystem overlay directories

(or, find BR2_ROOTFS_OVERLAY)

Also, the recommended path for this overlay is board/<company>/<boardname>/rootfs-overlay

Jaakko
  • 125
  • 7
  • Sample setup when using Buildroot as a submodule: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/4768027b9e73511043c1db8771ab773502c44c09/buildroot_config_fragment#L7 – Ciro Santilli OurBigBook.com Oct 07 '17 at 04:10
  • 2
    OP is using only BusyBox and indicates he wants to achieve his goal without buildroot. I don't see this answer relevant to the question. It's more a comment to the accepted answer. – Tim May 27 '18 at 08:55