29 --> 详解 OpenWRT系统框架基础软件模块之ubox

一、简介
OpenWrt路由操作系统的框架基础软件有很多,大部分是通用的软件模块,如 dhcp 、dnsmasq、iproute、cmwp、vpn、ipsec等等;OpenWrt还集成部分具有专属特征软件模块,也是OpenWRT系统核心框架软件组件,从此篇开始分析 《OpenWrt系统框架基础软件模块》系列文章。
OpenWrt 核心软件:procd、uci、libubox、ubus、ubox、luci、netifd 软件组件内容,此部分软件模块是构成OpenWrt框架基础软件。
因为OpenWRT是小型软路由操作系统、网络协议栈知识内容十分丰富、望而生畏;我们先把庞大网络协议栈知识放一下,从易于入手的OpenWRT这个开源软路由开始入手,无论是网络协议栈还是OpenWRT的学习,总是要找到起点或入口;OpenWRT入口处就是 libubox ,因为其他软件是依托libubox库 api 接口构建起来的应用,请参考《详解 OpenWRT系统框架基础软件模块之libubox》

本篇文章分析ubox软件组件,ubox分三个部分:

  • 内核模块管理,例如加载内核模块,查看已经加载内核模块等
  • 日志管理功能、logread
  • UCI配置文件数据类型的验证功能
    OpenWRT 把内核模块管理和日志管理功能,从busybox中集成到ubox中、并添加 uci 配置文件数据校验功能,为其他软件组件提供基础通用功能。

二、ubox

首先看一下ubox的CMakeList文件中的代码结构:

// 依赖库及依赖软件
IF(APPLE) INCLUDE_DIRECTORIES(/opt/local/include)
  LINK_DIRECTORIES(/opt/local/lib) ENDIF()
find_library(json NAMES json-c json)
IF(DEBUG) ADD_DEFINITIONS(-DDEBUG -g3) ENDIF()
INCLUDE (CheckSymbolExists) CHECK_SYMBOL_EXISTS(SYS_getrandom syscall.h getrandom)
IF(getrandom) ADD_EXECUTABLE(getrandom getrandom.c)
  INSTALL(TARGETS getrandom RUNTIME DESTINATION bin ) ELSE() message( FATAL_ERROR "Kernel too old, missing SYS_getrandom system call") ENDIF()
// 内核模块管理  
ADD_EXECUTABLE(kmodloader kmodloader.c) TARGET_LINK_LIBRARIES(kmodloader ubox)
INSTALL(TARGETS kmodloader RUNTIME DESTINATION sbin )
ADD_EXECUTABLE(lsbloader lsbloader.c) TARGET_LINK_LIBRARIES(lsbloader ubox ubus)
INSTALL(TARGETS lsbloader RUNTIME DESTINATION sbin )
// uci 数据类型校验
ADD_LIBRARY(validate SHARED validate/validate.c) INSTALL(TARGETS validate LIBRARY DESTINATION lib )
FIND_PATH(uci_include_dir uci.h) INCLUDE_DIRECTORIES(${uci_include_dir})
ADD_EXECUTABLE(validate_data validate/cli.c) TARGET_LINK_LIBRARIES(validate_data ubox uci validate) INSTALL(TARGETS validate_data RUNTIME DESTINATION sbin )
// log 日志管理模块
ADD_EXECUTABLE(logd log/logd.c log/syslog.c) TARGET_LINK_LIBRARIES(logd ubox ubus) INSTALL(TARGETS logd RUNTIME DESTINATION sbin )
ADD_EXECUTABLE(logread log/logread.c) TARGET_LINK_LIBRARIES(logread ubox ubus ${json} blobmsg_json) INSTALL(TARGETS logread RUNTIME DESTINATION sbin ) 

2.1 内核模块管理

内核模块管理使用kmodloader来管理,并软链接为以下5个不同的Linux命令:

rmmod: 从Linux内核中移除一个模块
insmod: 向Linux内核插入一个模块
lsmod: 显示已加载到Linux内核中的模块状态
modinfo: 显示一个Linux内核模块的信息,包含模块路径、许可协议和所依赖模块
modprobe: 加载一个内核模块

2.2 配置文件数据类型检验

对于其他软件模块来说,主要使用 ubox 提供的配置文件验证功能,这样带来了一些好处,可以在软件启动之前使用脚本来对UCI配置进行验证,其他软件组件直接调用 api 检验文件合法性。
配置验证选项有很多类型和关键字,下标列出常用的验证关键字含义:

