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