Openwrt开发笔记(4)——UCI 使用

UCI(Unified Configuration Interface)统一配置接口

OpenWrt的应用软件多种多样,如何简化配置呢,UCI就是为了解决这个问题的。前面几篇我们也使用过UCI的方法对路由器进行配置。这里展开讲一下基础的东西。

UCI格式书写的配置文件是如何生效的

1、集成在openwrt中的软件包一般在启动时会通过脚本加在对应的配置文件,然后转换成应用可以识别的配置文件。 我们可以看下刷机后的/etc/init.d文件夹
在这里插入图片描述
这个是应用在启动时走的启动脚本,我们可以选择一个看一下
在这里插入图片描述都是读取uci配置文件的函数。 那么这个文件在代码中放在哪里呢。 在各自的包里面
在这里插入图片描述我们再对应的模块(这里选择uhttpd)的makefile来作分析。 在安装时会将此文件安装到对应的目录中去。 详细的不做深入,毕竟道行尚浅。
在这里插入图片描述

UCI 配置文件是怎么编辑的

第一种方式我们直接在代码里面编辑。 因为我觉得看图比较清晰,所以大部分就作为图片粘贴来看。
在这里插入图片描述
在这里我们可以直接修改配置文件。

在这里插入图片描述借用上面的图,我们看到配置文件被安装到/etc/config/文件夹下的uhttpd,我们用ssh去看一下。
在这里插入图片描述
是不是对应上了。 其实这里有个差异,就是注释,编译之后的uci,没有注释的,只识别符合UCI格式的配置信息。

讨论完第一种开发者在开发过程中修改配置文件的方案,讨论下在ssh中通过uci 指令进行修改的方法吧。

2、uci指令的命令行用法

1)我们首先在命令行输入uci 来看下参数


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
        -t <path>  set save path for config change files
        -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'

简单说一下,option我们用的较少,现在我还没用到过,可以自己尝试看后面的注释使用。 讲下config,config就是配置包名,比如我们上面举例的uhttpd。
在这里插入图片描述下面我们自己新建一个UCI配置文件,来测试一下一些指令,只贴代码和输出。

root@OpenWrt:/etc/config# touch helloworld
root@OpenWrt:/etc/config# ls
dhcp        firewall    network     ubootenv    wireless
dropbear    helloworld  rpcd        ucitrack
easycwmp    luci        system      uhttpd
root@OpenWrt:/etc/config# uci add helloworld firstConfigNoName
cfg01a4c1
root@OpenWrt:/etc/config# uci export helloworld
package helloworld

config firstConfigNoName 
root@OpenWrt:/etc/config# uci set helloworld.secondHasName=xgy
root@OpenWrt:/etc/config# uci export helloworld
package helloworld

config firstConfigNoName

config xgy 'secondHasName'
root@OpenWrt:/etc/config# uci set helloworld.secondHasName.age=28
root@OpenWrt:/etc/config# uci export helloworld
package helloworld

config firstConfigNoName

config xgy 'secondHasName'
        option age '28'

root@OpenWrt:/etc/config# uci add_list  helloworld.secondHasName.wifi=liuyifei
root@OpenWrt:/etc/config# uci add_list  helloworld.secondHasName.wifi=jy
root@OpenWrt:/etc/config# uci add_list  helloworld.secondHasName.wifi=zhangjunni
ng
root@OpenWrt:/etc/config# uci export helloworld
package helloworld

config firstConfigNoName

config xgy 'secondHasName'
        option age '28'
        list wifi 'liuyifei'
        list wifi 'jy'
        list wifi 'zhangjunning'
root@OpenWrt:/etc/config# uci del_list helloworld.secondHasName.wifi=zhangjunnin
g
root@OpenWrt:/etc/config# uci export helloworld
package helloworld

config firstConfigNoName

config xgy 'secondHasName'
        option age '28'
        list wifi 'liuyifei'
        list wifi 'jy'
root@OpenWrt:/etc/config# uci changes helloworld
helloworld.cfg01a4c1='firstConfigNoName'
helloworld.secondHasName='xgy'
helloworld.secondHasName.age='28'
helloworld.secondHasName.wifi+='liuyifei'
helloworld.secondHasName.wifi+='jy'
helloworld.secondHasName.wifi+='zhangjunning'
helloworld.secondHasName.wifi-='zhangjunning'
root@OpenWrt:/etc/config# uci commit helloworld
root@OpenWrt:/etc/config# uci changes helloworld
root@OpenWrt:/etc/config#

上面是创建了一个新的配置文件helloword,使用add添加匿名配置节。使用set 增加配置节,选项。 changes 查看修改记录,commit进行提交。

这里补充一下UCI配置的格式,其实经过操作之后,已经可以理解了。

  • 配置节(section),是UCI配置的一个独立配置单元。
  • UCI配置文件是由一个或多个配置节组成。是以“config”开头,并且有一个可选名称。配置节包含一个或多个配置选项语句。
  • 每一个配置节(section)都需要有一个类型标识(type),但不一定需要名称(name)。
  • 每一个选项对(option)都有名称(name)和值(value),写在其所属于的配置节中。 UCI标识符和配置文件的名称只能包含字母a~z、0~9 和_。例如连字符(-)是不允许的。 选项的值可以包含任何字符,但需要将它们正确地加上引号。
  • 没有名称标识的配置节称为匿名配置节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值