openwrt系统初始化分析

本文详细介绍了OpenWRT固件启动后从uboot加载内核,到init进程、procd进程、ubusd进程的启动过程。重点分析了preinit脚本的执行,包括初始化脚本的分类及执行顺序。在理解OpenWRT系统初始化的过程中,提到了使用busybox的init命令以及rcS脚本的作用。同时,提到了通过跟踪和调试shell脚本来理解复杂脚本的执行逻辑。
摘要由CSDN通过智能技术生成

openwrt固件启动后,进入uboot,加载内核,启动init进程,而init进程包含在procd进程中,启动代码如下:


int
main(int argc, char **argv)
{
    pid_t pid;

    sigaction(SIGTERM, &sa_shutdown, NULL);
    sigaction(SIGUSR1, &sa_shutdown, NULL);
    sigaction(SIGUSR2, &sa_shutdown, NULL);

    early();//初始化根文件系统中的需要的文件和设置,early.c
    cmdline(); //从proc/cmdline获取命令行启动参数
    watchdog_init(1); //初始化watchdog, watchdog.c 

    pid = fork();
    if (!pid) {
        char *kmod[] = { "/sbin/kmodloader", "/etc/modules-boot.d/", NULL };

        if (debug < 3) {
            int fd = open("/dev/null", O_RDWR);

            if (fd > -1) {
                dup2(fd, STDIN_FILENO);
                dup2(fd, STDOUT_FILENO);
                dup2(fd, STDERR_FILENO);
                if (fd > STDERR_FILENO)
                    close(fd);
            }
        }
        execvp(kmod[0], kmod);
        ERROR("Failed to start kmodloader\n");
        exit(-1);
    }
    if (pid <= 0)
        ERROR("Failed to start kmodloader instance\n");
    else
        waitpid(pid, NULL, 0);
    uloop_init();
    preinit(); //执行初始脚本
    uloop_run();

    return 0;
}

preinit()函数中启动了/etc/preinit启动脚本:

void
preinit(void)
{
    char *init[] = { "/bin/sh", "/etc/preinit", NULL };
    char *plug[] 
Openwrt文件系统初始化时采用了mini_fo文件系统类型。在启动过程中,Linux内核加载只读的squash文件系统。然后,在/etc/preinit/脚本中,通过一行代码重新挂载整个文件系统为mini_fo文件系统类型,完成文件系统初始化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Openwrt 文件系统](https://blog.csdn.net/weixin_31175771/article/details/116715731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [龙芯1b的openwrt](https://download.csdn.net/download/qq_21850249/86731509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [openwrt系统初始化分析](https://blog.csdn.net/viewsky11/article/details/73201162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值