Openwrt从小白到专家:ubus总线和uci

30 --> 详解 OpenWRT系统框架基础软件模块之ubus 一、简介 OpenWrt路由操作系统的框架基础软件有很多,大部分是通用的软件模块,如 dhcp 、dnsmasq、iproute、cmwp、vpn、ipsec等等;OpenWrt还集成部分具有专属特征软件模块,也是OpenWRT系统核心框架软件组件,从此篇开始分析 《OpenWrt系统框架基础软件模块》系列文章。 OpenWrt 核心软件:procd、uci、libubox、ubus、ubox、luci、netifd 软件组件内容,此部分软件模块是构成OpenWrt框架基础软件。 因为OpenWRT是小型软 阅读详情
AI摘要

本文围绕OpenWrt的ubus微总线架构展开,介绍了其组成与核心守护进程,阐述在命令行使用ubus工具的方法,如help、list、call等命令,还提及通过HTTP访问ubus,给出使用ubus配置系统的实例,最后说明ubus在Ubuntu上的安装步骤及uci相关操作。

Openwrt从小白到专家:ubus总线

ubus(OpenWrt 微总线架构)

为了在 OpenWrt 中提供各种守护进程和app之间的进程间通信,openWrt开发了一个名为ubus的项目。它由守护进程、库和一些额外的helper组成。

这个项目的核心是ubusd守护进程。它为其他守护进程提供用来注册自己和发送消息的接口,这个接口是使用 Unix 套接字实现的,它使用TLV(类型-长度-值)消息。

为了方便调用ubus的app开发,我们又建立了libubus库。

每个守护进程在特定的命名空间下注册一组路径。每个路径都可以提供具有任意数量参数的多个过程。程序可以用消息回复。

该代码是在LGPL 2.1 许可下发布的,可以通过 git 在https://git.openwrt.org/project/ubus.git找到。

命令行中使用 ubus 工具

ubus命令行工具能够与ubusd服务器交互(与所有注册的服务进行交互)。它对于调查/调试注册的namespace以及编写 shell 脚本很有用。

为了方便调用和返回值,它使用用户友好的 JSON 格式(译者注:这其实是一种JSON-RPC的方式,无状态,轻量级,方便不同语言和平台绑定)。下面是对其命令的解释。

help

root@OpenWrt:~# ubus
用法:ubus [<options>] <command> [arguments...]
选项:
 -s <socket>:设置要连接的unix域套接字
 -t <timeout>:设置命令完成的超时时间(以秒为单位)
 -S:使用简化的输出(用于脚本)
 -v:更详细的输出
 -m <type>:(用于监视器):包含特定的消息类型
			(可以多次使用)
 -M <r|t> (for monitor): 只捕获接收或传输的流量

命令:
 - list [<path>] 列出对象
 - call <path> <method> [<message>] 调用一个对象方法
 - listen [<path>...] 监听事件
 - send <type> [<message>] 发送事件
 - wait_for <object> [<object>...] 等待多个对象出现在 ubus 上
 - 监控 监控 ubus 流量

list

我们可以使用ubus list命令列出当前在总线上运行的服务,Example:

root@OpenWrt:~# ubus list
dhcp
dnsmasq
file
iwinfo
log
luci
luci-rpc
network
network.device
network.interface
network.interface.lan
network.interface.loopback
network.interface.wan
network.interface.wan6
network.rrdns
network.wireless
service
session
system
uci

我们可以通过指定服务路径来过滤列表,Example:

root@OpenWrt:~# ubus list network.interface.*
network.interface.lan
network.interface.loopback
network.interface.wan
network.interface.wan6

列出特定服务的方法及其参数名,加个参数 -v:

root@OpenWrt:~# ubus -v list network.interface.lan
'network.interface.lan' @099f0c8b
	"up": {  }
	"down": {  }
	"status": {  }
	"prepare": {  }
	"add_device": { "name": "String" }
	"remove_device": { "name": "String" }
	"notify_proto": {  }
	"remove": {  }
	"set_data": {  }

call

用法:call+服务名+函数名+输入的json(如果有参数的话),example:

