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