Gal Shahar
Gal Shahar

Reputation: 2815

How and when OpenWrt's procd runs init scripts in etc/init.d?

I'm looking at a static OpenWrt firmware. On OpenWrt initialization, procd is supposed to run all the S prefixed scripts in /etc/rc.d which are links to the actual scripts in /etc/init.d. I wonder who triggers those scripts...

I see that on /etc/inittab there's this line ::sysinit:/etc/init.d/rcS S boot but /etc/init.d/rcS file does not exist, so who actually runs the scripts on /etc/rc.d and when does it happen on init?

I tried searching all over their documentation but still could not figure this out... Any ideas?

Thanks.

Upvotes: 1

Views: 2789

Answers (2)

joez
joez

Reputation: 26

You can check details in procd init

procd actually ignores the process specification "/etc/init.d/rcS" (there is no such a script!) in "/etc/inittab".

The implementation is in rcS.c:

int rcS(char *pattern, char *param, void (*q_empty)(struct runqueue *))
{
    runqueue_init(&q);
    q.empty_cb = q_empty;
    q.max_running_tasks = 1;

    return _rc(&q, "/etc/rc.d", pattern, "*", param);
}

which is called by "runrc" function in inittab.c

static void runrc(struct init_action *a)
{
    if (!a->argv[1] || !a->argv[2]) {
        ERROR("valid format is rcS <S|K> <param>\n");
        return;
    }

    /* proceed even if no init or shutdown scripts run */
    if (rcS(a->argv[1], a->argv[2], rcdone))
        rcdone(NULL);
}

Upvotes: 1

jack ma
jack ma

Reputation: 61

Hi the openwrt using the program procd to run the /etc/init.d/* to init the all system. The boot sequence of openwrt is:

 /init - > /sbin/init -> /etc/preinit -> /sbin/procd -> /etc/rc.d/*

Actually openwrt always support the rcS, but openwrt didn't use this feature.

Upvotes: 1

Related Questions