7006 字
35 分钟
OpenWrt One 固件编译完全指南 - 从源码到刷机

1. OpenWrt One 硬件概览#

OpenWrt One 是 OpenWrt 社区与 Banana Pi 合作推出的首款官方路由器,由社区主导设计、主线内核直接支持。它不是一个”能刷 OpenWrt 的第三方设备”,而是 OpenWrt 自己的硬件。

1.1 硬件规格#

参数规格
SoCMediaTek MT7981B (Filogic 820),双核 ARM Cortex-A53 @ 1.3GHz
WiFiMT7976C 双频 WiFi 6 (3×3 / 2×2)
内存1GB DDR4
存储256MB SPI NAND + 16MB SPI NOR(双启动,防砖)
网口1× 2.5GbE WAN (支持 PoE) + 1× 1GbE LAN
扩展M.2 NVMe (PCIe 2.0 x1)、USB 2.0 Type-A、mikroBUS
调试USB Type-C 串口、JTAG 接口
其他RTC 实时时钟(带电池座)、机械电源开关、LED 指示灯

1.2 为什么选 OpenWrt One 作为编译目标#

  • 主线内核原生支持:不需要第三方 patch,target: mediatek/filogicprofile: openwrt_one 直接可用。
  • 双启动设计:NOR + NAND 两颗 Flash,刷不死。NOR 是永久的救砖保障。
  • 社区背景:每台设备销售收入的一部分支持 OpenWrt 社区发展。
  • 扩展性好:M.2 NVMe 插槽可装 SSD,mikroBUS 可接传感器/执行器模块。

1.3 编译目标与产物#

参数
Target SystemMediaTek Ralink ARM
SubtargetFilogic 8x0 (MT798x)
Target ProfileOpenWrt One
内核Linux 6.6.x (24.10 LTS) / 6.12.x (25.12 最新)

编译产物位于 bin/targets/mediatek/filogic/,关键文件:

文件用途
*-squashfs-sysupgrade.itb系统升级包,通过 LuCI 或 sysupgrade 命令刷写
*-snand-preloader.binNAND BL2 bootloader,用于 USB 恢复刷写
*-factory.ubi工厂 UBI 镜像,用于全新 NAND 烧录
*-snor-preloader.binNOR BL2 bootloader
*-initramfs.itb内存运行镜像,调试用

2. 编译方式选择#

OpenWrt 固件编译有四种主流方式:

方式适用场景耗时门槛自由度可复现性
ImageBuilder只需选包、加自定义文件5-10 分钟
GitHub Actions完整编译,无本地 Linux 环境1-2 小时高(工作流即配置)
Docker 容器化环境隔离、CI/CD 集成1-2 小时最高(镜像锁定)
本地完整编译改内核、打 patch、深度定制1-3 小时最高低(依赖宿主机环境)

版本选择说明:本文默认使用 OpenWrt 25.12.3(2026-05-07 发布,内核 6.12.85)。注意:25.12.3 已不是最新版本。 25.12 系列最新为 25.12.4(2026-05-14 发布,内核 6.12.87),这是一个纯安全修复版本——无功能变更、无 breaking change,仅修复 dnsmasq 6 个 CVE 及 “Dirty Frag” 内核提权漏洞(CVE-2026-43284)。与 25.12.3 完全兼容,升级零风险、零适配成本。如果你的设备运行 25.12.3,没有理由不升级。下文所有 25.12.3 可直接替换为 25.12.4。24.10 系列(内核 6.6.x)仍提供安全更新至 2026 年 9 月,保守用户可将下文所有 25.12.3 替换为 24.10.6。25.12 的关键变化:包管理器从 opkg 切换为 apk(Alpine Package Keeper)。下文已针对此变化更新所有命令。

推荐路径:

新手、只选包加配置 → ImageBuilder
新手、需完整编译 → GitHub Actions
追求可复现、团队协作 → Docker
改内核/深度定制 → 本地完整编译

关于 SDK: 如果只需要编译单个 .ipk 包而不重新编译整个固件,可使用 OpenWrt SDK。SDK 包含预编译的工具链和目标库,适合独立开发、调试某个软件包:

