1、什么是UCI
UCI是一个用C写的功能组件,为了集中化管理运行OpenWrt系统的设备的配置文件。UCI是在OpenWrt历史版本 White Russian 中存在的基于 NVRAM 的配置文件的替代版本和 其附带的标准配置文件程序的封装, 例如 /etc/network/interfaces, /etc/exports, /etc/dnsmasq.conf, /etc/samba/samba.conf 等。
说白了,UCI就是为了统一应用程序的配置文件格式,方便统一用命令或者api接口去操作配置。当然应用程序原有配置保持不变,中间增加一层转换过程。
启动一个OpenWrt应用程序流程图如下:
2、UCI的依赖
-
libuci C语言实现的小型库
-
libuci-lua 一个为Lua写的UCI插件库,它在luci被使用
3、UCI附加包
包名 | 描述 |
uci | 统一配置接口 (UCI) 的功能组件 |
libuci | 统一配都置接口 (UCI) 的C语言库 |
libuci-lua | C语言库文件的LuaLua插件库, 例如 luci就用到了这个库 |
4、已安装的文件
路径/文件 | 描述 | 描述 |
/sbin/uci | 二进制文件/binary | uci 的可执行文件 |
/lib/config/uci.sh | shell脚本/Shell Script | /sbin/uciShell脚本可用的封装 |
/lib/libuci.so | 符号链接/symlink | libuci.so.xxx 的符号链接 |
/lib/libuci.so.2011-01-19 | 二进制文件binary | 库文件 |
/usr/lib/lua/uci.so | 二进制文件/binary | lua库文件 |
5、UCI配置文件
-
配置路径
/etc/config/
-
配置文件内容(文件名class)
root@ZhouWu:/# cat /etc/config/network
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'config globals 'globals'
option ula_prefix 'fd78:ca3e:7361::/48'config device
option name 'br-lan'
option type 'bridge'
list ports 'lan1'
list ports 'lan2'
list ports 'lan3'config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '10.10.18.1'
option netmask '255.255.255.0'
option ip6assign '60'config interface 'wan'
option device 'eth1'
option proto 'dhcp'config interface 'wan6'
option device 'eth1'
option proto 'dhcpv6'config interface 'wwan'
option device 'lan4'
option proto 'dhcp'
-
uci命令操作实例
获取option值
获取list值
查看所有配置
修改option值
修改list内容(增加/删除)
6、shell api说明
-
shell api源码路径
/lib/functions.sh
-
主要接口列表
config_load
config_get
config_set
config_foreach
config_list_foreach
7、config_get接口
-
接口说明
用于获取option变量值
-
接口参数
参数 | 说明 |
$1 <variable> | 获取到的值存储变量 |
$2 <section> | section名称 |
$3 <option> | option名称 |
$4 <default> | 默认值 |
-
接口实例
config_get ifname_value "lan" ifname
8、config_foreach接口
-
接口说明
遍历指定类型的section,通过回调函数处理section
-
接口参数
参数 | 说明 |
$1 <callback> | 遍历callback |
$2 <section type> | section 类型 |
-
接口实例
handle_xxx()
{
local section="$1"
#handle section
}
config_foreach handle_xxx "interface"
9、实例:通过shell获取所有网卡接口名
可能通过以上接口文档,还不能直观的说明接口的用法,我写了一个实例通过shell脚本从uci网络配置中提取所有网络接口名,通过该实例可以学习config_load、config_get、config_foreach的用法,希望对大家有帮助。
-
OpenWrt系统网络配置
配置文件路径
/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 interface 'lan'
option type 'bridge'
option ifname 'eth0.1'
option proto 'static'
option ipaddr '192.168.166.1'
option netmask '255.255.255.0'
option ip6assign '60'
config device 'lan_dev'
option name 'eth0.1'
option macaddr '00:0c:43:76:20:d0'
config interface 'wan'
option ifname 'eth0.2'
option proto 'dhcp'
源代码
#!/bin/sh
. /lib/functions.sh
# 需要先load network配置,默认/etc/config/network
config_load network
# 每个section会调用一次
handle_intf()
{
local section="$1"
config_get ifname $section ifname
echo "interface=$ifname"
}
config_foreach handle_intf "interface"
运行结果
interface=lo
interface=br-lan
interface=eth0.2