7 --> UCI 接口的应用

一、 UCI 简介

统一配置接口(Unified Configuration Interface,UCI),是OpenWrt成功的关键技 术之一,已经移植支持数千个软件。它采用纯文本文件来保存配置,并提供命令 行和 C 语言编程调用接口进行管理。UCI的目的在于集中OpenWrt系统的配置。这样每一个开发人员只需学习一次即可, 减少了学习成本。

UCI是简单、实用、直接了当的。UCI是OpenWrt上面主要的配置用户接口,用来作为主要的系统设置,这些设置通常对设备是至关重要的,例如网络接口、无线设置、远程登陆权限设置等都是通过UCI来实现配置的。他是构建一整套系统的必须部分。

二、UCI配置文件格式

  1. 配置节(section),是UCI配置的一个独立配置单元。UCI配置文件是由一个或多个配置节组成。配置节有一个配置类型属性,是以“config”开头,并且有一个可选名称。配置节包含一个或多个配置选项语句。
    格式:配置文件由配置节(section)组成,配置节由多个“name/values”选项对(option)组成
# root@OpenWrt:~# cat /etc/config/network 

config interface 'loopback'
	option ifname 'lo'
	option proto 'static'
	option ipaddr '127.0.0.1'
	option netmask '255.0.0.0'

config globals 'globals'
	option ula_prefix 'fd06:7893:cd7f::/48'

config interface 'lan'
	option type 'bridge'
	option ifname 'eth0 eth1 eth2 eth4'
	option proto 'static'
	option ipaddr '192.168.155.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config interface 'wan'
	option ifname 'eth3'
	option proto 'dhcp'

config interface 'wan6'
	option ifname 'eth3'
	option proto 'dhcpv6'

  1. 每一个配置节(section)都需要有一个类型标识(type),但不一定需要名称(name)
  2. 每一个选项对(option)都有名称(name)和值(value),写在其所属于的配置节中
  3. UCI标识符和配置文件的名称只能包含字母 a~z、0~9 和_。例如连字符(-)是不允许的
  4. 选项的值可以包含任何字符,但需要将它们正确地加上引号
  5. 没有名称标识的配置节称为匿名配置节
  6. 类型(type)和选项(option)的含义均由应用程序来决定,类型一般用于应用程序决定如何处理配置节包含的配置选项
  7. 如果一个选项(type)是不存在的并且是必需的,那应用程序通常会触发一个异常或者记录一个异常的日志,然后程序退出
  8. 通常选项(option)在配置文件中都是使用空格或制表符缩进来标识,但这个并非是语法要求,仅仅是为了增加配置文件的可读性
  9. option和list用来提高配置文件的可读性,并且在语法上也要求使用关键字来表示配置选项的开始

三、 UCI 配置原理

-> UCI配置文件加载流程:
应用程序的UCI配置文件,程序运行时调用 /etc/init.d/xxx 脚本执行UCI配置文件解析为软件通用配置文件,如果只是直接启动可执行文件,没有通过 init.d 调用,将不会将一个 UCI 配置文件更新到特定程序相应的配置文件位置,在/etc/config/的 修改将不会对现有进程有任何影响。

-> CI配置文件的修改:
OpenWrt系统的核心配置分成很多个文件,并且都位于/etc/config目录下。每个文件涉及系统配置的某一部分。你可以用一个文本编辑器修改,或用命令行实用程序UCI编辑配置文件。UCI的配置文件也可通过各种编程 API(如 shell、Lua和C等)来修改,这也是 Web 接口例如LuCI修改UCI文件的方式。

-> 配置文件默认“/etc/config”目录:

文 件 路 径 含 义
/etc/config/dhcp Dnsmasq 软件包配置,包含 DHCP 和 DNS 设置
/etc/config/dropbear SSH 服务器选项
/etc/config/firewall 防火墙配置,包含网络地址转换、包过滤和端口转发等
/etc/config/network 网络配置,包含桥接、接口和路由配置
/etc/config/system 系统设置,包含主机名称,网络时间同步等
/etc/config/timeserver rdate 的时间服务列表
/etc/config/luci 基本的 LuCI 配置
/etc/config/wireless 无线设置和 Wi-Fi 网络定义
/etc/config/uhttpd Web 服务器选项配置
/etc/config/upnpd miniupnpd UPnP 服务设置
/etc/config/qos 网络服务质量的配置文件定义

四、UCI命令

用vi、脚本、lua等工具修改uci配置文件比较麻烦还容易出错,openwrt提供了uci命令工具来操作uci配置文件。uci工具可以获取一个值,设置一个值等功能。在终端下面运行uci命令可以查看他的帮助说明。

Usage :uci [ < options >] < command> [< arguments>]
root@OpenWrt:/etc/config# uci
Usage: uci [<options>] <command> [<arguments>]

Commands:
	batch
	export     [<config>]
	import     [<config>]
	changes    [<config>]
	commit     [<config>]
	add        <config> <section-type>
	add_list   <config>.<section>.<option>=<string>
	del_list   <config>.<section>.<option>=<string>
	show       [<config>[.<section>[.<option>]]]
	get        <config>.<section>[.<option>]
	set        <config>.<section>[.<option>]=<value>
	delete     <config>[.<section>[[.<option>][=<id>]]]
	rename     <config>.<section>[.<option>]=<name>
	revert     <config>[.<section>[.<option>]]
	reorder    <config>.<section>=<position>

Options:
	-c <path>  set the search path for config files (default: /etc/config)
	-d <str>   set the delimiter for list values in uci show
	-f <file>  use <file> as input instead of stdin
	-m         when importing, merge data into an existing package
	-n         name unnamed sections on export (default)
	-N         don't name unnamed sections
	-p <path>  add a search path for config change files
	-P <path>  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'

举例说明常用的一些用法

# root@OpenWrt:~# uci export rpcd

package rpcd
config rpcd
	option socket '/var/run/ubus.sock'
	option timeout '30'

config login
	option username 'root'
	option password '$p$root'
	list read '*'
	list write '*'
	
#root@OpenWrt:/etc/config# uci show network 

network.loopback=interface
network.loopback.ifname='lo'
network.loopback.proto='static'
network.loopback.ipaddr='127.0.0.1'
network.loopback.netmask='255.0.0.0'
network.globals=globals
network.globals.ula_prefix='fd06:7893:cd7f::/48'
network.lan=interface
network.lan.type='bridge'
network.lan.ifname='eth0 eth1 eth2 eth4'
network.lan.proto='static'
network.lan.ipaddr='192.168.155.1'
network.lan.netmask='255.255.255.0'
network.lan.ip6assign='60'
network.wan=interface
network.wan.ifname='eth3'
network.wan.proto='dhcp'
network.wan6=interface
network.wan6.ifname='eth3'
network.wan6.proto='dhcpv6'

#root@OpenWrt:/etc/config# uci get network.lan.ipaddr
192.168.155.1

上一篇:如何从UCI获取数据集?


下一篇:[4G&5G专题-38]:物理层-上行控制信道PUCCH与上行控制信息UCI