root@OpenWrt:~# ubus call network.interface.wan status
{
	"up": true,
	"pending": false,
	"available": true,
	"autostart": true,
	"uptime": 86017,
	"l3_device": "eth1",
	"device": "eth1",
	"address": [
		{
			"address": "178.25.65.236",
			"mask": 21
		}
	],
	"route": [
		{
			"target": "0.0.0.0",
			"mask": 0,
			"nexthop": "178.25.71.254"
		}
	],
	"data": {

	}
}

注意:参数必须是一个完整的json,键值得按照函数的要求来。example:

root@OpenWrt:~# ubus call network.device status '{ "name": "eth0" }'
{
	"type": "Network device",
	"up": true,
	"link": true,
	"mtu": 1500,
	"macaddr": "c6:3d:c7:90:aa:da",
	"txqueuelen": 1000,
	"statistics": {
		"collisions": 0,
		"rx_frame_errors": 0,
		"tx_compressed": 0,
		"multicast": 0,
		"rx_length_errors": 0,
		"tx_dropped": 0,
		"rx_bytes": 0,
		"rx_missed_errors": 0,
		"tx_errors": 0,
		"rx_compressed": 0,
		"rx_over_errors": 0,
		"tx_fifo_errors": 0,
		"rx_crc_errors": 0,
		"rx_packets": 0,
		"tx_heartbeat_errors": 0,
		"rx_dropped": 0,
		"tx_aborted_errors": 0,
		"tx_packets": 184546,
		"rx_errors": 0,
		"tx_bytes": 17409452,
		"tx_window_errors": 0,
		"rx_fifo_errors": 0,
		"tx_carrier_errors": 0
	}
}

设置监听套接字并观察事件:

root@OpenWrt:~# ubus listen &
root@OpenWrt:~# ubus call network.interface.wan down
{ "network.interface": { "action": "ifdown", "interface": "wan" } }
root@OpenWrt:~# ubus call network.interface.wan up
{ "network.interface": { "action": "ifup", "interface": "wan" } }
{ "network.interface": { "action": "ifdown", "interface": "he" } }
{ "network.interface": { "action": "ifdown", "interface": "v6" } }
{ "network.interface": { "action": "ifup", "interface": "he" } }
{ "network.interface": { "action": "ifup", "interface": "v6" } }

send

发送一个Event:
root@OpenWrt:~# ubus listen &

root@OpenWrt:~# ubus send foo '{ "bar": "baz" }'
{ "foo": { "bar": "baz" } }

通过 HTTP 访问 ubus(不细说)

uhttpd-mod-ubus是uhttpd插件,允许使用HTTP协议控制ubus。
例如,uhttpd就在LuCI2中使用。必须使用post方法将请求发送到/ubus URL(URL可以通过ubus_prefix更改)。此接口使用jsonrpc v2.0。

如果安装了 uhttpd-mod-ubus,uhttpd 会自动配置并启用它,默认情况下在 /ubus,但您可以配置它。
如果您想直接从 Web 客户端使用/ubus,则需要指定ubus_cors=1选项。

如果您使用的是 Nginx,可以尝试nginx-ubus-module

请参阅Postman 集合,其中包含一些通过HTTP调用 UBUS 的示例

使用 ubus 配置系统的几个实例:

查询类:
查询所有网卡状态:

ubus call network.device status

查询eth0网卡状态:

ubus call network.device status '{ "name": "eth0" }'

设置类:

控制wan是否接通:

ubus call network.interface.wan down
ubus call network.interface.wan up

控制lan是否接通:

ubus call network.interface.lan down
ubus call network.interface.lan up

获得防火墙所有zone规则:

ubus call uci get '{ "config": "firewall", "type": "zone" }'

获得防火墙所有rule规则:

ubus call uci get '{ "config": "firewall", "type": "rule" }'

获得防火墙rule规则的第0条:

ubus call uci get '{ "config": "firewall", "section": "@rule[0]" }'

有关uci操作,详情请看:https://openwrt.org/docs/guide-developer/ubus/uci

ubus 在 Ubuntu 上安装

按照这篇文章走:

ubuntu编译ubus及相关依赖库
https://blog.youkuaiyun.com/a29562268/article/details/89054122

安装完ubus后,也可以去安装一下uci,就差一步了:
https://blog.youkuaiyun.com/rainforest_c/article/details/70142987

