概念关系图
首先,我们可以用一个简化的层次图来理解它们的关系:
用户界面层: [iStoreOS Web界面] 或 [LuCI Web界面]
通信协议层: [JSON-RPC] (over HTTP)
进程通信层: [ubus] (本地进程间通信)
系统配置层: [UCI] (统一配置接口)
命令行工具: [curl] (用于测试和调用)
服务网关层: [rpcd] (RPC守护进程,权限控制)
详细概念解析
1. OpenWrt
- 核心定位: 一个专为嵌入式设备(尤其是路由器)设计的 Linux 发行版。
- 关键特性 : 高度模块化、可定制、拥有一个强大的包管理系统 (
opkg
)。 - 它是所有其他概念运行的基石平台。
2. LuCI
- 全称 : L ua C onfiguration Interface。
- 核心定位: OpenWrt 的官方、默认的 Web 管理界面。
- 实现技术 : 主要用 Lua 语言编写,运行在 OpenWrt 的 Web 服务器(如
uhttpd
) 上。 - 作用: 为用户提供一个直观的图形化界面来配置路由器(如设置网络、防火墙、软件包等),而无需直接使用命令行。
- 工作原理 : LuCI 的后端 Lua 程序通过
ubus
与系统底层的各种服务(如network
、firewall
)进行通信,获取状态或修改配置。
3. UCI
- 全称 : U nified C onfiguration Interface。
- 核心定位 : OpenWrt 系统的统一配置系统。
- 作用: 为 OpenWrt 的所有系统配置(网络、无线、防火墙、DHCP 等)提供一个集中、统一、简单的管理方式。
- 工作方式 :
- 配置以纯文本文件形式存储在
/etc/config/
目录下(如/etc/config/network
)。 - 提供命令行工具
uci
来读取、修改这些配置。 - 示例 :
uci show network
显示网络配置,uci set network.lan.ipaddr=192.168.2.1
修改 LAN 口 IP。
- 配置以纯文本文件形式存储在
- 重要性: 它是 OpenWrt 配置的核心,无论是 LuCI 网页还是其他脚本,最终绝大多数配置变更都通过修改 UCI 文件来完成。
4. ubus
- 全称 : O penw rt Bus。
- 核心定位 : OpenWrt 的进程间通信(IPC)系统。
- 作用: 允许系统内不同的进程(守护进程、脚本、应用程序)相互通信、调用函数、传递消息和事件。
- 类比: 类似于 D-Bus 在桌面 Linux 系统中的作用。
- 工作方式 :
- 有一个
ubusd
守护进程管理通信。 - 其他进程可以向
ubusd
注册自己提供的"对象"和"方法"。 - 客户端进程可以查找这些对象,并调用其方法。
- 示例 :
ubus list
列出所有可用的对象,ubus call network.device status
调用network
对象的device
方法来获取设备状态。
- 有一个
5. rpcd
- 全称 : R emote P rocedure C all Daemon。
- 核心定位 : 一个提供 JSON-RPC 接口 的系统服务,是 Web 界面(如 LuCI)与系统
ubus
之间的桥梁 和安全网关。 - 作用 :
- 权限控制: 它负责对来自 Web 的请求进行认证和授权(验证用户名/密码)。
- 协议转换 : 将来自前端的 HTTP/JSON-RPC 请求转换为本地的
ubus
调用。 - 暴露接口 : 它定义哪些
ubus
对象和方法可以被远程调用。
- 配置文件 :
/usr/share/rpcd/acl.d/
下的文件定义了访问控制列表(ACL),规定了不同用户角色可以执行哪些操作。
6. JSON-RPC
- 核心定位 : 一种轻量级的远程过程调用(RPC)协议。
- 特点: 使用 JSON 作为数据格式,通常通过 HTTP 传输。它定义了如何封装请求(方法名、参数)和响应(结果、错误信息)。
- 在 OpenWrt 中的角色 : 这是 LuCI 前端(运行在浏览器中的 JavaScript)与后端
rpcd
服务进行通信的标准协议。
7. curl
- 核心定位: 一个强大的命令行工具,用于传输数据,支持多种协议(如 HTTP, HTTPS, FTP 等)。
- 在 OpenWrt 上下文中的作用 :
- 测试和调试 : 开发者或高级用户可以直接使用
curl
命令来模拟 LuCI 前端,向rpcd
发送 JSON-RPC 请求,从而测试接口或编写脚本。 - 示例 : 你可以用
curl
发送一个登录请求,获取 Session ID(token),然后用这个 token 去调用一个修改 WiFi 设置的 RPC 方法。
- 测试和调试 : 开发者或高级用户可以直接使用
8. iStoreOS
- 核心定位 : 一个基于 OpenWrt 的第三方发行版。
- 目标: 专注于用户友好性,特别是软件中心的体验。它提供了一个更美观、易用的 Web 界面(通常也基于或修改自 LuCI),并预置或简化了软件(如 Docker、各种家庭服务)的安装和管理流程。
- 与上述技术的关系 :
- iStoreOS 构建于 OpenWrt 之上,因此它天然包含了 UCI, ubus, rpcd 等所有核心组件。
- 它的 Web 界面本质上也是一个 RPC 客户端,通过 JSON-RPC 与
rpcd
通信,最终操作 UCI 配置和系统服务。 - iStoreOS 的主要价值在于其应用生态和用户体验的优化,而非底层技术的颠覆。
一个完整的交互流程示例
假设你在 iStoreOS 或 LuCI 的网页上点击按钮"重启 WiFi":
- 前端 (浏览器 JavaScript):
- 捕获点击事件。
- 构造一个 JSON-RPC 请求,方法名可能是
call
,参数中指定要调用的ubus
对象(如network.wireless
)和方法(如restart
)。 - 使用
curl
类似的方式(通过fetch
或XMLHttpRequest
)将这个 HTTP POST 请求发送给路由器。
- 网关 (rpcd):
rpcd
服务接收到这个 HTTP 请求。- 检查请求头中的 Session Token 进行身份验证。
- 查看 ACL 规则,确认该用户有权执行
network.wireless.restart
操作。 - 将 JSON-RPC 请求转换为对本地
ubus
的调用。
- 进程通信 (ubus):
ubus
系统找到注册了network.wireless
对象的进程(可能是netifd
网络守护进程)。- 将
restart
方法的调用请求转发给该进程。
- 系统配置 (UCI):
netifd
进程接收到重启命令。- 它会读取当前的无线配置(来自 UCI 文件
/etc/config/wireless
)。 - 执行一系列系统命令(如
wifi down
和wifi up
)来重启无线服务。
- 返回结果:
- 执行成功或失败的结果沿着原路返回:
netifd
->ubus
->rpcd
-> 前端。 - 前端 JavaScript 接收到 JSON-RPC 响应,在网页上显示"操作成功"或"操作失败"的提示。
总结
- OpenWrt 是地基。
- UCI 是系统的"配置文件数据库"。
- ubus 是系统内部各个模块沟通的"神经系统"。
- rpcd + JSON-RPC 是连接外部世界(如 Web 界面)和内部神经系统(ubus)的"城门和翻译官",负责安全和协议转换。
- LuCI 是官方建的"城主府"(Web界面)。
- iStoreOS 是一个在 OpenWrt 地基上建造的、更豪华、更注重应用生态的"新城堡"。
- curl 是一个万能工具,可以让你绕过"城主府"(Web界面),直接对着"城门"(rpcd)喊话(发送命令)。