关键字含 义
cidr无类别路由选择的缩写,包含 cidr4 和 cidr6,是指 IP 地址和其掩码长度,IPv4 类型通常 为 255.255.255.255/32 格式
cidr4IPv4 类型的 IP 地址和其子网掩码,格式为 255.255.255.255/32
file文件路径,例如为/etc/config/network
host主机名称、域名或 IP 地址
ip4addrIPv4 地址,可以是任何 IP 地址,不验证 IP 地址合法性
netmask4IPv4 地址的网络掩码,例如 255.255.255.0
portrange端口范围,形式为 n-m,中间为短横线,不能为冒号,数字小于 65535,并且 n≤m
port端口号数字,合法数字范围为 0~65535
range表示数字所处的范围,例如 range(0, 31)表示大于等于 0,小于等于 31
string字符串,可以限定字符串长度,例如 string(1, 10)限定字符串长度在 1 到 10 之间
uinteger无符号整形数字
bool布尔值,合法的取值有"0"、“off”、“false”、“no”、“disabled”、“1”、“on”、“true”、“yes” 和"enabled"
list是指一个类型的几个数据列表,中间用空格分开,例如 list(port)表示是一个端口列表
or表示可以为几种类型的一个,例如 or(port, portrange)表示为端口或者端口范围

数据验证工具 validate_data的用法:

  • 第一种用法
    对单个数据类型进行验证,它通常用于在软件启动前直接验证,如果数据类型不正确,将输出错误并退出启动流程;
    如: cron软件包对配置参数进行验证
// uci_get 读取system.@system[0].cronloglevel数据项的内容
loglevel=$(uci_get "system.@system[0].cronloglevel")
 
[ -z "${loglevel}" ] || {
    /sbin/validate_data uinteger "${loglevel}" 2>/dev/null
[ "$?" -eq 0 ] || {
    echo "validation failed"
    return 1
    }
}

第一个参数为数据类型,第二个参数为需要验证的配置值。

  • 第二种用法
    配置文件的多个数据类型进行验证; 它至少需要4个参数,第一个参数为 UCI 配置文件名,第二个参数为配置节类型,第三个参数配置节的名称,第四个参数 为验证的 UCI 选项、类型和默认值; 如果有多个配置选项需要验证,则以空格分开紧跟在 第四个参数在后面。
// 文件system 的内容
root@LEDE:~# cat /etc/config/system 
config system
	option hostname 'LEDE'
	option ttylogin '0'
	option log_size '64'
	option log_file '/tmp/syslog'
	option urandom_seed '0'
	option log_proto 'udp'
	option conloglevel '8'
	option cronloglevel '5'
	option zonename 'Asia/Shanghai'
	option timezone 'CST-8'
config timeserver 'ntp'
	option enabled '1'
	list server '3.lede.pool.ntp.org'
//数据校验结构
root@LEDE:~# validate_data system timeserver ntp 'server:list(host)' 'enabled:bool:1'
system.ntp.server[0]=3.lede.pool.ntp.org validates as list(host) with true
system.ntp.enabled=1 validates as bool with true
  • 第3种用法
    参数和第2种用法参数含义和顺序完全相同,但第 3 个参数为""(注意不要有空格),表示空字符串,在这种情况下,将生成导入验证服务的命令字符串。
validate_data system timeserver "" ntp 'server:list(host)' 'enabled:bool:1'
// 生成json对象过程
json_add_object; json_add_string "package" "system"; json_add_string "type" "timeserver"; json_add_object "data"; json_add_string "server" "list(host)"; json_add_string "enabled" "bool"; json_close_object; json_close_object; 

2.3 日志管理

日志管理提供了ubus日志服务,可以通过ubus总线来获取和写入日志
logread读取日志,logd来对日志进行管理。
日志管理配置开启方法。

root@LEDE:~# cat /etc/config/system 
config system
	option hostname 'LEDE'
	option ttylogin '0'
	// 日志文件配置内容
	option log_size '64'
	option log_file '/tmp/syslog'   
	option log_proto 'udp'
	option conloglevel '8'
	option cronloglevel '5'

通过uci命令配置如下:

//修改前内容
root@LEDE:~# uci get system.@system[0].log_file
/tmp/syslog
root@LEDE:~# uci set system.@system[0].log_file=/tmp/systemlog
//修改后内容
root@LEDE:~# uci get system.@system[0].log_file
/tmp/systemlog

其他配置项可参考《详解 OpenWRT系统框架基础软件模块之uci 》。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值