Openwrt开发日志——UCI API编…

来源:互联网 发布:罗斯数据 编辑:程序博客网 时间:2024/06/08 15:25

Mission 4

                                                                                                 ——UCI API编程接口学习

Tool

XshellWinSCPOpenwrtNewifi

Reference:

《智能路由器开发指南》

Procedure

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

4.2.1Libubox

      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 -xfzlibubox-2015-11-08-10429bccd0dc5d204635e110a7a8fae7b80d16cb.tar.gz(你的libubox文件名)

    cdlibubox-2015-11-08

   cmake -D BUILD_LUA:BOOL=OFF -D BUILD_EXAMPLES:BOLL=OFF.

   make;

    sudomake 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 -xzfuci-2015-*****.1.tar.gz

cduci-2015-***

cmake -DBUILD_LUA:BOOL=OFF .

make

sudo makeinstall

sudoldconfig

   UCI库头文件安装在/usr/local/include目录下,动态链接库安装在/usr/local/lib/libuci.so,可执行程序为/usr/local/bin/uci。运行ldconfig命令是因为系统还不知道动态链接库已经安装,运行该命令会告诉系统重新加载动态链接库,这样UCI动态链接库就可以使用了。编译时使用以下命令来链接UCI库:

      gcc test.c -otest -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

原创粉丝点击