• OpenWrt config_generate分析


    openwrt /etc/config/下的一些默认的配置是由config_generate脚本生成,例如网络配置文件/etc/config/network。具体的涉及的脚本和调用过程大致如下:

    /etc/rc.d/S10boot ----->	
    					/bin/config_generate ----->
    											/bin/board_detect
    

    首先分析/etc/rc.d/S10boot,它里面主要包含2个函数bootuci_apply_defaults,其中uci_apply_defaults会被boot调用。

    uci_apply_defaults() {
            . /lib/functions/system.sh
    
            cd /etc/uci-defaults || return 0
            files="$(ls)"
            [ -z "$files" ] && return 0
            mkdir -p /tmp/.uci
            for file in $files; do
                    ( . "./$(basename $file)" ) && rm -f "$file"
            done
            uci commit
    }
    

    它主要是执行位于/etc/uci-defaults下的一次性脚本,生成一些默认的uci配置,然后就把这些个shelll脚本删除了。例如我们在写luci-app的时候,通常会用它来生成一些配置,如/etc/config/ucitrack下的设置。

    boot函数里面主要做一些挂载,创建目录,加载内核模块,调用uci_apply_defaults config_generate

    [ -f /proc/mounts ] || /sbin/mount_root
    ...
    ...
    mkdir -p xxx
    ...
    ...
    /sbin/kmodloader
    ...
    /bin/config_generate
    uci_apply_defaults
    /sbin/reload_config
    

    config_generate脚本里面主要做的事就是,根据配置的板子型号( 使用/etc/board.d/xxx下的一些脚本探测),生成网络、系统相关的配置文件。

    网络配置又分为:bridge配置,switch配置,静态网络配置,动态网络配置。

    系统配置又分为:固定的系统配置,led配置,gpioswitch不懂,rssimon好像是wifi信号值监控之类的东西。

    脚本最开始处:

    CFG=/etc/board.json
    
    . /usr/share/libubox/jshn.sh
    
    [ -s $CFG ] || /bin/board_detect || exit 1
    [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
    

    /etc/board.json是一个描述板子型号的文件,它由/bin/board_detect生成,如果已存在且不为空,则不再使用/bin/board_detect重新生成。/etc/config/network/etc/config/system这两个文件就是由config_generate生成,同样,如果已存在且不为空就不在重新生成。

    /bin/board_detect

    #!/bin/sh
    
    CFG=$1
    
    [ -n "$CFG" ] || CFG=/etc/board.json
    
    [ -d "/etc/board.d/" -a ! -s "$CFG" ] && {
            for a in $(ls /etc/board.d/*); do
                    [ -x $a ] || continue;
                    $(. $a)
            done
    }
    
    [ -s "$CFG" ] || return 1
    

    这里有个需要注意的地方,执行探测前它会判断脚本是否具备可执行权限,不具备就不会执行,我在这里吃了亏。一模一样的脚本,2个文件系统跑起来结果不一样,最后排查才发现,/etc/board.d/下面我自己加的脚本没有执行权限。

  • 相关阅读:
    C语言和python分别计算文件的md5值
    C语言计算文件大小
    Linux内核源码下载
    Linux系统编程20_VFS虚拟文件系统
    Linux系统编程19_标准I/O
    C语言Review5_函数指针和数组指针
    C语言Review4_头文件引用符号的区别
    PDO之MySql持久化自动重连导致内存溢出
    小程序之app.json not found
    phpstorm之"Can not run PHP Code Sniffer"
  • 原文地址:https://www.cnblogs.com/thammer/p/14121478.html
Copyright © 2020-2023  润新知