Mission 4
——UCI API編程接口學習
Tool:
Xshell; WinSCP; Openwrt;Newifi
Reference:
《智能路由器開發指南》
Procedure:
UCI不僅提供命令接口供腳本開發者使用,而且提供了C語言調用接口。下面在Ubantu下說明API的使用。首先準備UCI編程接口的使用環境。UCI軟件依賴Libubox,因此首先編譯Libubox。
4.2.1 Libubox
Libubox是Openwrt的一個必備的基礎庫,包含大小端轉換、鏈表、MD5等實用工具基礎庫,採用Cmake來編譯。
libubox主要提供一下兩種功能:
1、提供一套基於事件驅動的機制。
2、提供多種開發支持接口。(如:鏈表、kv鏈表、平衡查找二叉樹、md5、json)
使用libubox開發的好處有如下幾點:
1、可以使程序基於事件驅動,從而可實現在單線程中處理多個任務。
2、基於libubox提供的開發API可以加快開發進度的同事提高程序的穩定性。
3、能更好的將程序融入openwrt的架構中,因爲新的openwrt的很多應用和庫都基於libubox開發的。
Cmake是跨平臺的產生Makefile的命令行工具,它應用於在腳本文件中配置工程。工程設置選項可以在命令行通過-D選項設置。-i選項可以打開交互提示來進行設置。它是一個跨平臺的編譯系統生成工具。通過平臺獨立Cmake的listfiles文件來指定構建過程。這個文件在每一個源碼目錄樹目錄下均有一個,文件名爲Cmakelists.txt。Libubox和UCI均使用Cmake命令來產生目標平臺的構建系統命令。因此我們要首先安裝Cmake:
接着我們編譯Libubox,cd進入dl目錄下,找到libubox的壓縮包:
隨後進行編譯,指令爲:
tar -xfz libubox-2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb.tar.gz(你的libubox文件名)
cd libubox-2015-11-08
cmake -D BUILD_LUA:BOOL=OFF -D BUILD_EXAMPLES:BOLL=OFF .
make;
sudo make install;
注意在Cmake生成Makefile時,後面有一個點,表示在當前目錄執行。
生成Makefile時,設置了兩個編譯開關爲OFF,分別是lua和使用示例,我們不進行編譯,因此把編譯選項關閉。
編譯結束後,進行安裝,安裝到系統目錄中。安裝內容包含頭文件和動態鏈接庫文件。頭文件默認在/usr/local/include/libubox/目錄中,動態鏈接庫libubox.so和libubox.a安裝在/usr/local/lib/目錄下。
4.2.2 UCI
在Libubox安裝完成後即可編譯安裝UCI軟件了。同樣進入dl文件夾,編譯安裝UCI,代碼爲:
tar -xzf uci-2015-*****.1.tar.gz
cd uci-2015-***
cmake -D BUILD_LUA:BOOL=OFF .
make
sudo make install
sudo ldconfig
UCI庫頭文件安裝在/usr/local/include目錄下,動態鏈接庫安裝在/usr/local/lib/libuci.so,可執行程序爲/usr/local/bin/uci。運行ldconfig命令是因爲系統還不知道動態鏈接庫已經安裝,運行該命令會告訴系統重新加載動態鏈接庫,這樣UCI動態鏈接庫就可以使用了。編譯時使用以下命令來鏈接UCI庫:
gcc test.c -o test -luci
4.2.3 UCI API 接口
UCI接口命名非常規範,統一以小寫uci打頭,並放在uci.h頭文件中。大多數函數的第一個參數均爲uci_context的指針變量。這個變量在程序初始化時調用uci_alloc_context函數分配空間並設置初始值。在程序執行結束時調用uci_free_context函數釋放空間,
UCI接口有設置函數uci_set,但沒有相應的獲取函數uci_get,UCI使用uci_lookup_ptr來提供查詢功能,如果查到則通過獲取ptr變量的值來獲取配置的值。
UCI API 接口含義對照表(略)以後這個含義對照表也將會被用到。
4.3 系統內核設置
Openwrt是一個linux操作系統,因此它的桌面操作系統和Ubuntu以及Fedora一樣,採用sysctl作爲系統的內核配置工具,是一個允許您改變正在運行中的Linux系統的接 口。它包含一些 TCP/IP 堆棧和虛擬內存系統的高級選項,這可以讓有經驗的管理員提高引人注目的系統性能。用sysctl可以讀取設置超過五百個系統變量。sysctl.conf作爲其內核配置文件在啓動時進行加載。
4.3.1 sysctl.conf
此文件時系統啓動預加載的內核配置文件,通過sysctl命令讀取和設置到系統當中。配置文件的語法格式如下:
# comment
; comment
token = value
以“#”和分號開頭的爲註釋,忽略空白行,配置值以key=value形式設置。如設置打開報文轉發爲net.ipv4.ip_forward=1。
這個文件在Openwrt源碼中保存在package/base-files/files/etc/sysctl.conf目錄下。
Openwrt常見內核配置項含義(略)
4.3.2 sysctl
Sysctl是用於修改運行中的內核參數的命令,所有可用的內核參數均在/proc/sys目錄下。運行sysctl需要procfs文件系統支持。可以用sysctl讀取和修改內核參數數據。
-n:查詢時輸出配置項的值,但不輸出配置項。
-e:當碰到不認識的配置項時,忽略錯誤。
-w:使用這個選項來修改系統設置。
-p:從指定的配置文件中加載配置,如果沒有指定則使用默認的配置文件/etc/sysctl.conf。
-a:顯示當前所有可用的值。
常用命令舉例如下:
/sbin/sysctl -a,顯示所有的內核配置;
/sbin/sysctl -n kernel.hostname,查詢kernel.hostname的值;
/sbin/sysctl -w kernel.hostname = “sao”, 修改系統主機名稱爲sao;
/sbin/sysctl -p /etc/sysctl.conf,加載配置。
內核的參數配置在啓動時由sysctl工具加載,默認加載/etc/sysctl.conf。啓動之後均可在/proc/sys下查詢,例如直接查詢是否打開路由轉發:
cat /proc/sys/net/ipv4/ip_forward
內核參數也可以通過直接修改/proc/sys下的文件來生效。例如打開路由轉發設置,可以執行以下命令:
echo “1” > /proc/sys/net/ipv4/ip_forward
4.4 系統配置
Openwrt還有一些配置不是通過UCI配置來實現的,這部分屬於大多數Linux系統都有的,用戶很少修改,因此不提供給用戶進行修改。
主要有:
/etc/rc.local
/etc/profile
/etc/shells
/etc/fstab
/etc/services
/etc/protools