我们知道,其实OpenWrt是由很多开源项目组成的操作系统。而这些开源项目所使用的配置文件语法又各不相同,例如samba、dhcp,dnsmasq,等等等等。而为了方便管理,OpenWrt创造了UCI,全称是Unified Configuration Interface,统一配置接口。它通过init脚步、uci配置文件将这些不同的语法统一成uci语法。首先要注意到三个目录:
- /etc/config/:存放uci配置文件,每个文件对应系统一个部分,当我们通过luci修改系统设置时,其实修改的就是这些文件;
- /etc/init.d/:存放init脚步,有一个非常重要的任务是读取上面的uci配置文件,生成对应daemon进程的配置文件,启动daemon进程;
- /etc/rc.d/:存放符号链接,链向被使能(enable)的init脚步,这些符号链接的命名是S+2位数字+init脚步名。记得我们在分析开机流程 的时候看到的,S开头表示在开机时运行,2位数字表示运行顺序
我们先来讲uci配置文件好了。
UCI配置文件语法
如上所述,UCI配置文件放在/etc/config目录下。每一个文件都是一个config,这个是uci里的术语。
以/etc/config/system为例:
config system
option hostname 'OpenWrt'
option timezone 'UTC'
config timeserver 'ntp'
list server '0.openwrt.pool.ntp.org'
list server '1.openwrt.pool.ntp.org'
list server '2.openwrt.pool.ntp.org'
list server '3.openwrt.pool.ntp.org'
option enabled '1'
option enable_server '0'
config led 'led_power'
option name 'power'
option sysfs 'xiaomi:red:status'
option default '1'
config文件里面是一个个的section,分别以config关键字开头。例如上面的system就分成了3个section。
每个section都由config关键字开头,后跟两个参数,对应section有两个属性,一个是type,一个是name。type的必须设置的,name可以省略。例如“config timeserver 'ntp'”表示type为timeserver,name为ntp。而“config system”则只设置了type为system,省略了name。
section由option或者list组成。首先要注意到,uci并没有数据类型之说,数字、字符串、布尔值都是用字符串来表示,由uci上层自行分析。option 关键字后跟名字跟值(value)。list也一样,多个list可能享有同一个名字,表示大家都是list的element之一。如果值(value)中含有空格,则需要用双引号("")或者单引号('')括起来。
命令行工具uci
UCI提供了多种语言的api,包括lua,c语言,还提供了一个名为uci的命令行工具。
注意,使用uci修改配置之后,需要用uci commit + 配置名将修改实际写到 flash中。
使用uci工具时,指定section有两种方式,一是指定section的名字,也就是confg关键字的第二个 参数。另一个是指定 type,type的写法比较麻烦,是@Type[index],因为一个type可能有多个section,所以要用下标来指定。例如查询system配置中的ntp:
uci show system.ntp #query by name
uci show system.@timeserver[0] #query by type
参考资料: