Buat dan kontrol skrip start up di BusyBox

11

Saya telah menyusun kernel linux khusus di BusyBox. BusyBox inittidak mendukung runlevel. Ketika kernel melakukan booting di BusyBox, kernel tersebut pertama kali mengeksekusi inityang mencari runlevel yang ditentukan di /etc/inittab. BusyBox initberfungsi dengan baik tanpa /etc/inittab. Ketika tidak inittabditemukan, ia memiliki perilaku berikut:

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

Bagian ini sangat jelas bagi saya, tetapi saya ingin tahu bagaimana mengelola daemon yang memulai jaringan, membuat port serial, atau memulai javaproses. Saya telah melihat di skrip yang berada /etc/init.d/tetapi saya tidak mengerti bagaimana mengelolanya. Saya mencari tutorial atau solusi yang bagus untuk mengontrol layanan ini sendiri tanpa alat otomatis seperti buildroot. Saya ingin memahami cara kerja skrip ini dan cara membuat perangkat /dev/(saat ini saya hanya punya consoledan ttyAM0).

Shantanu Banerjee
sumber

Jawaban:

9

Untuk buildroot, semua skrip Anda harus ditempatkan $path_to_buildroot/output/target/etc/init.dsebelum membangun gambar. Dalam kasus saya direktori ini berisi rcSdan beberapa skrip bernama S [0-99] script_name. Jadi, Anda dapat membuat skrip start \ stop Anda sendiri.

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

dan misalnya 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
sumber
S[0-99]script_namesintaks nama file akan berjalan S10*sebelum S2*dan memecahkan skrip.
Tim
@Tim belum tentu "memecahkan skrip", hanya nol-pad. Tentu S20*berjalan setelah S10*, jika Anda ingin sesuatu yang datang sebelum S10Anda perlu menyebutnya S01*, S02*, dll NBD.
thom_nic
5

Itu ide buruk untuk mengubah fs Anda di folder "target". Ini karena perubahan output/target/tidak bertahan dari make cleanperintah.

Dalam manual buildroot dijelaskan cara melakukannya dengan benar

Anda harus membuat dir di suatu tempat yang sebagian overlay sistem file. Misalnya Anda dapat membuat dir "your-overlay" di dir buildroot tempat Anda membuat struct ini

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

Maka Anda harus menetapkan path ke overlay ini di defconfig

System configuration > Root filesystem overlay directories

(atau, cari BR2_ROOTFS_OVERLAY)

Selain itu, jalur yang disarankan untuk hamparan ini adalah board/<company>/<boardname>/rootfs-overlay

Kenjy Minamori
sumber
Contoh pengaturan saat menggunakan Buildroot sebagai submodule: github.com/cirosantilli/linux-kernel-module-cheat/blob/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1
OP hanya menggunakan BusyBox dan menunjukkan ia ingin mencapai tujuannya tanpa buildroot. Saya tidak melihat jawaban ini relevan dengan pertanyaan. Ini lebih merupakan komentar untuk jawaban yang diterima.
Tim