OpenWrt One 开源硬件路由器固件架构深度拆解

一、OpenWrt One 的诞生与定位

2024 年底,OpenWrt 项目联合 Banana Pi 推出了真正意义上的"官方参考硬件"——OpenWrt One。它并非又一款树莓派式开发板,而是首款由 OpenWrt 社区从芯片选型、PCB 设计到固件镜像全链路主导的路由器设备。这一身份的转变,让它从"创客玩具"升级为可被严肃研究与生产环境采纳的硬件载体。

核心硬件规格如下:

  • SoC:MediaTek Filogic 820(MT7981B),双核 ARM Cortex-A53 @ 1.3GHz
  • 内存:1GB DDR4
  • 存储:256MB NAND + 32MB SPI NOR(双镜像冗余备份)
  • 网络:1× 2.5GbE WAN + 1× 2.5GbE LAN + 4× GbE LAN
  • 其他:USB 3.0、eMMC 槽位、M.2 Key E 无线扩展接口
关键意义在于:OpenWrt 终于拥有了一台社区可复现、可审计、可长期维护的官方硬件平台,结束了"百家芯片、百家坑"的历史。

二、固件架构全景:从 Bootloader 到 LuCI

OpenWrt 的固件并非单一二进制,而是一个分层、有依赖关系的最小 Linux 系统。下图为典型运行时栈:

┌─────────────────────────────────────┐
│  LuCI Web UI / ubus RPC 客户端      │  ← 用户态管理层
├─────────────────────────────────────┤
│  UCI 配置中枢 + rpcd + procd        │  ← 服务编排层
├─────────────────────────────────────┤
│  netifd / odhcpd / dnsmasq / fw4    │  ← 网络与安全层
├─────────────────────────────────────┤
│  netfilter / nftables / tc 队列     │  ← 内核交互层
├─────────────────────────────────────┤
│  Linux Kernel 5.15 LTS / 6.x        │  ← 内核
├─────────────────────────────────────┤
│  U-Boot → ARM Trusted Firmware      │  ← 引导层
└─────────────────────────────────────┘

接下来逐层拆解。


三、引导与可信启动链

3.1 U-Boot 适配

OpenWrt One 的第一阶段引导使用 U-Boot,针对 MT7981B 的 ARMv8 启动流程做了定制:

  • SPL(Secondary Program Loader):驻留在 SPI NOR,承担 DRAM 初始化与 U-Boot proper 加载。
  • U-Boot proper:位于 NAND,支持 TFTP、HTTP、网络控制台回退。
  • 双环境分区uboot-env 双备份,杜绝变砖。

3.2 安全启动

虽然未强制启用Secure Boot,但通过签名校验的 fitImage 格式支持,已为后续引入OP-TEE + Verified Boot预留了路径。固件升级时由 mtd 工具按块校验 SHA256。


四、内核与最小用户态

4.1 内核裁剪策略

OpenWrt 14 年如一日地坚持最小化编译原则:

  • 仅保留路由器场景所需的子系统(netfilter、cgroup、squashfs、UBI/UBIFS)
  • 默认禁用 initramfs,内核与 rootfs 解耦
  • 启用 LTO + size-optimization,目标镜像通常 < 8MB

4.2 C 库选型

提供两套 rootfs:

发行版C 库目标场景
openwrt-imagebuilder 默认musl libc节省空间、静态链接友好
实验性 glibc 构建glibc二进制兼容性优先
在 OpenWrt One 上,musl 仍是绝对主流,因其能让基础系统稳定控制在 16MB NAND 分区内。

五、构建系统:从源码到镜像

5.1 Buildroot 派生体系

OpenWrt 自带的构建系统源自 Buildroot,但做了大规模改写:

package/        ← 软件包配方(Makefile + patches)
target/linux/   ← 各平台内核配置与 DTS
toolchain/      ← 交叉编译工具链描述
config/         ← 默认 defconfig

典型构建命令:

git clone https://github.com/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig   # 选择 filogic + OpenWrt One 目标
make -j$(nproc) download world

