สร้างและควบคุมสคริปต์เริ่มต้นใน BusyBox


11

ฉันได้รวบรวมเคอร์เนลลินุกซ์ที่กำหนดเองใน BusyBox BusyBox initไม่รองรับ runlevels เมื่อบูทเคอร์เนลใน BusyBox จะรันครั้งแรกinitซึ่งมีลักษณะสำหรับ runlevel /etc/inittabระบุใน BusyBox ทำงานได้ดีโดยไม่ต้องinit /etc/inittabเมื่อไม่inittabพบจะมีลักษณะการทำงานต่อไปนี้:

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

ส่วนนี้ชัดเจนสำหรับฉัน แต่ฉันต้องการทราบวิธีจัดการ daemons ที่เริ่มระบบเครือข่ายสร้างพอร์ตอนุกรมหรือเริ่มjavaกระบวนการ ฉันได้ดูสคริปต์ที่มีอยู่/etc/init.d/แต่ฉันไม่เข้าใจวิธีจัดการกับสคริปต์เหล่านั้น buildrootฉันกำลังมองหาการกวดวิชาที่ดีหรือการแก้ปัญหาในการควบคุมการบริการเหล่านี้ด้วยตัวเองโดยไม่ต้องมีเครื่องมืออัตโนมัติเช่น ฉันต้องการเข้าใจวิธีการทำงานของสคริปต์เหล่านี้และวิธีการสร้างอุปกรณ์ใน/dev/(ตอนนี้ฉันมีconsoleและttyAM0)

คำตอบ:


9

สำหรับ buildroot สคริปต์ทั้งหมดของคุณจะต้องวางไว้$path_to_buildroot/output/target/etc/init.dก่อนสร้างภาพ ในกรณีของฉันไดเร็กทอรีนี้มีrcSสคริปต์จำนวนน้อยที่ชื่อ S [0-99] script_name ดังนั้นคุณสามารถสร้างสคริปต์เริ่มต้น \ 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

และตัวอย่างเช่น 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 $?

S[0-99]script_nameไวยากรณ์ชื่อไฟล์จะทำงานS10*ก่อนS2*และทำลายสคริปต์
ทิม

@Tim ไม่จำเป็นต้อง "ทำลายสคริปต์" เพียงแค่เป็นศูนย์ แน่นอนว่าS20*การทำงานหลังจากที่S10*ถ้าคุณต้องการบางสิ่งบางอย่างที่จะมาก่อนที่S10คุณจะต้องเรียกมันS01*, S02*ฯลฯ NBD
thom_nic

5

เป็นความคิดที่ดีที่จะเปลี่ยน fs ของคุณในโฟลเดอร์ "target" นี่เป็นเพราะการเปลี่ยนแปลงในoutput/target/ไม่รอดmake cleanคำสั่ง

ใน buildroot คู่มือ decribed วิธีการ ทำอย่างถูกต้อง

คุณควรสร้าง dir ที่ไหนสักแห่งที่ระบบไฟล์ซ้อนทับบางส่วน ตัวอย่างเช่นคุณสามารถสร้าง dir "your-overlay" ใน buildroot dir ที่คุณสร้าง struct นี้

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

จากนั้นคุณควรตั้งค่าพา ธ ไปที่โอเวอร์เลย์นี้ใน defconfig

System configuration > Root filesystem overlay directories

(หรือค้นหา BR2_ROOTFS_OVERLAY)

นอกจากนี้เส้นทางที่แนะนำสำหรับการวางซ้อนนี้คือ board/<company>/<boardname>/rootfs-overlay


ตัวอย่างการตั้งค่าเมื่อใช้ Buildroot เป็น submodule: github.com/cirosantilli/linux-kernel-module-cheat/blob/
......

1
OP ใช้ BusyBox เท่านั้นและระบุว่าเขาต้องการบรรลุเป้าหมายโดยไม่ต้อง buildroot ฉันไม่เห็นคำตอบนี้เกี่ยวข้องกับคำถาม มันเป็นความคิดเห็นเพิ่มเติมเกี่ยวกับคำตอบที่ได้รับการยอมรับ
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.