Openwrt开发日志——UCI API编…

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35509823/article/details/76445356

Mission 4

                                                                                                  ——UCI API编程接口学习

Tool

XshellWinSCPOpenwrtNewifi

Reference:

《智能路由器开发指南》

Procedure

UCI不仅提供命令接口供脚本开发者使用,而且提供了C语言调用接口。下面在Ubantu下说明API的使用。首先准备UCI编程接口的使用环境。UCI软件依赖Libubox,因此首先编译Libubox

4.2.1 Libubox

       LibuboxOpenwrt的一个必备的基础库,包含大小端转换、链表、MD5等实用工具基础库,采用Cmake来编译。

libubox主要提供一下两种功能:

        1、提供一套基于事件驱动的机制。

        2、提供多种开发支持接口。(如:链表、kv链表、平衡查找二叉树、md5json

使用libubox开发的好处有如下几点:

        1、可以使程序基于事件驱动,从而可实现在单线程中处理多个任务。

        2、基于libubox提供的开发API可以加快开发进度的同事提高程序的稳定性。

        3、能更好的将程序融入openwrt的架构中,因为新的openwrt的很多应用和库都基于libubox开发的。

       Cmake是跨平台的产生Makefile的命令行工具,它应用于在脚本文件中配置工程。工程设置选项可以在命令行通过-D选项设置。-i选项可以打开交互提示来进行设置。它是一个跨平台的编译系统生成工具。通过平台独立Cmakelistfiles文件来指定构建过程。这个文件在每一个源码目录树目录下均有一个,文件名为Cmakelists.txtLibuboxUCI均使用Cmake命令来产生目标平台的构建系统命令。因此我们要首先安装Cmake

       接着我们编译Libuboxcd进入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.solibubox.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_getUCI使用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

猜你喜欢

转载自blog.csdn.net/qq_35509823/article/details/76445356