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/下面我自己加的脚本没有执行权限。

原文地址:https://www.cnblogs.com/thammer/p/14121478.html