Terminal window
wget https://downloads.openwrt.org/releases/25.12.3/targets/mediatek/filogic/openwrt-sdk-25.12.3-mediatek-filogic.Linux-x86_64.tar.zst
tar -xf openwrt-sdk-*.tar.zst
cd openwrt-sdk-*/
./scripts/feeds update packages
make defconfig
./scripts/feeds install <package-name>
make package/<package-name>/{clean,compile} -j$(nproc)

3. 通用加速技巧#

无论使用哪种本地编译方式,以下技巧都能显著加速——尤其对国内用户。

3.1 配置国内镜像源#

国内用户直接访问 OpenWrt 官方源和 GitHub 速度极慢甚至超时。

git clone 加速: OpenWrt 主仓库托管在 GitHub(github.com/openwrt/openwrt),国内可直接访问。如果速度不理想:

Terminal window
# 浅克隆(仅最新提交,节省时间和空间)
git clone --depth 1 https://github.com/openwrt/openwrt.git
# 若仍很慢,使用 mirror.ghproxy.com 加速
git clone --depth 1 https://mirror.ghproxy.com/https://github.com/openwrt/openwrt.git

--depth 1 只下载最新一次提交,将仓库大小从 ~500MB 降至 ~200MB,克隆速度大幅提升。需要完整历史时用 git fetch --unshallow

feeds 更新加速: 编辑 feeds.conf.default,将 https://git.openwrt.org/ 替换为清华镜像(编译用,25.12 和 24.10 通用):

# 将每行中的
https://git.openwrt.org/
# 替换为
https://mirrors.tuna.tsinghua.edu.cn/openwrt/

注意:此配置影响编译时的 feeds 下载。刷入固件后,设备上的软件源配置文件在 25.12 为 /etc/apk/repositories.d/distfeeds.list(24.10 为 /etc/opkg/distfeeds.conf),同样可替换为镜像加速。

源码包下载加速:

Terminal window
# 环境变量方式(推荐,无需改源码文件)
export DOWNLOAD_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/openwrt"
make -j$(nproc) download V=s

其他可用镜像:

镜像站地址
清华https://mirrors.tuna.tsinghua.edu.cn/openwrt
中科大https://mirrors.ustc.edu.cn/openwrt
阿里云https://mirrors.aliyun.com/openwrt

3.2 预下载所有源码包(make download)#

编译前先将所有源码包下载到 dl/ 目录,避免编译中途因网络问题中断:

Terminal window
make -j$(nproc) download V=s
# 检查下载状态(0 = 全部成功)
echo $?
# 部分失败则重试
make -j$(nproc) download V=s

dl/ 目录可以跨机器复用:从一台编译成功的机器复制到另一台,跳过下载步骤直接编译。


4. 方式一:ImageBuilder(最推荐)#

ImageBuilder 使用预编译的 .ipk 包组装固件,不需要编译任何源码。几分钟出一个镜像。

4.1 下载与解压#

Terminal window
wget https://downloads.openwrt.org/releases/25.12.3/targets/mediatek/filogic/openwrt-imagebuilder-25.12.3-mediatek-filogic.Linux-x86_64.tar.zst
tar -xf openwrt-imagebuilder-*.tar.zst
cd openwrt-imagebuilder-*/

4.2 构建自定义固件#

Terminal window
make image \
PROFILE="openwrt_one" \
PACKAGES="luci luci-i18n-base-zh-cn luci-ssl-openssl \
wpad-openssl wireguard-tools luci-proto-wireguard \
luci-theme-material luci-app-attendedsysupgrade \ <!-- attendedsysupgrade 自 25.12 起默认内置,显式列出非必需但不报错 -->
-wpad-basic-mbedtls -libustream-mbedtls -libmbedtls" \
FILES="../my-files"

PACKAGES 中 - 前缀表示移除该包(例如用 wpad-openssl 替换默认的 wpad-basic-mbedtls)。

关于主题包luci-theme-material 是官方仓库自带的主题。如需使用流行的 Argon 主题(luci-theme-argon),它是 jerrykuku 的第三方包,不在官方源中。使用前需将其 feed 加入 feeds.conf.default(完整编译)或手动下载 .apk 放入 ImageBuilder 的 packages/ 目录。

