UCI

https://wiki.openwrt.org/doc/uci

https://wiki.openwrt.org/zh-cn/doc/uci

about

[UCI] OpenWrt-uci 命令系统:http://developer.t-firefly.com/forum.php?mod=viewthread&tid=1035

  1. UCI 命令

一个众所周知的原因,在 Linux 下各种软件包有各种不同的配置脚本,每个配置脚本的语法格式和操作方式不同,这样的设计虽然可以体现出各软件包自身的优势,同时也增加了学习曲线。在这一点上 OpenWrt 的 UCI 无疑处理的更胜一筹。UCI 是 集中式配置信息管理接口 (Unified Configuration Interface) 的缩写,他是 OpenWrt 引进的一套配置参数管理系统。UCI 管理了 OpenWrt 下最主要的系统配置参数并且提供了简单、容易、标准化的人机交互接口。UCI 中已经包含了网络配置、无线配置、系统信息配置等作为基本路由器所需的主要配置参数。同时 UCI 也可以帮助开发人员快速的建立一套基于OpenWrt的智能路由产品控制界面。

  1. 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 DHCP 服务配置,为 LAN 口提供 IP
/etc/config/dropbear SSH 服务配置
/etc/config/firewall 路由转发,端口转发,防火墙规则
/etc/config/network 自身网络接口配置
/etc/config/system 时间服务器时区配置
/etc/config/wireless 无线网络配置

syntax

  1. UCI 的文件语法

keyword

UCI 文件语法举例

config 'section-type' 'section'
        option  'key'           'value'
        list    'list_key'      'list_value'
关键字 含义
config 节点
section-type 节点类型
section 节点名称
config 'example' 'test'
        option  'string'        'some value'
        option  'boolean'       '1'
        list    'collection'    'first item'
        list    'collection'    'second item'

Openwrt 开发与 Luci 介绍

注意:UCI 的 文件名标识符 ( option example test 中的 example 即为 标识符testoption ) 可以使用 a-z, 0-9下划线 _ 组合的任意字符串,不允许使用横杠线 -,而 option 可以使用任意字符

关键字 含义
option 选项 (节点中的一个元素)
key
value
list 列表选项 列表形式的一组参数
list_key 列表键
list_value 列表值

config 节点语法格式

config 'section-type' 'section'

config 节点 (后文统一称为节点) 原则:

  • UCI 允许只有节点类型的 匿名节点 存在
  • 节点类型和名字建议使用 单引号 包含以免引起歧义
  • 节点中可以包含多个 option 选项或 list 列表选项
  • 节点遇到 文件结束 或遇到 下一个节点 代表完成

option 选项语法格式:

option 'key' 'value'

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,特殊字符有可能会破坏数据结构的完整性

  1. UCI 命令读写配置

语法格式

uci [<options>] <command> [<arguments>]

读写规则

  • UCI 读取总是先读取 内存 中的缓存,然后再读取 文件 中的
  • 进行过增加,修改,删除操作后要执行生效指令,否则所做修改只存留在 缓存

read

取得 节点类型

uci get <config>.<section>

取得一个

uci get <config>.<section>.<option>

显示全部 UCI 配置

uci show

显示指定文件配置

uci show <config>

显示指定节点名字配置

uci show <config>.<section>

显示指定选项配置

uci show <config>.<section>.<option>

显示尚未生效的修改记录

uci changes <config>

匿名节点 显示(如果所显示内容有匿名节点,使用 -X 参数可以显示出匿名节点的 ID)

uci show -X <config>.<section>.<option>

write

增加一个 匿名节点 到文件

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>

生效修改 (任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中)

uci commit <config>

example

[UCI+入门] FireWRT 新手教程 uci 设置网络命令:http://developer.t-firefly.com/forum.php?mod=viewthread&tid=1014

在我们将 FireWRT 固件刷上 openwrt 系统后,如果 openwrt 未安装 WEB 管理界面,所以我们需要先通过 SSH 或者 telnet 对路由器进行网络设置,设置完成后可通过 openwrt 的软件包管理 opkg 安装 web 设置界面 Luci

设置 LAN IP (即访问路由的 ip)

uci set network.lan.ipaddr=[LAN_IP]

使用 pppoe 设置

uci set network.wan.proto=pppoe             // 设置 WAN 口类型为 pppoe
uci set network.wan.username=[USER]
uci set network.wan.password=[PASSWORD]     // 这两行设置 pppoe 用户名和密码

如果要挂在 上级路由 下面,就需要进行下面的设置

uci set network.wan.proto=none              // 关掉 wan
uci set network.lan.gateway=[IP]            // 网关指向上级路由
uci set network.lan.dns=[IP]                // DNS 指向上级路由
uci set dhcp.lan.ignore=1                   // 关掉 LAN 的 DHCP

最后对无线网络进行配置

uci set wireless.@wifi-device[0].disabled=0         // 打开无线
uci set wireless.@wifi-device[0].txpower=17         // 设置功率为 17dbm 太高会烧无线模块
uci set wireless.@wifi-device[0].channel=6          // 设置无线信道为 6
uci set wireless.@wifi-iface[0].mode=ap             // 设置无线模式为 AP
uci set wireless.@wifi-iface[0].ssid=[SSID]         // 设置无线 SSID
uci set wireless.@wifi-iface[0].network=lan         // 无线链接到 LAN 上
uci set wireless.@wifi-iface[0].encryption=psk2     // 设置加密为 WPA2-PSK
uci set wireless.@wifi-iface[0].key=[password]      // 设置无线密码

提交应用配置

uci commit                      // 应用
/etc/init.d/network restart     // 重启网络服务

安装 LUCI 管理界面

opkg update                     // 更新软件列表
opkg list-installed             // 查看已安装软件
opkg install luci               // 安装 LUCI
opkg install luci-i18n-chinese  // 支持中文

即可完成 LUCI 的安装

输入以下命令开启支持 web 服务的 uhttpd 并设置其为自启动:

/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start

keep practice

shadowsocks

UCI 使用手册:https://sourceforge.net/p/openwrt-dist/wiki/UCI/

查看当前的 UCI 配置文件

uci export shadowsocks

修改/增加 option

uci set shadowsocks.@shadowsocks[-1].option='value'

删除 option

uci delete shadowsocks.@shadowsocks[-1].option

提交对 UCI 配置文件的修改, 提交后配置才能生效

uci commit shadowsocks