1 UCI系統(tǒng)介紹
UCI即統(tǒng)一接口配置(UnifiedConfigurationInterface)的簡(jiǎn)稱,它被應(yīng)用于OpenWrt系統(tǒng)上面。
UCI是簡(jiǎn)單、實(shí)用、直接了當(dāng)?shù)?。UCI是OpenWrt上面主要的配置用戶接口,用來(lái)作為主要的系統(tǒng)設(shè)置,這些設(shè)置通常對(duì)設(shè)備是至關(guān)重要的,例如網(wǎng)絡(luò)接口、無(wú)線設(shè)置、遠(yuǎn)程登陸權(quán)限設(shè)置等都是通過(guò)UCI來(lái)實(shí)現(xiàn)配置的。他是構(gòu)建一整套系統(tǒng)的必須部分。
此外,大部分第三方軟件也被集成到UCI中,因此他們?cè)趏penwrt中也能很簡(jiǎn)單的配置。許多程序有他們自己的配置文件,像/etc/network/interfaces、/etc/exports、/etc/dnsmasq.conf、/etc/samba/smb.conf,并且他們有他們自己的語(yǔ)法,opewnrt不需要改變他們,只需要改UCI設(shè)置就行,opewnrt開發(fā)者已經(jīng)對(duì)許多軟件做了UCI集成,當(dāng)然openwrt開發(fā)者不可能把所有軟件都集成進(jìn)來(lái)。因?yàn)樗麄兊木σ彩怯邢薜摹?/p>
大部分被集成到UCI系統(tǒng)中的軟件通過(guò)修改UCI配置文件,都能很簡(jiǎn)單的被配置,這些配置主要應(yīng)用于系統(tǒng)初始化腳本,他們?cè)?etc/ini.d下面,開啟被UCI系統(tǒng)集成的進(jìn)程就需要用UCI配置文件。比如運(yùn)行/etc/init.d/sambastart就會(huì)用到/etc/config/samba配置文件。
2 UCI系統(tǒng)規(guī)則
Openwrt中UCI配置文件被放在/etc/config目錄下面,每一個(gè)配置文件設(shè)計(jì)到系統(tǒng)的一種配置。你可以用文本編輯器修改這個(gè)配置文件,或者用uci命令修改。當(dāng)然它也可以用其他API接口來(lái)修改,比如shell、lua等,而且web接口像luci、webif也可以改變它。當(dāng)配置文件被改變后,必須重啟程序才能生效。
下面舉一個(gè)修改ip地址的例子,如果你想把默認(rèn)的ip:192.168.1.1改為192.168.2.1,可以通過(guò)vi來(lái)編輯配置文件。
$vi /etc/config/network
在/etc/config/network中找到:
option ipaddr192.168.1.1
把他改變?yōu)?/p>
option ipaddr192.168.2.1
然后重啟網(wǎng)絡(luò)/etc/init.d/networkrestart就會(huì)發(fā)現(xiàn)系統(tǒng)的ip已經(jīng)變?yōu)樾耰p地址了。
3 UCI文件語(yǔ)法
UCI配置文件通常一個(gè)或者更多的config語(yǔ)句,一個(gè)config語(yǔ)句中包括一個(gè)或者更多的option語(yǔ)句來(lái)表示配置內(nèi)容。下面一個(gè)UCI配置文件的內(nèi)容:
package'example'
config'example''test'
option'string''somevalue'
option'boolean''1'
list'collection''firstitem'
list'collection''seconditem'
config'example''test'這條語(yǔ)句是一個(gè)config語(yǔ)句的開始,表示類型是example,test代表名字,其中類型是必不可少的,而且不同的config語(yǔ)句不能有相同的類型,它對(duì)啟動(dòng)腳本有非常重要的意義,但是名字不是必不可少的,可以沒(méi)有,也可以有。
option'string''somevalue'和option'boolean''1'定義了值的內(nèi)容,這里string和boolean在語(yǔ)法上面沒(méi)有差異。在boolean中‘0’,‘no’,‘off’,‘disable’,‘false’都代表0,而‘1’,‘yes’、‘on’、‘true’,‘enable’都代表1。
用list語(yǔ)句可以定義多個(gè)值,他們都有相同的名字,在這里為collection。
其中option和list對(duì)配置文件是非常重要的,每個(gè)字段都是用option或者list來(lái)表示,option代表字段值唯一(后面叫option字段),list代表字段有多個(gè)值(后面叫l(wèi)ist字段),他們是配置文件賦值的重要表示。但是在一個(gè)配置文件中,它們不是必須的語(yǔ)法。通常值不需要用引號(hào)括起來(lái),只有有空格或者TAB建的時(shí)候才需要用引號(hào)。而且單引號(hào)和雙引號(hào)要一一對(duì)應(yīng),下面表示合法的語(yǔ)言:
optionexamplevalue
option'example'value
optionexample"value"
option"example"'value'
option'example'"value"
4 UCI命令
用vi、腳本、lua等工具修改uci配置文件比較麻煩還容易出錯(cuò),openwrt提供了uci命令工具來(lái)操作uci配置文件。uci工具可以獲取一個(gè)值,設(shè)置一個(gè)值等功能。在終端下面運(yùn)行uci命令可以查看他的幫助說(shuō)明。
Usage :uci [] []
Commands:
batch
export []
import []
changes []
commit []
add
add_list .
.=
show [[.
[.]]]
get .
[.]
set .
[.]=
delete [.]]
rename .
[.]=
revert [.
[.]]
reorder .
=
Options:
-c setthesearchpathforconfigfiles(default:/etc/config)
-d setthedelimiterforlistvaluesinucishow
-f useasinputinsteadofstdin
-a applynewconfigurationaftercommit
-L donotloadanyplugins
-m whenimporting,mergedataintoanexistingpackage
-n nameunnamedsectionsonexport(default)
-N don'tnameunnamedsections
-p addasearchpathforconfigchangefiles
-P addasearchpathforconfigchangefilesanduseasdefault
-q quietmode(don'tprinterrormessages)
-s forcestrictmode(stoponparsererrors,default)
-S disablestrictmode
-X donotuseextendedsyntaxon'show'
下面的表格詳細(xì)的介紹了他們的主要用法:
名字 | Config****字段 | 描述 |
---|---|---|
commit | [] | 把改變的uci配置的改變寫入文件系統(tǒng)中,所有的"uciset","uciadd","ucirename"和"ucidelete"都是通過(guò)ucicommit寫入flash中。 |
batch | - | 執(zhí)行uci腳本 |
export | [] | 導(dǎo)出一個(gè)配置,供使用人員閱讀 |
import | [] | 輸入一個(gè)uci語(yǔ)句 |
changes | [] | 顯示在沒(méi)有運(yùn)行ucicommit之前的所有配置文件改變記錄 |
add | 增加一個(gè)config | |
get | .[.] | 得到option字段值 |
set | .[.]= | 設(shè)置option字段值 |
delete | [.]] | 刪除一個(gè)option或者list字段 |
add | _list..= | 增加一個(gè)存在的list字段鏈表 |
rename | .[.]= | 給option字段重命名 |
show | [[.[.]]] | 展示一個(gè)配置的具體內(nèi)容 |
下面我們舉例說(shuō)明常用的一些用法。
獲取一個(gè)值:
獲取lan口的ip地址:ucigetnetwork.lan.ipaddr
#ucigetnetwork.lan.ipaddr192.168.1.1
設(shè)置一個(gè)值:
設(shè)置lan口的ip地址為192.168.2.1
#ucisetnetwork.lan.ipaddr=192.168.2.1
完成之后需要要使其生效,運(yùn)行ucicommit
#ucisetnetwork.lan.ipaddr=192.168.2.1
#ucicommit
設(shè)置好之后重啟network,/etc/config/networkrestart,我們發(fā)現(xiàn)網(wǎng)口ip已經(jīng)被改變了。
運(yùn)行ifconfig。
#ifconfig
br-lanLinkencap:EthernetHWaddr00:11:22:33:44:55
inetaddr:192.168.2.1Bcast:192.168.2.255
Mask:255.255.255.0
inet6addr:fd18:75c3:2be6::1/60Scope:Global
inet6addr:fe80::211:22ff:fe33:4455/64Scope:Link
UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
RXpackets:16errors:0dropped:0overruns:0frame:0
TXpackets:8errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RXbytes:4904(4.7KiB)TXbytes:976(976.0B)
已經(jīng)變?yōu)?92.168.2.1了。
導(dǎo)出顯示一個(gè)選項(xiàng)的配置,現(xiàn)在我們導(dǎo)出uhttp的配置,效果如下所示:
#uciexportuhttpd
packageuhttpd
configuhttpd'main'
listlisten_http'0.0.0.0:80'
listlisten_http'[::]:80'
listlisten_https'0.0.0.0:443'
listlisten_https'[::]:443'
optionhome'/www'
optionrfc1918_filter'1'
optionmax_requests'3'
optionmax_connections'100'
optioncert'/etc/uhttpd.crt'
optionkey'/etc/uhttpd.key'
optioncgi_prefix'/cgi-bin'
optionscript_timeout'60'
optionnetwork_timeout'30'
optionhttp_keepalive'20'
optiontcp_keepalive'1'
optionubus_prefix'/ubus'
configcert'px5g'
optiondays'730'
optionbits'1024'
optioncountry'DE'
optionstate'Berlin'
optionlocation'Berlin'
optioncommonname'OpenWrt'
用show可以展示uhttp的具體內(nèi)容,和export不同的是,export時(shí)導(dǎo)出配置文件的內(nèi)容,show時(shí)顯示uhttp配置的值。效果如下:
#ucishowuhttpd
uhttpd.main=uhttpd
uhttpd.main.listen_http=0.0.0.0:80[::]:80
uhttpd.main.listen_https=0.0.0.0:443[::]:443
uhttpd.main.home=/www
uhttpd.main.rfc1918_filter=1
uhttpd.main.max_requests=3
uhttpd.main.max_connections=100
uhttpd.main.cert=/etc/uhttpd.crt
uhttpd.main.key=/etc/uhttpd.key
uhttpd.main.cgi_prefix=/cgi-bin
uhttpd.main.script_timeout=60
uhttpd.main.network_timeout=30
uhttpd.main.http_keepalive=20
uhttpd.main.tcp_keepalive=1
uhttpd.main.ubus_prefix=/ubus
uhttpd.px5g=cert
uhttpd.px5g.days=730
uhttpd.px5g.bits=1024
uhttpd.px5g.country=DE
uhttpd.px5g.state=Berlin
uhttpd.px5g.location=Berlin
uhttpd.px5g.commonname=OpenWrt
前面大部分是option字段的內(nèi)容,現(xiàn)在說(shuō)一下怎么增加list字段。首先看一下system的配置內(nèi)容,他的ntp服務(wù)器就是list字段。用export我們先看一下:
#uciexportsystem
packagesystem
configsystem
optionhostname'OpenWrt'
optiontimezone'UTC'
configtimeserver'ntp'
listserver'0.openwrt.pool.ntp.org'
listserver'1.openwrt.pool.ntp.org'
listserver'2.openwrt.pool.ntp.org'
listserver'3.openwrt.pool.ntp.org'
optionenabled'1'
optionenable_server'0'
看到server就是list字段,從表格可以看到,add_list可以增加list字段。uciadd_listsystem.ntp.server='4.de.pool.ntp.org'這個(gè)命令可以增加4.de.pool.ntp.org進(jìn)入list字段。增加完之后可以看一下,如下所示:
#uciexportsystem
packagesystem
configsystem
optionhostname'OpenWrt'
optiontimezone'UTC'
configtimeserver'ntp'
listserver'0.openwrt.pool.ntp.org'
listserver'1.openwrt.pool.ntp.org'
listserver'2.openwrt.pool.ntp.org'
listserver'3.openwrt.pool.ntp.org'
listserver'4.de.pool.ntp.org'
optionenabled'1'
optionenable_server'0'
如果增加一個(gè)新的配置,只需要按照UCI系統(tǒng)的語(yǔ)法,增加一個(gè)配置文件就可以,或者用uci add命令。下面列出用uci命令增加一個(gè)新配置的用法:
#touch/etc/config/playapp
新建一個(gè)配置文件
#ucishowplayapp
顯示配置內(nèi)容,可以看到無(wú)內(nèi)容
#uciaddplayappblah
增加一個(gè)配置項(xiàng)
#ucishowplayapp
顯示配置內(nèi)容
playapp.@blah[0]=blah
root@OpenWrt:/#ucicommit&&cat/etc/config/playapp
configblah
顯示文件內(nèi)容,可以看到用uci命令設(shè)置進(jìn)去了。其他的命令大家可以都自己試一試,這里就不一一列舉了。Opewnrt界面采用luci,他很好的應(yīng)用了uci系統(tǒng),學(xué)好uci系統(tǒng)對(duì)學(xué)習(xí)luci有很好的幫助,所以大家需要好好學(xué)習(xí)這個(gè)章節(jié)。
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
8596瀏覽量
151145 -
無(wú)線
+關(guān)注
關(guān)注
31文章
5453瀏覽量
173301 -
命令
+關(guān)注
關(guān)注
5文章
684瀏覽量
22021 -
編輯器
+關(guān)注
關(guān)注
1文章
806瀏覽量
31171 -
OpenWrt
+關(guān)注
關(guān)注
10文章
130瀏覽量
39304
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論