OpenWrt Build Notes

ZN-M2 编译固件大概流程

这是一份偏实操方向的静态说明页,适合拿来做自用导航或发布到 GitHub Pages。 内容覆盖环境准备、源码选择、菜单配置、编译输出、刷写前检查与常见排错思路。

项目概览

ZN-M2 这类设备在自编译场景下,核心目标通常不是“功能全塞满”,而是先确定硬件条件、目标用途和可接受的风险,再做精简构建。 真正影响最终体验的,往往是 目标架构是否选对驱动是否保留软件包是否过多 以及 刷机方式是否安全

适合先明确的事项

芯片平台、Flash / RAM 容量、是否扩容、当前 Bootloader 状态、原厂分区方式。

常见目标

做主路由、旁路由、轻量代理、ZeroTier 节点、多 WAN、纯转发或测试固件。

建议思路

先做最小可启动版本,再逐步增加功能,而不是一开始就堆满插件。

先求能启动 再做功能叠加 驱动优先于插件 保留回退路径

准备工作

在正式编译前,先把下面这些信息和条件准备好:

确认设备信息:SoC 平台、Flash 大小、内存大小、是否已升级到 1G、是否保留无线与 USB。
准备编译环境:建议使用一台 Linux 主机或虚拟机,磁盘空间和网络环境要稳定。
规划功能范围:例如只保留 ZeroTier、多 WAN,或再加入 SSR / Passwall / OpenClash 等扩展。
明确刷机路径:是通过后台升级、Breed / U-Boot、还是救援模式写入。
保留回退方案:至少保留一份已知可用固件和现有配置备份。
提示:如果你明确不需要 USB 和 Wi-Fi 驱动,可以在配置阶段做较大幅度精简,这通常有助于控制体积并降低后续出错概率。

源码与分支

编译前先决定你打算基于哪一套源码:官方 OpenWrt、第三方发行版、还是你自己维护的 fork。 选择时优先考虑 机型支持是否成熟补丁是否持续维护插件生态是否与你目标一致

官方源码

结构稳定、文档多、长期维护更清晰,但某些插件需要自行补充源或补丁。

第三方整合版

常见功能比较齐全,上手更快,但需要额外关注补丁质量和升级兼容性。

自维护分支

适合长期使用与反复迭代,成本是你自己要管理 feeds、补丁和回归测试。

# 典型思路(示意)
git clone <源码仓库>
cd <源码目录>
./scripts/feeds update -a
./scripts/feeds install -a

编译流程

下面这条主线,基本就是 ZN-M2 自编译时最常见的工作顺序:

01

准备 Linux 编译环境

确保系统依赖、磁盘空间、网络拉源速度和终端工具都没问题。第一次编译时最容易卡在环境不完整或依赖缺失。

02

拉取源码并同步 feeds

把主仓库和软件包源同步到本地,必要时再手动加入额外插件源或私有补丁。

03

选择目标平台与机型

在配置菜单中选对架构和设备型号,这是后续能否正常启动的基础。目标机型如果选错,后面的优化几乎都没有意义。

04

精简或增加内核 / 驱动 / 软件包

保留必要网络与存储驱动,按用途添加 LuCI、ZeroTier、多 WAN、代理类组件等。非必须的模块尽量先不加。

05

开始编译

第一次构建建议先完整编译一次,确认 toolchain 和 target 都能过,再做增量调整。

make menuconfig
make -j$(nproc) V=s
06

检查输出文件

确认生成的是你需要的镜像类型,例如 sysupgrade、factory 或 initramfs,并区分清楚刷入场景。

07

小步试刷

优先验证最小版能否稳定启动、联网和进入后台;功能固件建议在通过基础测试后再刷正式版本。

插件取舍建议

如果你的目标是 ZN-M2 精简固件,插件选择最好围绕用途来做,而不是看到什么都装。下面是一个偏实用的分层思路。

优先保留

LuCI、SSH、基础网络工具、日志、时区、DNS 与 DHCP 相关组件。

按需求加入

ZeroTier、多 WAN、VPN、流量监控、计划任务、磁盘工具。

谨慎叠加

SSR / Passwall / OpenClash 同时堆叠时,依赖与体积会明显增加,建议分版本测试。

可精简项

不需要的无线驱动、USB 驱动、打印支持、文件系统工具、蓝牙与调试包。

经验向建议:代理类功能最好拆分测试。先做“纯路由 + LuCI + ZeroTier”版本,通过后再继续增加多 WAN 或代理相关组件。

刷写前检查

真正容易出事故的地方,往往不是编译,而是刷写前这一步没有核对清楚。

1
镜像类型是否正确:factory、sysupgrade、initramfs 不能混着理解。
2
设备型号是否匹配:同系列不同板本或不同闪存布局,镜像可能并不通用。
3
当前引导方式是否兼容:后台升级、Breed、U-Boot、TFTP 的要求不一样。
4
是否保留回退入口:串口、救援模式、旧固件、配置备份至少要占一个。
5
首次刷写先做最小版本:这样出问题时更容易判断是镜像本身还是附加软件包引起的。
注意:不清楚分区布局、Bootloader 行为或镜像刷入要求时,不要直接尝试高风险覆盖写入。先确认回退条件,再动手。

常见排错方向

编译中断

优先看依赖缺失、源拉取失败、补丁冲突、磁盘空间不足与线程数过高。

镜像过大

先砍代理类组件、语言包、无线 / USB 驱动、文件系统扩展与调试工具。

启动异常

回头检查机型、内核、分区适配、引导方式、设备树与关键驱动是否正确。

功能缺失

重点看 feeds 是否安装完整、依赖包是否漏选、内核模块是否与用户态组件匹配。

# 常见清理与重编译思路(示意)
make defconfig
make clean
make -j$(nproc) V=s

# 如需更彻底清理,再按需使用更高级别的清理方式

FAQ

Q1

第一次编译就要把所有插件都加上吗?

不建议。先做最小可启动版本,再逐项增加功能,更容易定位问题。

Q2

已经升级到 1G 内存,是不是就可以随便堆功能?

也不建议。内存只是其中一个条件,Flash 容量、驱动兼容、CPU 性能和运行稳定性同样关键。

Q3

不需要 USB 和 Wi-Fi,可以直接删除相关内容吗?

可以按需精简,但最好在确认启动链和网络基础功能正常后,再做较大幅度裁剪。

Q4

ZeroTier、多 WAN、Passwall、OpenClash 能一起放吗?

理论上可以,但建议分阶段叠加。越多功能堆在一起,依赖冲突与定位成本就越高。