安装好ubus后一开始用会有这个报错:
在这里插入图片描述
关于ubuntu添加共享库路径:

  1. 将绝对路径写入 /etc/ld.so.conf
  2. sudo ldconfig
/usr/local/lib

在这里插入图片描述
重启计算机或者重启终端就好使了。
在这里插入图片描述
先要启动ubusd,ubus才能工作:

ubus启动 :

sudo ubusd

ubus traffic监控:

sudo ubus monitor

uci

root@Hiwooya:~# uci -h
uci: unrecognized option: h
Usage: uci [<options>] <command> [<arguments>]

Commands:
        batch
        export     [<config>]
        import     [<config>]
        changes    [<config>]
        commit     [<config>]
        add        <config> <section-type>
        add_list   <config>.<section>.<option>=<string>
        del_list   <config>.<section>.<option>=<string>
        show       [<config>[.<section>[.<option>]]]
        get        <config>.<section>[.<option>]
        set        <config>.<section>[.<option>]=<value>
        delete     <config>[.<section>[[.<option>][=<id>]]]
        rename     <config>.<section>[.<option>]=<name>
        revert     <config>[.<section>[.<option>]]
        reorder    <config>.<section>=<position>

Options:
        -c <path>  set the search path for config files (default: /etc/config)
        -d <str>   set the delimiter for list values in uci show
        -f <file>  use <file> as input instead of stdin
        -m         when importing, merge data into an existing package
        -n         name unnamed sections on export (default)
        -N         don't name unnamed sections
        -p <path>  add a search path for config change files
        -P <path>  add a search path for config change files and use as default
        -q         quiet mode (don't print error messages)
        -s         force strict mode (stop on parser errors, default)
        -S         disable strict mode
        -X         do not use extended syntax on 'show'

UCI的配置文件全部存储在/etc/config目录下。

需要记住。使用 uci 设置后,必须调用,xxx为config文件名

uci commit xxxx

例如:我们要让自己能ping到别人。但是让别人ping不通自己
对于ping这个协议,进来的为8(ping),出去的为0(响应).
由于openwrt的防火墙默认是全堵我们为了达到目的,需要禁止8进来
所以我们需要在 firewall 文件中新增加这样的一条规则:

config rule 'myrule'
        option name 'ping'
        option proto 'icmp'
        option dest_port '8'
        option src '*'
        option target 'REJECT'

使用 uci 命令,则应当做如下操作

#增加节点
uci set firewall.myrule=rule
uci set firewall.myrule.name=ping
uci set firewall.myrule.proto=icmp
uci set firewall.myrule.dest_port=8
uci set firewall.myrule.target=REJECT
uci set firewall.myrule.src=*
uci commit firewall
/etc/init.d/firewall restart

例如:新增一个wan域设备5g到防火墙中:

config zone
        option name 'lan'
        list network 'lan'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'ACCEPT'

config zone
        option name 'wan'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'
        list network 'wan'
        list network 'wan6'
        list network '4g'

root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g
root@Hiwooya:~# uci add_list firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g 5g
#这里是想说明delete删不了list的值,需要用del_list
root@Hiwooya:~# uci delete firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g 5g
root@Hiwooya:~# uci del_list firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g

root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g
root@Hiwooya:~# uci add_list firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g 5g
#这里是想说明delete删不了list的值,需要用del_list
root@Hiwooya:~# uci delete firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g 5g
root@Hiwooya:~# uci del_list firewall.@zone[1].network=5g
root@Hiwooya:~# uci get firewall.@zone[1].network
wan wan6 4g

openwrt中的mt7621、MAC存储、PPP、ubus 熊猫哪里 阅读详情

相关推荐

手把手教你用procd管理OpenWRT服务:从配置文件到热插拔实践

本文详细介绍了如何在OpenWRT系统中使用procd服务管理框架来部署和管理自定义服务。内容涵盖从编写基础procd服务脚本、配置进程监控与自动重启,到处理USB设备插拔等热插拔事件的实践。通过具体示例,指导开发者利用procd的声明式配置和事件驱动能力,构建健壮且易于维护的路由器服务,并深入探讨了服务依赖管理、UCI集成及故障排查等高级主题。

threejs5artist的博客 1021

ubus简介

1、简介 ubus为openwrt平台开发中的进程间通信提供了一个通用的框架。它让进程间通信的实现变得非常简单。 ubus实现的基础是unix socket,即本地socket,它相对于用于网络通信的inet socket更高效,更具可靠性。unix socket客户端和服务器的实现方式和网络socket类似。 2、如何实现一个简单的unix socket服务器和客户端 2.1、建立一个socket server端,绑定到一个本地socket文件,并开...

qq_43555380的博客 7177

深入剖析 OpenWRT 网络管理核心:netifd 模块的架构与实现

本文深入解析OpenWRT网络管理核心模块netifd的架构与实现,详细介绍了其设备管理、协议处理和路由配置三大功能。通过事件驱动架构和ubus通信层,netifd高效管理网络接口,支持DHCP/PPPoE等协议,适用于各类网络设备。文章还提供了实战排错技巧和性能优化建议,帮助开发者更好地理解和定制OpenWRT网络功能。

weixin_42520025的博客 418

深入浅出OpenWRT网络架构:netifd如何与ubus协同工作

本文深入解析了OpenWRT网络架构中netifd守护进程与ubus通信总线的协同工作机制。netifd作为网络配置的执行引擎和状态管理器,通过ubus接收指令并广播状态变更,实现了与防火墙、DHCP等服务的高效解耦联动。文章通过实际流程、代码示例和调试命令,揭示了从配置变更到网络生效的核心路径,是深入理解OpenWRT模块化网络管理的关键。

white的博客 441

openwrt学习资料整理

收集于网络,做一个索引吧 OpenWrt开发:01---在VMware中安装OpenWrt OpenWrt开发:02---OpenWrt初次安装后的网络配置(/etc/config/network) OpenWrt开发:03---OpenWrt简介 OpenWrt开发:04---OpenWrt整体架构与功能组件 OpenWrt开发:05---安装OpenWrt源码的编译工具(SDK) ...

xiaohu1996的博客 2664

告别ifconfig:用ubus命令玩转OpenWrt网络接口(netifd实战指南)

本文详细介绍了如何在OpenWrt中使用ubus命令替代传统的ifconfig工具,通过netifd实战指南帮助开发者高效管理网络接口。文章涵盖了接口状态监控、动态IP地址管理、高级网络配置技巧及实战脚本编写,特别适合需要深度定制OpenWrt网络的开发者。

weixin_42567497的博客 304

OpenWrt 基础软件模块之ubox

OpenWrt 基础软件模块之ubox Openwrt 支持模块化编程,增加新功能非常简单。但是一些通用的基础模块必须包含,他们是OpenWrt核心。 如:实用基础库libubox、系统总线ubus、网络接口管理模块netifd、核心工具模块ubox、服务管理模块procd。 核心工具模块ubox ubox在2013年加入OpenWrt的代码库中。它是 OpenWrt 中的一个核心扩展功能,是OpenWrt的帮助工具箱 ubox分三个部分: 内核模块管理,例如加载内核模块,查看已经加载内核模块等

hzlarm的博客 1567

OpenWRT网络管理神器netifd:从零配置到实战调试(附常见问题排查)

本文深入解析OpenWRT核心网络管理组件netifd,从系统框架与基础软件模块入手,提供从零配置到实战调试的完整指南。内容涵盖手写UCI配置文件、ubus状态监控、日志分析等高级技巧,并附有WAN口DHCP失败、配置不生效等常见问题的详细排查方法,帮助用户彻底掌握OpenWRT网络配置与故障诊断能力。

weixin_29305313的博客 260

OpenWRT网络管理核心netifd实战:从源码到配置的完整指南

本文深入解析OpenWRT网络管理核心netifd的架构设计与实战应用,涵盖源码解析、ubus通信机制、网络配置技巧及性能优化。通过详细的代码示例和配置指南,帮助开发者掌握netifd的系统框架和基础软件模块,实现高效的嵌入式网络设备开发与管理。

weixin_30379531的博客 500

14-Openwrt ubus

ubus是OpenWrt中的进程间通信机制,ubusd实现server,其他进程实现client,例如ubus(cli)、netifd、procd,两个client通信需要通过server转发。 ubus提供了创建socket client端的接口,并且提供了三种现成的客户端供用户直接使用: 为shell脚本提供的client端。 为lua脚本提供的client接口。 为C语言提供的clie...

Creator_Ly的博客 1615

openwrt路由系统------lua、uci的关系

二者共同构成了 OpenWrt 的图形化配置系统的核心。如果你是开发者,可以利用 Lua 快速定制界面,结合 UCI 实现灵活的路由器配置管理。目录),通过 UCI 访问系统配置。编写新的 Luci 模块(需放置在。

a_zxswer的博客 580

详解 OpenWRT系统框架基础软件模块之netifd

OpenWrt路由操作系统的框架基础软件有很多,大部分是通用的软件模块,如 dhcp 、dnsmasq、iproute、cmwp、vpn、ipsec等等;OpenWrt还集成部分具有专属特征软件模块,也是OpenWRT系统核心框架软件组件,从此篇开始分析 《OpenWrt系统框架基础软件模块》系列文章。OpenWrt 核心软件:procd、uci、libubox、ubus、ubox、luci、netifd 软件组件内容,此部分软件模块是构成OpenWrt框架基础软件。

l00102795的博客 1249

OpenWrt 专栏介绍00

该文档是 OpenWrt专题文档,专栏内容参考互联网,总结实践和自己理解,如有侵权,请联系本作者删除。交流企鹅:556742984。

逗倪豌儿 623

Openwrt procd守护进程

通常的嵌入式系统均有一个守护进程,该守护进程监控系统进程的状态,如果某些系统进程异常退出,将再次启动这些进程。procd 就是这样一个进程,它是使用C语言编写的,一个新的 OpenWrt 进程管理服务。它通过init脚本来将进程信息加入到 procd 的数据库中来管理进程启动,这是通过ubus总线调用来实现,可以防止进程的重复启动调用。 procd 的进程管理功能主要包含 3 个部分。 reload_config,检查配置文件是否发生变化,如果有变化则通知 procd 进程。 procd,守护进程.

wangwulin250的博客 3438

基于OpenWrt的智能家居系统开发实战:SmartHome项目详解

OpenWrt作为一款高度可定制的嵌入式Linux操作系统,广泛应用于路由器及物联网网关设备中。其模块化设计、丰富的软件包生态(通过opkg管理)以及对MT7621、RK3328等多种硬件平台的良好支持,使其成为构建智能家居中枢系统的理想选择。上述命令展示了OpenWrt通过opkg快速安装Web界面与MQTT通信组件的能力,体现其灵活扩展性。结合procd服务管理和ubus。

weixin_33628677的博客 1539

Openwrt UBUS介绍

Openwrt ubus通讯框架介绍 ubus是类似Linux桌面系统上dbus一种通讯框架,为进程间通信提供支持,并支持消息回调,非常强大好用

Openwrt 嵌入式Linux发行版

📌 OpenWrt的定义与核心定位 嵌入式Linux发行版 OpenWrt是专为路由器等嵌入式设备设计的开源操作系统,基于Linux内核,支持高度模块化定制。它提供完整的包管理工具(OPKG)、可读写文件系统及统一的配置接口(UCI),用户可自由安装软件包扩展功能。 设计目标 解决传统路由器固件封闭、功能受限的问题,提供稳定、可定制且持续更新的替代方案。其核心优势包括: ● 高扩展性:超3000个软件包支持(如VPN服务器、流量控制工具等)。 ● 多架构兼容:支持x86、ARM、MIPS、RISC-V等处

云域A的博客 1944

在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合

本文介绍了在Mac上搭建本地AI工作流的方法,结合Dify平台和DeepSeek模型。Dify是一个开源的大语言模型应用开发平台,支持可视化AI应用开发。部署步骤包括:1)安装Homebrew和Docker;2)克隆Dify代码库;3)配置环境变量并启动服务。同时,使用Ollama工具本地部署DeepSeek模型,将其集成到Dify中创建聊天助手。通过配置模型接口和新建应用,用户可以在本地环境中实现AI对话功能。这种方案既保证了数据隐私,又提供了灵活的AI应用开发能力。

Linda的自动化测试之旅 1534
上一篇: OpenWrt简单命令配置
下一篇: OpenWRT配置 -- 修改用户名、密码以及网页用户名的修改
szembed
博客等级 码龄18年 1475粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值