5.2 ImageBuilder 与 SDK

  • ImageBuilder:预编译环境,仅允许组合包、配置、文件,适合运维场景;
  • SDK:完整工具链,可交叉编译自定义包。

这两种"非源码构建"工具极大降低了二次开发门槛。


六、UCI:Unified Configuration Interface

UCI 是 OpenWrt 区别于其他 Linux 发行版的核心抽象层。所有配置均以 /etc/config/* 下的纯文本文件呈现:

config interface 'wan'
    option proto 'dhcp'
    option device 'eth0'

config interface 'lan'
    option proto 'static'
    option ipaddr '192.168.1.1'
    option netmask '255.255.255.0'

特点:

  1. 声明式:应用感知 UCI 改动后自动执行回调;
  2. 绑定语义:每个 config-section 都对应一个服务对象;
  3. 脚本接口uci set / commit / show / add / delete 是几乎所有包的标准 API。

UCI 把 Linux 系统配置从"散落的 shell 脚本"升级为"统一数据模型",是 OpenWrt 生态繁荣的隐形功臣。


七、进程与服务的协奏

7.1 procd:现代 init 系统

OpenWrt 不使用 systemd,而是采用自研的 procd

  • 监听内核 hotplug 事件,自动启停接口服务;
  • 内置 cgroup v1 资源隔离;
  • 与 ubus(微总线)深度整合,提供进程状态查询。

7.2 netifd:网络栈的大脑

传统发行版使用 NetworkManager,但对路由器过于沉重。OpenWrt 的 netifd 实现了:

  • 接口状态机(if-up/down/renewing);
  • 多协议拨号(DHCP、PPPoE、Static、QMI);
  • 与防火墙、DHCP、IPv6 RA 服务的联动。

7.3 ubus 与 rpcd

  • ubus:本地 socket,提供 JSON-RPC 接口;
  • rpcd:将其暴露为 HTTP/WebSocket,供 LuCI 与第三方 APP 调用。

整套设计让 CLI、Web、远程 APP 对"路由器配置"拥有一致的视图


八、数据面:netfilter 与 fw4

8.1 从 iptables 到 nftables

OpenWrt 23.05 起,fw4 取代了基于 iptables 的 fw3。fw4 默认后端为 nftables,优势在于:

  • 表、链、集合(set)语法简洁,性能更好;
  • 与 UCI /etc/config/firewall 自动联动,转换层透明。

8.2 流量整形

tc + ifb(Intermediate Functional Block)实现:

  • 层级带宽限速;
  • DSCP / IPset 分类;
  • CAKE / fq_codel SQM(Smart Queue Management)开箱即用。

8.3 转发加速

OpenWrt One 的 MT7981B 自带HW_NAT 引擎,需配合:

  • mtkhnat 驱动;
  • nss-firmware
  • ppe 卸载配置。

合理启用后,小包转发可达 2.5Gbps 线速。


九、存储与文件系统

9.1 UBI/UBIFS

NAND 部分采用UBI + UBIFS,相比裸 MTD:

  • 磨损均衡;
  • 坏块管理;
  • 卷可在线扩容。

9.2 OverlayFS

系统根目录采用 squashfs(只读)+ overlay(可写),带来:

  • 失败回滚:重启即可恢复出厂;
  • 软件包管理(opkg)基于差分安装。

9.3 opkg 包管理

opkg 是为嵌入式优化的轻量 dpkg 替代品:

opkg update
opkg install luci-app-adblock
opkg list-installed
opkg remove xxx

签名校验通过 usign + 受信任的 Release keys 实现,PGP 公钥在构建时烧入 squashfs


十、安全机制深度剖析

10.1 默认防御策略

  • DROP 入站策略:默认拒绝所有 WAN→LAN;
  • NAT:IPv4 默认 masquerade;
  • IPv6 默认开启隐私扩展与临时地址。

10.2 SSH 强化

  • Dropbear 替代 OpenSSH;
  • 禁用密码登录、强制 ED25519;
  • 内置 ssh-keys UCI 钩子直接管理公钥。

10.3 可选加固模块

  • security-flag:使用 PaX/Grsec 风格的编译选项(部分补丁仍可应用);
  • TUF 镜像更新:社区正推进基于 The Update Framework 的防回滚升级;
  • 容器沙箱:通过 podman 在 OpenWrt One 上跑隔离服务。

十一、LuCI:现代 Web 栈

LuCI 并非简单 CGI,而是一个MVC 架构

LuCI
├── core/          ← Lua 运行时、模型抽象
├── modules/       ← 授权、国际化、路径路由
├── applications/  ← luci-app-* 应用
└── resources/     ← 视图模板、CBI 表单

技术栈:

  • Lua 5.1 + CBI(Configuration Bind Interface);
  • ubus RPC 拉取状态;
  • 可选uhttpd + lua-resty 提供更高性能路径(部分原型已出现)。

开发者只需编写两个文件:

applications/luci-app-demo/root/usr/lib/lua/luci/controller/demo.lua
applications/luci-app-demo/root/usr/lib/lua/luci/model/cbi/demo.lua

便能获得完整的配置表单与读写 UCI 的能力。


十二、与传统厂商固件的对比

维度传统路由器OpenWrt One
内核版本厂商长期 fork跟随主线 LTS,可升级到 6.x
包管理厂商私有方案标准化 opkg + 仓库签名
配置单一 JSON/XMLUCI 文本,diff 友好
安全审计黑盒全栈可复现构建
扩展性厂商 SDK 封闭GPL 强制公开
二进制根全厂商私货musl + 自由可重编译

值得注意的是,OpenWrt One 的硬件抽象层(HAL)仍依赖 MediaTek 闭源 blob——这是目前任何替代方案都绕不开的现实,但相比"全闭源",已经跨出一大步。


十三、典型开发工作流

下面以"为 OpenWrt One 添加自定义监测代理"为例:

  1. 编写包定义 package/myagent/Makefile
include $(TOPDIR)/rules.mk
PKG_NAME:=myagent
PKG_VERSION:=1.0
include $(INCLUDE_DIR)/package.mk
define Package/myagent
  SECTION:=net
  CATEGORY:=Network
  TITLE:=Custom Router Metrics Agent
  DEPENDS:=+libuci +libubus
endef
define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    cp ./src/* $(PKG_BUILD_DIR)/
endef
$(eval $(call BuildPackage,myagent))
  1. 编写 init 脚本 package/myagent/files/myagent.init,使用 /etc/init.d/ 风格 procd 触发器;
  2. 添加 UCI hook /etc/uci-defaults/99-myagent,配置默认值;
  3. 构建镜像
make package/myagent/compile V=s
make -j$(nproc) target/linux/filogic/image
  1. 烧写sysupgrade -n -v openwrt-filogic-openwrt_one-squashfs-sysupgrade.itb

整条链路全部本地、可复现、版本受控。


十四、面向未来的演进方向

  1. 主线 TLS:启用 kTLS + BPF,使 OpenSSL 卸载到内核;
  2. 可编程数据面:eBPF + XDP 替代部分 netfilter 路径;
  3. 零接触配置:基于 FIDO2 / Device Attestation 的接入流程;
  4. RISC-V 备选评估:社区已讨论引入 RISC-V 平台作为下一代参考硬件;
  5. 多设备同源:OpenWrt One 的成功使社区更有信心推出 OpenWrt Two / Pro 系列产品。

结语

OpenWrt One 不只是一台路由器,它是一个开放的边缘计算终端:从 ARM 可信启动链,到 musl + procd + netifd 的精简服务栈,再到 UCI/ubus 暴露的丰富 API,整套架构在 256MB NAND 上硬生生跑出了现代 Linux 发行版的骨架。理解其每一层的设计取舍,等于掌握了嵌入式 Linux 工程化的样本教材。对于开发者而言,这是一次从"用 Linux"升级到"造 Linux"的难得好机会。