Openwrt开发指南 第14章 统一接口配置UCI-环球热议
UCI即统一接口配置(UnifiedConfigurationInterface)的简称,它被应用于OpenWrt系统上面。
UCI是简单、实用、直接了当的。UCI是OpenWrt上面主要的配置用户接口,用来作为主要的系统设置,这些设置通常对设备是至关重要的,例如网络接口、无线设置、远程登陆权限设置等都是通过UCI来实现配置的。他是构建一整套系统的必须部分。
【资料图】
此外,大部分第三方软件也被集成到UCI中,因此他们在openwrt中也能很简单的配置。许多程序有他们自己的配置文件,像/etc/network/interfaces、/etc/exports、/etc/dnsmasq.conf、/etc/samba/smb.conf,并且他们有他们自己的语法,opewnrt不需要改变他们,只需要改UCI设置就行,opewnrt开发者已经对许多软件做了UCI集成,当然openwrt开发者不可能把所有软件都集成进来。因为他们的精力也是有限的。
大部分被集成到UCI系统中的软件通过修改UCI配置文件,都能很简单的被配置,这些配置主要应用于系统初始化脚本,他们在/etc/ini.d下面,开启被UCI系统集成的进程就需要用UCI配置文件。比如运行/etc/init.d/sambastart就会用到/etc/config/samba配置文件。
2 UCI系统规则Openwrt中UCI配置文件被放在/etc/config目录下面,每一个配置文件设计到系统的一种配置。你可以用文本编辑器修改这个配置文件,或者用uci命令修改。当然它也可以用其他API接口来修改,比如shell、lua等,而且web接口像luci、webif也可以改变它。当配置文件被改变后,必须重启程序才能生效。
下面举一个修改ip地址的例子,如果你想把默认的ip:192.168.1.1改为192.168.2.1,可以通过vi来编辑配置文件。
$vi /etc/config/network
在/etc/config/network中找到:
option ipaddr192.168.1.1
把他改变为
option ipaddr192.168.2.1
然后重启网络/etc/init.d/networkrestart就会发现系统的ip已经变为新ip地址了。
3 UCI文件语法UCI配置文件通常一个或者更多的config语句,一个config语句中包括一个或者更多的option语句来表示配置内容。下面一个UCI配置文件的内容:
package"example"
config"example""test"
option"string""somevalue"
option"boolean""1"
list"collection""firstitem"
list"collection""seconditem"
config"example""test"这条语句是一个config语句的开始,表示类型是example,test代表名字,其中类型是必不可少的,而且不同的config语句不能有相同的类型,它对启动脚本有非常重要的意义,但是名字不是必不可少的,可以没有,也可以有。
option"string""somevalue"和option"boolean""1"定义了值的内容,这里string和boolean在语法上面没有差异。在boolean中‘0’,‘no’,‘off’,‘disable’,‘false’都代表0,而‘1’,‘yes’、‘on’、‘true’,‘enable’都代表1。
用list语句可以定义多个值,他们都有相同的名字,在这里为collection。
其中option和list对配置文件是非常重要的,每个字段都是用option或者list来表示,option代表字段值唯一(后面叫option字段),list代表字段有多个值(后面叫list字段),他们是配置文件赋值的重要表示。但是在一个配置文件中,它们不是必须的语法。通常值不需要用引号括起来,只有有空格或者TAB建的时候才需要用引号。而且单引号和双引号要一一对应,下面表示合法的语言:
optionexamplevalue
option"example"value
optionexample"value"
option"example""value"
option"example""value"
4 UCI命令用vi、脚本、lua等工具修改uci配置文件比较麻烦还容易出错,openwrt提供了uci命令工具来操作uci配置文件。uci工具可以获取一个值,设置一个值等功能。在终端下面运行uci命令可以查看他的帮助说明。
Usage :uci [] []
Commands:
batch
export[]
import[]
changes[]
commit[]
add
add_list.
.=
show[[.
[.]]]
get.
[.]
set.
[.]=
delete[.]]
rename.
[.]=
revert[.
[.]]
reorder.
=
Options:
-csetthesearchpathforconfigfiles(default:/etc/config)
-dsetthedelimiterforlistvaluesinucishow
-fuseasinputinsteadofstdin
-aapplynewconfigurationaftercommit
-Ldonotloadanyplugins
-mwhenimporting,mergedataintoanexistingpackage
-nnameunnamedsectionsonexport(default)
-Ndon"tnameunnamedsections
-paddasearchpathforconfigchangefiles
-Paddasearchpathforconfigchangefilesanduseasdefault
-qquietmode(don"tprinterrormessages)
-sforcestrictmode(stoponparsererrors,default)
-Sdisablestrictmode
-Xdonotuseextendedsyntaxon"show"
下面的表格详细的介绍了他们的主要用法:
名字 | Config****字段 | 描述 |
---|---|---|
commit | [] | 把改变的uci配置的改变写入文件系统中,所有的"uciset","uciadd","ucirename"和"ucidelete"都是通过ucicommit写入flash中。 |
batch | - | 执行uci脚本 |
export | [] | 导出一个配置,供使用人员阅读 |
import | [] | 输入一个uci语句 |
changes | [] | 显示在没有运行ucicommit之前的所有配置文件改变记录 |
add | 增加一个config | |
get | .[.] | 得到option字段值 |
set | .[.]= | 设置option字段值 |
delete | [.]] | 删除一个option或者list字段 |
add | _list..= | 增加一个存在的list字段链表 |
rename | .[.]= | 给option字段重命名 |
show | [[.[.]]] | 展示一个配置的具体内容 |
下面我们举例说明常用的一些用法。
获取一个值:
获取lan口的ip地址:ucigetnetwork.lan.ipaddr
#ucigetnetwork.lan.ipaddr192.168.1.1
设置一个值:
设置lan口的ip地址为192.168.2.1
#ucisetnetwork.lan.ipaddr=192.168.2.1
完成之后需要要使其生效,运行ucicommit
#ucisetnetwork.lan.ipaddr=192.168.2.1
#ucicommit
设置好之后重启network,/etc/config/networkrestart,我们发现网口ip已经被改变了。
运行ifconfig。
#ifconfig
br-lanLinkencap:EthernetHWaddr00:11:22:33:44:55
inetaddr:192.168.2.1Bcast:192.168.2.255
Mask:255.255.255.0
inet6addr:fd18:75c3:2be6::1/60Scope:Global
inet6addr:fe80::211:22ff:fe33:4455/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:16errors:0dropped:0overruns:0frame:0
TXpackets:8errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:4904(4.7KiB)TXbytes:976(976.0B)
已经变为192.168.2.1了。
导出显示一个选项的配置,现在我们导出uhttp的配置,效果如下所示:
#uciexportuhttpd
packageuhttpd
configuhttpd"main"
listlisten_http"0.0.0.0:80"
listlisten_http"[::]:80"
listlisten_https"0.0.0.0:443"
listlisten_https"[::]:443"
optionhome"/www"
optionrfc1918_filter"1"
optionmax_requests"3"
optionmax_connections"100"
optioncert"/etc/uhttpd.crt"
optionkey"/etc/uhttpd.key"
optioncgi_prefix"/cgi-bin"
optionscript_timeout"60"
optionnetwork_timeout"30"
optionhttp_keepalive"20"
optiontcp_keepalive"1"
optionubus_prefix"/ubus"
configcert"px5g"
optiondays"730"
optionbits"1024"
optioncountry"DE"
optionstate"Berlin"
optionlocation"Berlin"
optioncommonname"OpenWrt"
用show可以展示uhttp的具体内容,和export不同的是,export时导出配置文件的内容,show时显示uhttp配置的值。效果如下:
#ucishowuhttpd
uhttpd.main=uhttpd
uhttpd.main.listen_http=0.0.0.0:80[::]:80
uhttpd.main.listen_https=0.0.0.0:443[::]:443
uhttpd.main.home=/www
uhttpd.main.rfc1918_filter=1
uhttpd.main.max_requests=3
uhttpd.main.max_connections=100
uhttpd.main.cert=/etc/uhttpd.crt
uhttpd.main.key=/etc/uhttpd.key
uhttpd.main.cgi_prefix=/cgi-bin
uhttpd.main.script_timeout=60
uhttpd.main.network_timeout=30
uhttpd.main.http_keepalive=20
uhttpd.main.tcp_keepalive=1
uhttpd.main.ubus_prefix=/ubus
uhttpd.px5g=cert
uhttpd.px5g.days=730
uhttpd.px5g.bits=1024
uhttpd.px5g.country=DE
uhttpd.px5g.state=Berlin
uhttpd.px5g.location=Berlin
uhttpd.px5g.commonname=OpenWrt
前面大部分是option字段的内容,现在说一下怎么增加list字段。首先看一下system的配置内容,他的ntp服务器就是list字段。用export我们先看一下:
#uciexportsystem
packagesystem
configsystem
optionhostname"OpenWrt"
optiontimezone"UTC"
configtimeserver"ntp"
listserver"0.openwrt.pool.ntp.org"
listserver"1.openwrt.pool.ntp.org"
listserver"2.openwrt.pool.ntp.org"
listserver"3.openwrt.pool.ntp.org"
optionenabled"1"
optionenable_server"0"
看到server就是list字段,从表格可以看到,add_list可以增加list字段。uciadd_listsystem.ntp.server="4.de.pool.ntp.org"这个命令可以增加4.de.pool.ntp.org进入list字段。增加完之后可以看一下,如下所示:
#uciexportsystem
packagesystem
configsystem
optionhostname"OpenWrt"
optiontimezone"UTC"
configtimeserver"ntp"
listserver"0.openwrt.pool.ntp.org"
listserver"1.openwrt.pool.ntp.org"
listserver"2.openwrt.pool.ntp.org"
listserver"3.openwrt.pool.ntp.org"
listserver"4.de.pool.ntp.org"
optionenabled"1"
optionenable_server"0"
如果增加一个新的配置,只需要按照UCI系统的语法,增加一个配置文件就可以,或者用uci add命令。下面列出用uci命令增加一个新配置的用法:
#touch/etc/config/playapp
新建一个配置文件
#ucishowplayapp
显示配置内容,可以看到无内容
#uciaddplayappblah
增加一个配置项
#ucishowplayapp
显示配置内容
playapp.@blah[0]=blah
root@OpenWrt:/#ucicommit&&cat/etc/config/playapp
configblah
显示文件内容,可以看到用uci命令设置进去了。其他的命令大家可以都自己试一试,这里就不一一列举了。Opewnrt界面采用luci,他很好的应用了uci系统,学好uci系统对学习luci有很好的帮助,所以大家需要好好学习这个章节。审核编辑:汤梓红
标签: