1.UCI命令
一个众所周知的原因,在Linux下各种软件包有各种不同的配置脚本,每个配置脚本的语法格式和操作方式不同,
这样的设计虽然可以体现出各软件包自身的优势,同时也增加了学习曲线。在这一点上OpenWrt的UCI无疑处理的更
胜一筹。UCI是集中式配置信息管理接口(Unified Configuration Interface)的缩写,他是OpenWrt引进的一套配置
参数管理系统。UCI管理了OpenWrt下最主要的系统配置参数并且提供了简单、容易、标准化的人机交互接口。UCI中
已经包含了网络配置、无线配置、系统信息配置等作为基本路由器所需的主要配置参数。同时UCI也可以帮助开发人
员快速的建立一套基于OpenWrt的智能路由产品控制界面。
2.UCI的文件和流程
UCI的配置文件全部存储在/etc/config目录下。
-
root@OpenWrt:/# ls /etc/config/
-
dhcp dropbear firewall network system wireless
复制代码
日前已有大量软件包支持UCI模式管理,但不是所有的软件包,支持的软件包是这样来完成
启动的(以samba举例):
1.启动脚本/etc/init.d/samba
2.启动脚本通过UCI分析库从/etc/config/samba获得启动参数
3.启动脚本完成正常启动
由于UCI的数据文件较为简单,并且具备了很nice的直接观感,所以配置文件既可以使用UCI
命令进行修改,也可以使用VI编辑器直接修改文件。但如果两种方式都是用时需要注意UCI命
令修改会产生缓存,每次修改好要尽快确认保存避免出现冲突。
最常见的几个UCI配置作用说明
文件
|
作用
|
/etc/config/dhcp
|
面向LAN口提供的IP地址分配服务配置
|
/etc/config/dropbear
|
SSH服务配置
|
/etc/config/firewall
|
路由转发,端口转发,防火墙规则
|
/etc/config/network
|
自身网络接口配置
|
/etc/config/system
|
时间服务器时区配置
|
/etc/config/wireless
|
无线网络配置
|
3.UCI的文件语法
UCI文件语法举例
-
config 'section-type' 'section'
-
option 'key' 'value'
-
list 'list_key' 'list_value'
-
config 'example' 'test'
-
option 'string' 'some value'
-
option 'boolean' '1'
-
list 'collection' 'first item'
-
list 'collection' 'second item'
复制代码
config 节点 以关键字 config 开始的一行用来代表当前节点
section-type 节点类型
section 节点名称
option 选项 表示节点中的一个元素
key 键
value 值
list 列表选项 表示列表形式的一组参数。
list_key 列表键
list_value 列表值
config 节点语法格式
-
config 'section-type' 'section'
复制代码
config 节点(后文统一称为节点)原则
UCI 允许只有节点类型的匿名节点存在
节点类型和名字建议使用单引号包含以免引起歧义
节点中可以包含多个 option 选项或 list 列表选项。
节点遇到文件结束或遇到下一个节点代表完成。
option 选项语法格式
option 选项(后文统一称为选项)原则
选项的键与值建议使用单引号包含
避免相同的选项键存在于同一个节点,否则只有一个生效
list 列表选项语法格式
-
list 'list_key' 'list_value'
复制代码
list 列表选项(后文统一称为列表)原则
选项的键与值建议使用单引号包含
列表键的名字如果相同,则相同键的值将会被当作数组传递给相应软件
UCI 的语法容错
-
option example value
-
option 'example' value
-
option example "value"
-
option "example" 'value'
-
option 'example' "value"
复制代码
UCI 无法容忍的语法
-
option 'example" "value'
-
option example some value with space
复制代码
尽量使用常规字符去处理器 UCI,特殊字符有可能会破坏数据结构的完整性。
4.UCI 命令读写配置
语法格式
-
uci [<options>] <command> [<arguments>]
复制代码
读写规则
UCI 读取总是先读取内存中的缓存,然后再读取文件中的
进行过增加,修改,删除操作后要执行生效指令,否则所做修改只存留在缓存中
读取类语法
取得节点类型
-
uci get <config>.<section>
复制代码
取得一个值
-
uci get <config>.<section>.<option>
复制代码
显示全部 UCI 配置
显示指定文件配置
显示指定节点名字配置
-
uci show <config>.<section>
复制代码
显示指定选项配置
-
uci show <config>.<section>.<option>
复制代码
显示尚未生效的修改记录
匿名节点显示(如果所显示内容有匿名节点,使用-X 参数可以显示出匿名节点的 ID)
-
uci show -X <config>.<section>.<option>
复制代码
写入类语法
增加一个匿名节点到文件
-
uci add <config> <section-type>
复制代码
增加一个节点到文件中
-
uci set <config>.<section>=<section-type>
复制代码
增加一个选项和值到节点中
-
uci set <config>.<section>.<option>=<value>
复制代码
增加一个值到列表中
-
uci add_list <config>.<section>.<option>=<value>
复制代码
修改一个节点的类型
-
uci set <config>.<section>=<section-type>
复制代码
修改一个选项的值
-
uci set <config>.<section>.<option>=<value>
复制代码
删除指定名字的节点
-
uci delete <config>.<section>
复制代码
删除指定选项
-
uci delete <config>.<section>.<option>
复制代码
删除列表
-
uci delete <config>.<section>.<list>
复制代码
删除列表中一个值
-
uci del_list <config>.<section>.<option>=<string>
复制代码
生效修改(任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中,切记!)
5.综合实例
本帖隐藏的内容
语法测试
准备产生一个用来测试的配置 mytest
-
root@OpenWrt:~# cp /etc/config/system /etc/config/mytest
-
root@OpenWrt:~# cat /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
复制代码
看看 mytest 的配置
-
root@OpenWrt:~# uci show mytest
-
mytest.@system[0]=system
-
mytest.@system[0].hostname=OpenWrt
-
mytest.@system[0].timezone=UTC
-
mytest.ntp=timeserver
-
mytest.ntp.server=0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org
-
3.openwrt.pool.ntp.org
-
mytest.ntp.enabled=1
-
mytest.ntp.enable_server=0
-
复制代码
取得 mytest.ntp.server 这个选项的值
-
root@OpenWrt:~# uci get mytest.ntp.server
-
0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org
复制代码
增加一个类型为 interface 名字为firewrt的节点
-
uci set mytest.firewrt=interface
复制代码
增加 enable 选项到 firewrt节点
-
uci set mytest.firewrt.enable=1
复制代码
修改类型为 system 的第一个匿名节点下的 hostname 选项
-
uci set mytest.@system[0].hostname=firelink
复制代码
删除掉列表 mytest.ntp.server 的一个值
-
uci del_list mytest.ntp.server=2.openwrt.pool.ntp.org
复制代码
查看都修改了啥
-
root@OpenWrt:~# uci changes mytest
-
mytest.firewrt=interface
-
mytest.firewrt.enable=1
-
mytest.cfg02e48a.hostname=firelink
-
mytest.ntp.server-=2.openwrt.pool.ntp.org
复制代码
使修改生效
看看 mytest 文件
-
root@OpenWrt:~# cat /etc/config/mytest
-
config system
-
option timezone 'UTC'
-
option hostname 'firelink'
-
config timeserver 'ntp'
-
list server '0.openwrt.pool.ntp.org'
-
list server '1.openwrt.pool.ntp.org'
-
list server '3.openwrt.pool.ntp.org'
-
option enabled '1'
-
option enable_server '0'
-
config interface 'firewrt'
-
option enable '1'
阅读(1416) | 评论(0) | 转发(0) |