4.3 添加自定义软件源#

ImageBuilder 自带 packages/ 目录,任何放入其中的 .ipk / .apk 文件会在 make image 时自动索引并使用(优先级高于远程源):

Terminal window
# 将自定义包放入 packages/ 目录
cp ~/my-custom-package_1.0-1_aarch64_cortex-a53.apk packages/
# 正常编译,PACKAGES 中引用包名即可
make image \
PROFILE="openwrt_one" \
PACKAGES="luci my-custom-package"

ImageBuilder 的 make image 不支持 -p 参数。官方支持的参数为 PROFILEPACKAGESFILESBIN_DIREXTRA_IMAGE_NAMEDISABLED_SERVICESADD_LOCAL_KEYROOTFS_PARTSIZE(可通过 make help 查看完整列表)。

也可以使用额外的远程 feeds:

Terminal window
# 方式一:传递自定义 repositories.conf
make image PROFILE="openwrt_one" PACKAGES="luci custom-app" \
REPOSITORIES="../my-repositories.conf"
# 方式二:直接修改 ImageBuilder 自带的 repositories.conf
echo "src/gz custom_feed https://example.com/packages/mediatek/filogic" >> repositories.conf

4.4 使用 files/ 目录预置配置文件#

创建 my-files/ 目录,放入需要预置的文件,目录结构镜像目标系统的根文件系统:

my-files/
└── etc/
├── config/
│ ├── network # 网络配置
│ ├── wireless # 无线配置
│ └── system # 系统配置
├── uci-defaults/
│ └── 99-custom-init.sh # 首次启动自动执行的初始化脚本
└── dropbear/
└── authorized_keys # 预置 SSH 公钥

示例 my-files/etc/config/network — 修改默认 LAN IP:

config interface 'lan'
option device 'lan'
option proto 'static'
option ipaddr '192.168.10.1'
option netmask '255.255.255.0'

示例 my-files/etc/config/system — 预置时区和主机名:

config system
option hostname 'OpenWrt-One'
option timezone 'CST-8'
option zonename 'Asia/Shanghai'

4.5 生成带 default-settings 的固件#

“default-settings” 是一种将自定义配置打包为 .ipk 的做法,比 files/ 目录更规范、可版本化管理:

Step 1 — 创建 default-settings 包结构:

default-settings/
├── Makefile
└── files/
└── etc/
├── config/
│ ├── network
│ ├── wireless
│ └── system
└── uci-defaults/
└── 99-default-settings.sh

Step 2 — 编写 Makefile:

注意:Makefile 的缩进必须使用 Tab 字符(不能是空格)。直接从网页复制可能导致缩进变成空格,编译时报 *** missing separator. Stop. 错误。建议复制后在编辑器中确认缩进为 Tab。

include $(TOPDIR)/rules.mk
PKG_NAME:=default-settings
PKG_VERSION:=1.0
PKG_RELEASE:=1
PKG_ARCH:=all
include $(INCLUDE_DIR)/package.mk
define Package/default-settings
SECTION:=base
CATEGORY:=Base system
TITLE:=Default custom settings
endef
define Package/default-settings/install
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DATA) ./files/etc/config/network $(1)/etc/config/
$(INSTALL_DATA) ./files/etc/config/wireless $(1)/etc/config/
$(INSTALL_DATA) ./files/etc/config/system $(1)/etc/config/
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/etc/uci-defaults/99-default-settings.sh $(1)/etc/uci-defaults/
endef
$(eval $(call BuildPackage,default-settings))

Step 3 — 放入 ImageBuilder 的 packages 目录并编译:

Terminal window
mkdir -p packages
cp -r ../default-settings packages/
make image PROFILE="openwrt_one" PACKAGES="luci default-settings"

4.6 ImageBuilder 产物#

openwrt-25.12.3-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb
openwrt-25.12.3-mediatek-filogic-openwrt_one-snand-preloader.bin
openwrt-25.12.3-mediatek-filogic-openwrt_one-factory.ubi

5. 方式二:GitHub Actions 云编译#

不需要自己的 Linux 机器,利用 GitHub 提供的免费计算资源编译固件。

5.1 社区维护的编译仓库#

仓库特点
danshui-git/build-actions最全面的中文云编译仓库,支持多种源码(官方/Lean/ImmortalWrt)。2026 年维护状态待确认,如失效可改用下方的 281677160/build-actions
281677160/build-actions纯净版本,无修改,适合只用官方功能的用户

5.2 使用步骤(以 build-actions 为例)#

Step 1 — Fork 仓库: 在 GitHub 上 fork danshui-git/build-actions

Step 2 — 修改配置文件: 编辑仓库中的 .config 文件,设置:

CONFIG_TARGET_mediatek=y
CONFIG_TARGET_mediatek_filogic=y
CONFIG_TARGET_mediatek_filogic_DEVICE_openwrt_one=y

Step 3 — 自定义插件(可选): 编辑 diy-part.sh,添加额外包:

Terminal window
echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git" >> feeds.conf.default

Step 4 — 触发编译: GitHub Actions → Build OpenWrt → Run workflow。

Step 5 — 下载产物: 编译完成后在 Actions 页面的 Artifacts 中下载。

5.3 常见问题#

  • 编译失败:先去掉缓存(Actions 页面选择 “Discard cache”)重新编译。
  • passwall/ssr-plus 编译失败:这些插件更新快,旧分支可能不兼容,使用最新 commit。
  • 下载慢/失败:在 diy-part.sh 中设置国内镜像源加速 dl 文件下载。

5.4 自定义 GitHub Actions 工作流#

name: Build OpenWrt One Firmware
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-setuptools rsync unzip zlib1g-dev file wget device-tree-compiler
- name: Clone OpenWrt
run: |
git clone https://github.com/openwrt/openwrt.git -b v25.12.3
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
- name: Configure
run: |
cd openwrt
cat > .config << 'EOF'
CONFIG_TARGET_mediatek=y
CONFIG_TARGET_mediatek_filogic=y
CONFIG_TARGET_mediatek_filogic_DEVICE_openwrt_one=y
CONFIG_PACKAGE_luci=y
EOF
make defconfig
- name: Build
run: cd openwrt && make -j$(nproc) download V=s && make -j$(nproc) V=s
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: openwrt-one-firmware
path: openwrt/bin/targets/mediatek/filogic/

6. 方式三:Docker 容器化编译#

Docker 方式确保编译环境完全一致,可复现,特别适合 CI/CD 流水线和团队协作。

6.1 使用官方 Docker 镜像#

OpenWrt 官方提供了预构建的 Docker 镜像,已包含完整的 SDK 或 ImageBuilder:

Terminal window
# SDK(用于编译单个或一组 .ipk 包)
docker run --rm -v "$(pwd)"/bin/:/builder/bin -it \
ghcr.io/openwrt/sdk:mediatek-filogic-25.12.3
# 进入容器后
./scripts/feeds update packages
make defconfig
./scripts/feeds install <package-name>
make package/<package-name>/{clean,compile} -j$(nproc)
Terminal window
# ImageBuilder(用于组装完整固件)
docker run --rm -v "$(pwd)"/bin/:/builder/bin -it \
ghcr.io/openwrt/imagebuilder:mediatek-filogic-25.12.3
# 进入容器后
make image PROFILE="openwrt_one" PACKAGES="luci wireguard-tools"

-v "$(pwd)"/bin/:/builder/bin 将产物目录挂载到宿主机,退出容器后产物保留。

6.2 使用社区 Docker 工具#

routerFW 是一个跨平台(Windows/Linux)的 Docker 化 OpenWrt 构建工具,提供:

  • 配置持久化(编译间保留 .config
  • kmod vermagic 自动修复(解决内核模块版本不匹配问题)
  • 增量编译支持

6.3 自建编译 Dockerfile#

FROM ubuntu:24.04
RUN apt update && apt install -y --no-install-recommends \
build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3 python3-setuptools rsync unzip zlib1g-dev file wget \
device-tree-compiler cpio curl squashfs-tools libelf-dev ccache && \
apt clean && rm -rf /var/lib/apt/lists/*
WORKDIR /openwrt
CMD ["/bin/bash"]

构建与运行:

Terminal window
docker build -t openwrt-builder .
docker run --rm -v "$(pwd)"/openwrt:/openwrt -v "$(pwd)"/dl:/openwrt/dl -it openwrt-builder

7. 本地完整编译#

需要最大自由度(修改内核配置、打 patch、调试编译错误)时使用。

7.1 环境要求#

  • 操作系统:Ubuntu 22.04+ 或 Debian 12+(推荐),也支持 Fedora、Arch Linux
  • 内存:至少 8GB,推荐 16GB+
  • 磁盘:至少 30-50GB 可用空间(使用 df -h 检查),推荐 NVMe SSD
  • CPU:核心数越多编译越快
  • 网络:需要稳定访问 GitHub 和 OpenWrt 下载服务器(国内需配置镜像,见第 3 章)

7.2 安装必需依赖#

Terminal window
sudo apt update && sudo apt full-upgrade -y
# 基础依赖(所有编译方式都需要)
sudo apt install -y build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3 python3-setuptools rsync unzip zlib1g-dev file wget
# 扩展依赖(完整源码编译额外需要)
sudo apt install -y python3-pyelftools swig device-tree-compiler \
cpio curl squashfs-tools libelf-dev cmake ninja-build ccache

各包用途说明:

包名用途
build-essentialGCC、make 等基础编译工具链
libncurses-devmake menuconfig 的终端图形界面
gawk编译脚本中的文本处理
git源码与 feeds 版本管理
file, unzip, wget源码包下载与解压
python3, python3-setuptools编译脚本和某些包的构建依赖
rsync固件打包时的文件同步
device-tree-compiler设备树编译(ARM 平台必需)
libelf-dev内核模块编译依赖,缺失会报 “Cannot find libelf”
ccache编译缓存,加速重复编译 50-70%

7.3 不要使用 root 用户编译#

OpenWrt 编译系统禁止以 root 用户运行。用普通用户执行所有编译命令:

Terminal window
whoami # 应显示你的用户名,不是 root
# 如果用 root 登录,先创建普通用户并切换
# adduser builder && su - builder

以 root 编译会导致权限混乱,部分构建脚本也会直接拒绝执行并报错。

7.4 克隆源码#

Terminal window
git clone https://github.com/openwrt/openwrt.git
cd openwrt
git checkout v25.12.3 # 锁定稳定版本,不要用 main 分支

版本选择:稳定版(tag)用于生产环境;main 分支用于开发和测试。25.12.3 是当前最新稳定版(2026-05-07)。需要长期稳定支持可选 24.10.6(安全更新至 2026 年 9 月)。

7.5 更新 Feeds#

Feeds 是 OpenWrt 的包管理机制,包含 LuCI、第三方软件包等:

Terminal window
./scripts/feeds update -a
./scripts/feeds install -a

如需添加第三方 feed,编辑 feeds.conf.default

src-git custom_packages https://github.com/xxx/custom-packages.git

7.6 配置编译选项#

Terminal window
make menuconfig

make menuconfig 关键配置路径(逐级进入):

Target System → MediaTek Ralink ARM
Subtarget → Filogic 8x0 (MT798x)
Target Profile → OpenWrt One
# 推荐勾选的包
LuCI → Collections → <*> luci # Web 管理界面
LuCI → Modules → <*> luci-i18n-base-zh-cn # 中文语言包
LuCI → Themes → <*> luci-theme-material # 官方主题(可选)。luci-theme-argon 是 jerrykuku 的第三方热门主题,需先添加其 feed 才能使用
Network → <*> wpad-openssl # WPA3/OWE 支持
Network → VPN → <*> wireguard-tools # VPN
Network → VPN → <*> luci-proto-wireguard # WireGuard LuCI 界面
Utilities → <*> ccache # 编译缓存加速

menuconfig 操作说明:

按键作用
y编译进固件(显示为 <*>
m编译为可安装模块(显示为 <M>
n取消/排除(显示为 < >
Space在三态间循环切换
/搜索包名或配置项
?显示当前选项帮助
Esc / Tab在菜单和按钮之间切换焦点

Global build settings 建议:

[*] Cryptographically sign package lists
[*] Compile packages with ccache (Experimental)

7.7 固件体积优化#

默认勾选会包含许多不必要的包,导致固件膨胀。以下包通常可以安全移除:

移除项原因
luci-app-commands命令行执行器,一般用不到
luci-theme-bootstrap默认主题,已有 material 后多余
kmod-usb-net-*不用的 USB 网卡驱动
kmod-usb-storage不需要 U 盘存储功能时
ppp / pppoe不需要拨号时
ip6tables + 相关纯 IPv4 环境

在 menuconfig 中定位到对应项后按 n 排除,按 / 搜索包名。

7.8 下载与编译#

Terminal window
# 两步走:先下载所有源码包,再编译
make -j$(nproc) download V=s
make -j$(nproc) V=s

首次编译强烈建议使用 make -j1 V=s 单线程执行。 并行编译(-j$(nproc))可能因包间依赖的竞态条件导致构建失败,单线程编译能确保错误信息清晰可读。首次成功后,后续增量编译再使用 -j$(nproc) 加速。

磁盘空间警告:完整编译需要 30-50GB 可用空间。编译前用 df -h . 确认。空间不足会在中途失败。如空间紧张,可设置 CONFIG_TARGET_ROOTFS_PARTSIZE 限制固件大小,或清理 build_dir/ 中的中间文件。

make 参数说明:

参数含义
-j1单线程编译(首次推荐,方便定位错误)
-j$(nproc)使用所有 CPU 核心并行编译
V=s显示详细编译日志(调试用)
V=sc显示详细日志 + 彩色输出
V=99只显示错误信息

多固件并行编译注意: 如果同时编译多个 target(如 filogic + x86),每个 make 实例都会产生大量磁盘 I/O。机械硬盘会严重瓶颈,建议使用 NVMe SSD,或用 ionice -c 3 make ... 降低 I/O 优先级。

7.9 增量编译与清理#

重要:每次通过 make menuconfig 修改 .config(新增或删除包)后,必须运行 make defconfig 同步包依赖关系,否则编译可能因依赖缺失而失败。

修改配置后重新编译时的常用命令:

Terminal window
# 修改 .config 后同步依赖(新增/删除包后必须执行)
make defconfig
# 仅清理某个包的编译产物(调试单个包时常用)
make package/<name>/clean
make package/<name>/compile -j$(nproc)
# 仅清理内核(调试内核配置时)
make target/linux/clean
# dirclean:清理所有包的编译产物,保留 .config 和 dl/
make dirclean
# clean:清理所有中间文件,保留 .config、dl/ 和 feeds/
make clean
# distclean:恢复为初始状态(删除 .config 和所有中间文件)
make distclean

常用清理流程:

Terminal window
# 轻度问题(某个包编译报错)
make package/<name>/clean && make package/<name>/compile -j$(nproc)
# 中度问题(切换 target 或大量改包)
make dirclean && make -j$(nproc) V=s
# 重度问题(彻底重来,保留 dl/ 加速)
make distclean
# 然后重新 ./scripts/feeds update -a && ./scripts/feeds install -a && make menuconfig

7.10 使用 ccache 加速重复编译#

Terminal window
sudo apt install ccache
export CCACHE_DIR="$HOME/.ccache-openwrt"
ccache -M 20G
# 在 menuconfig 中启用: Global build settings → Compile packages with ccache

首次编译无加速效果,第二次起可减少 50-70% 编译时间。


8. 刷写与升级#

8.1 刷机前备份(必须执行)#

刷机前备份原厂固件是强制性安全步骤,尤其是无线校准数据(factory/art 分区),一旦丢失会导致 WiFi 性能严重下降甚至无法使用。

备份所有 mtd 分区:

Terminal window
# SSH 登录到设备
ssh root@192.168.1.1
# 查看 mtd 分区表
cat /proc/mtd
# 逐一备份所有分区
for part in $(awk '{print $1}' /proc/mtd | tr -d ':'); do
dd if=/dev/$part of=/tmp/backup-$part.bin
done
# 重点备份无线校准分区(名称可能为 factory、art 或 radio)
# 确认分区名后单独备份
dd if=/dev/mtdblockX of=/tmp/backup-factory.bin

关键风险:无线校准数据(factory/art 分区)存储了每个设备独有的 WiFi 射频校准参数,出厂时写入,不可恢复。丢失后 WiFi 可能信号极弱、速率骤降或完全无法开启。务必在首次刷机前备份此分区。

备份 U-Boot 环境变量(如适用):

Terminal window
apk update && apk add uboot-envtools
fw_printenv > /tmp/backup-uboot-env.txt

将备份传输到安全位置:

Terminal window
scp root@192.168.1.1:/tmp/backup-* ./

8.2 首次刷写(全新安装)#

适用于从原厂固件或空白 NAND 首次安装 OpenWrt。

准备 FAT32 格式 U 盘,放入以下文件:

  • openwrt-*-openwrt_one-snand-preloader.bin
  • openwrt-*-openwrt_one-factory.ubi

操作步骤:

  1. 关机,拨动开关到 NAND 模式
  2. 插入 U 盘
  3. 按住 Reset 按钮不放
  4. 通电开机,等待 LED 变化
  5. LED 熄灭后松开 Reset,等待 LED 变绿
  6. 完成,设备已启动进入 OpenWrt

8.3 常规升级#

通过 LuCI Web 界面:

  1. 浏览器访问 LuCI(默认 192.168.1.1
  2. System → Backup / Flash Firmware
  3. Flash image → 选择 *squashfs-sysupgrade.itb 文件
  4. 勾选 “Keep settings” 保留当前配置(仅限同版本升级)
  5. 点击 Flash image,等待自动重启

通过命令行:

Terminal window
# 上传固件
scp openwrt-*-squashfs-sysupgrade.itb root@192.168.1.1:/tmp/
# 不保留配置升级(跨版本推荐)
sysupgrade -v /tmp/openwrt-*-squashfs-sysupgrade.itb
# 保留配置升级(同版本)
sysupgrade -v -k /tmp/openwrt-*-squashfs-sysupgrade.itb

8.4 恢复模式#

OpenWrt One 内置恢复 Web 界面:

  1. 关机
  2. 拨到 NAND 模式
  3. 按住 USR 按钮(前面板按钮)
  4. 通电,持续按住 5 秒
  5. 用网线连接电脑到 LAN 口,浏览器访问 192.168.1.1
  6. 上传固件进行恢复

9. 进阶技巧#

9.1 超频 BL2 编译(1.3GHz → 1.6GHz)#

MT7981B 默认主频 1.3GHz,可以通过修改 BL2(ARM Trusted Firmware)的 PLL 初始化参数超频至 1.6GHz。1.6GHz 经社区广泛验证稳定可用,Coremark 分数约提升 23%。

修改 package/boot/arm-trusted-firmware-mediatek 中的 PLL 初始化代码:

1.3GHz
// plat/mediatek/mt7981/drivers/pll/pll.c → mtk_pll_init()
mmio_write_32(ARMPLL_CON1, 0x82000000);
// 超频:1.6GHz(推荐)
mmio_write_32(ARMPLL_CON1, 0x50000000);
// 修改分频比:清零 bit 4-6 → 1 分频
mmio_clrbits_32(ARMPLL_CON0, 0x70);
mmio_setbits_32(ARMPLL_CON0, 0x104);
频率CON1 值Coremark稳定性
1.3GHz(默认)0x82~4400稳定
1.6GHz0x50~5400推荐
1.7GHz0x55~5750基本稳定
1.76GHz+--高负载重启

警告:刷写 BL2 有变砖风险。务必先完成 8.1 节的备份步骤,并确认 NOR 恢复流程可用再操作。

9.2 使用 patch 目录自动打补丁#

手动修改源码后 make clean 会丢失改动。正确做法是使用 OpenWrt 的 patch 机制,make clean 后自动重新应用。

为特定包添加 patch:

Terminal window
# 先进行一次完整编译
make package/boot/arm-trusted-firmware-mediatek/compile V=s
# 进入该包的源码目录,做出修改
cd build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-*/
# ... 修改文件 ...
# 生成 patch 文件并放入 package 的 patches 目录
git diff > ../../../../package/boot/arm-trusted-firmware-mediatek/patches/001-my-changes.patch

之后每次 make clean 后再编译,构建系统会自动应用 patches/ 下的 .patch 文件。

为内核打 patch:

Terminal window
# 内核 patch 目录(24.10 用 patches-6.6/,25.12 用 patches-6.12/)
target/linux/mediatek/patches-6.12/

.patch 文件放入对应内核版本的目录中即可自动应用。

9.3 使用 files/ 目录覆盖配置文件#

在源码根目录创建 files/ 目录,其内容会在固件打包时覆盖到目标根文件系统:

files/
└── etc/
├── config/
│ ├── network
│ ├── wireless
│ ├── system
│ ├── dhcp
│ └── firewall
├── uci-defaults/
│ └── 99-custom-init.sh
├── dropbear/
│ └── authorized_keys
└── rc.local

OpenWrt 构建系统会自动检测 files/ 目录并将其内容打包进固件,无需额外配置。

9.4 uci-defaults 脚本实战#

uci-defaults 脚本在固件首次启动时以字母序自动执行,执行完毕后自我删除。以下是完整示例 files/etc/uci-defaults/99-custom-init.sh

#!/bin/sh
set -e
# === 基础系统设置 ===
uci set system.@system[0].hostname='OpenWrt-One'
uci set system.@system[0].timezone='CST-8'
uci set system.@system[0].zonename='Asia/Shanghai'
# === 网络设置 ===
uci set network.lan.ipaddr='192.168.10.1'
uci set network.lan.netmask='255.255.255.0'
# === WiFi 设置 ===
uci set wireless.radio0.disabled='0'
uci set wireless.radio0.channel='auto'
uci set wireless.radio0.country='CN'
uci set wireless.default_radio0.ssid='OpenWrt-One'
uci set wireless.default_radio0.encryption='psk2+ccmp'
uci set wireless.default_radio0.key='change-me-now'
uci set wireless.default_radio0.maxassoc='32'
# === SSH:禁用密码登录,只用密钥 ===
uci set dropbear.@dropbear[0].PasswordAuth='off'
uci set dropbear.@dropbear[0].RootPasswordAuth='off'
# === 提交所有更改 ===
uci commit
/etc/init.d/network restart
wifi reload
exit 0

确保脚本有执行权限:

Terminal window
chmod +x files/etc/uci-defaults/99-custom-init.sh

9.5 双启动机制与 NOR 救砖#

OpenWrt One 有 16MB SPI NOR + 256MB SPI NAND 两颗 Flash。拨动开关选择启动源:

NOR 启动 → 恢复模式,用于救砖、刷写 NAND
NAND 启动 → 正常使用模式

NOR 恢复流程:

  1. 准备 FAT32 格式 U 盘,放入 snand-preloader.binfactory.ubi
  2. 拨动开关到 NOR 模式
  3. 按住 Reset 按钮不放,通电开机
  4. LED 熄灭后松开按钮
  5. 等待 LED 变绿,刷写完成
  6. 关机,拨回 NAND 模式,正常开机

最佳实践:永远保持 NOR 中有一个可工作的系统。不要在测试新固件时同时覆盖 NOR 和 NAND。

9.6 全分区刷写(NOR + NAND 完整重建)#

适用于系统严重损坏或需要完全重建的场景。此过程覆盖所有分区,包括 bootloader。

前置条件: 安装 mtk_uartboot 工具,准备 TFTP 服务器(本机 tftpd-hpa 即可)。

步骤 1 — NOR 阶段(通过 USB 串口写入 BL2 + U-Boot):

Terminal window
# 通过 Type-C 串口连接,使用 mtk_uartboot 写入 NOR bootloader
# 文件名从编译产物 bin/targets/mediatek/filogic/ 中获取
# -p: 指定 RAM BL2 payload(DDR4 初始化)
# -f: 指定 FIP 镜像(BL31 + U-Boot)
mtk_uartboot -s /dev/ttyUSB0 --aarch64 \
-p mt7981-ram-ddr4-bl2.bin \
-f openwrt-mediatek-filogic-openwrt_one-nor-bl31-uboot.fip
OpenWrt One 固件编译完全指南 - 从源码到刷机
https://blog.syomega.top/posts/openwrt-one-firmware-compile-guide/
作者
酱w
发布于
2026-05-16
许可协议
CC BY-NC-SA 4.0