zoukankan      html  css  js  c++  java
  • 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/下面我自己加的脚本没有执行权限。

  • 相关阅读:
    Linux篇---ftp服务器的搭建
    【Spark篇】---SparkStreaming+Kafka的两种模式receiver模式和Direct模式
    【Spark篇】---Spark故障解决(troubleshooting)
    【Spark篇】---Spark解决数据倾斜问题
    【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优
    【Redis篇】Redis持久化方式AOF和RDB
    【Redis篇】Redis集群安装与初始
    【Redis篇】初始Redis与Redis安装
    Git提示“warning: LF will be replaced by CRLF”
    Git 忽略特殊文件
  • 原文地址:https://www.cnblogs.com/thammer/p/14121478.html
Copyright © 2011-2022 走看看