一、UCI系统介绍
UCI是统一接口配置(Unified Configuration Interface )的简称,它被应用于OpenWrt系统上面。
UCI是简单、实用的,是OpenWrt上面主要配置用户的接口,用来作为主要的系统设置,这些设置通常对设备是至关重要的,例如网络接口、无线设置、远程登陆权限设置等都是通过UCI来实现配置的。由此可见,UCI是构建一整套系统的必须部分。
此外,大部分第三方软件也被集成到UCI中,因此,在OpenWrt中,这些第三方软件通过UCI简单方便地进行配置。许多程序有它们自己的配置文件,像/etc/network/interfaces、/etc/exports、/etc/dnsmasq.conf 、/etc/samba/smb.conf,并且它们拥有自己的语法,OpenWrt不需要改变它们,只需要通过修改UCI配置文件即可以完成软件配置。这些软件配置主要应用于系统初始化脚本,他们在/etc/ini.d下面,启动被UCI系统集成的进程就会调用UCI配置文件。例如运行/etc/init.d/samba start就会调用/etc/config/samba配置文件。
尽管OpenWrt开发者已经对许多软件做了UCI集成,但因为他们的精力也是有限的,因此并不是所有软件都集成到UCI中。
二、UCI系统规则
在OpenWrt系统中,UCI配置文件位于/etc/config目录下,该目录下每一个配置文件对应系统中一种配置。你可以通过文本编辑器修改配置文件,或者使用uci命令修改。除了上面两种修改方式之外,还可以通过调用API接口进行修改(例如shell、lua等)或者web接口(例如luci、webif等)进行修改。
值得注意的是,当配置文件被修改之后,必须重启程序才能生效。
下面举一个通过文本编辑器修改ip地址的例子,如果你想把默认的IP地址192.168.1.1修改为192.168.2.1,其操作步骤如下所述:
1、使用vi编辑配置文件;
2、在/etc/config/network中找到option ipaddr 192.168.1.1,并将这里修改为option ipaddr 192.168.2.1;
3、执行/etc/init.d/network restart命令重启网络;
4、通过ifconfig命令查看IP地址,此时你会发现系统的IP地址已经变为192.168.2.1。
三、UCI配置文件语法
UCI配置文件通常由一个或者更多的config语句组成,一个config语句中包括一个或者更多的option语句来表示配置内容。
下面以一个UCI配置文件对UCI配置文件的语法进行说明:
package 'example'
config 'example' 'test'
option 'string' 'some value'
option 'boolean' '1'
list 'collection' 'first item'
list 'collection' 'second item'
config 'example' 'test'这条语句是一个config语句的开始,表示类型是example,test代表名字,其中类型是必不可少的,而且不同的config语句不能有相同的类型,这对启动脚本有非常重要的意义,但是名字并不是必须的,可以没有,也可以有。
option 'string' 'some value' 和 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字段)。在配置文件中需要赋值时通过option或list字段表示。
另外,字段值通常不需要用引号括起来,只有在字段值中含有空格或者TAB建的时候才需要用引号。而且值得注意的是,单引号和双引号要一一对应,合法的语言如下所示:
option example value
option 'example' value
option example "value"
option "example" 'value'
option 'example' "value"
四、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:
-c set the search path for config files (default: /etc/config)
-d set the delimiter for list values in UCI show
-f useas input instead of stdin
-a apply new configuration after commit
-L do not load any plugins
-m when importing, merge data into an existing package
-n name unnamed sections on export (default)
-N don't name unnamed sections
-p add a search path for config change files
-P add a search path for config change files and use as default
-q quiet mode (don't print error messages)
-s force strict mode (stop on parser errors, default)
-S disable strict mode
-X do not use extended syntax on 'show'
如表1所示,详细介绍各命令的主要使用方法:
表1 UCI命令
名字 |
Config字段 |
描述 |
commit |
[] |
把所改变的UCI配置写入文件系统中,包括所有的"UCI set","UCI add", "UCI rename" 和 "UCI delete"都是通过UCI commit写入flash中。 |
batch |
- |
执行UCI脚本 |
export |
[] |
导出一个配置,供使用人员阅读。 |
import |
[] |
输入一个UCI语句。 |
changes |
[] |
显示在没有运行UCI commit之前所有配置文件的改变记录。 |
add |
|
增加一个config |
get |
.[.] |
得到option字段值 |
set |
.[.]= |
设置option字段值 |
delete |
[. |
删除一个option或者list字段 |
add_list |
..= |
增加一个存在的list字段链表。 |
rename |
.[.]= |
给option字段重命名。 |
下面举例说明常用的UCI命令:
u 获取一个值:例如获取lan口的IP地址
root@OpenWrt:/# UCI get network.lan.ipaddr
192.168.1.1
u 设置一个值:例如设置lan口的IP地址为192.168.2.1
root@OpenWrt:/# UCI set network.lan.ipaddr=192.168.2.1
root@OpenWrt:/# UCI commit
root@OpenWrt:/# /etc/config/network restart
注:运行UCI commit使其生效;运行/etc/config/network restart重启network
u 运行ifconfig命令,查看IP地址修改结果:
root@OpenWrt:/# ifconfig
br-lan Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fd18:75c3:2be6::1/60 Scope:Global
inet6 addr: fe80::211:22ff:fe33:4455/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4904 (4.7 KiB) TX bytes:976 (976.0 B)
通过ifconfig命令可以看到IP地址已经修改为192.168.2.1。
OpenWrt界面采用luci,它很好的应用了UCI系统。因此,学好UCI系统对学习luci有很好的帮助,所以大家需要好好学习这个章节。