1. OpenWrt One 硬件概览
OpenWrt One 是 OpenWrt 社区与 Banana Pi 合作推出的首款官方路由器,由社区主导设计、主线内核直接支持。它不是一个”能刷 OpenWrt 的第三方设备”,而是 OpenWrt 自己的硬件。
1.1 硬件规格
| 参数 | 规格 |
|---|---|
| SoC | MediaTek MT7981B (Filogic 820),双核 ARM Cortex-A53 @ 1.3GHz |
| WiFi | MT7976C 双频 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/filogic,profile: openwrt_one直接可用。 - 双启动设计:NOR + NAND 两颗 Flash,刷不死。NOR 是永久的救砖保障。
- 社区背景:每台设备销售收入的一部分支持 OpenWrt 社区发展。
- 扩展性好:M.2 NVMe 插槽可装 SSD,mikroBUS 可接传感器/执行器模块。
1.3 编译目标与产物
| 参数 | 值 |
|---|---|
| Target System | MediaTek Ralink ARM |
| Subtarget | Filogic 8x0 (MT798x) |
| Target Profile | OpenWrt One |
| 内核 | Linux 6.6.x (24.10 LTS) / 6.12.x (25.12 最新) |
编译产物位于 bin/targets/mediatek/filogic/,关键文件:
| 文件 | 用途 |
|---|---|
*-squashfs-sysupgrade.itb | 系统升级包,通过 LuCI 或 sysupgrade 命令刷写 |
*-snand-preloader.bin | NAND BL2 bootloader,用于 USB 恢复刷写 |
*-factory.ubi | 工厂 UBI 镜像,用于全新 NAND 烧录 |
*-snor-preloader.bin | NOR 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 包含预编译的工具链和目标库,适合独立开发、调试某个软件包:
wget https://downloads.openwrt.org/releases/25.12.3/targets/mediatek/filogic/openwrt-sdk-25.12.3-mediatek-filogic.Linux-x86_64.tar.zsttar -xf openwrt-sdk-*.tar.zstcd openwrt-sdk-*/./scripts/feeds update packagesmake 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),国内可直接访问。如果速度不理想:
# 浅克隆(仅最新提交,节省时间和空间)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),同样可替换为镜像加速。
源码包下载加速:
# 环境变量方式(推荐,无需改源码文件)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/ 目录,避免编译中途因网络问题中断:
make -j$(nproc) download V=s
# 检查下载状态(0 = 全部成功)echo $?
# 部分失败则重试make -j$(nproc) download V=sdl/ 目录可以跨机器复用:从一台编译成功的机器复制到另一台,跳过下载步骤直接编译。
4. 方式一:ImageBuilder(最推荐)
ImageBuilder 使用预编译的 .ipk 包组装固件,不需要编译任何源码。几分钟出一个镜像。
4.1 下载与解压
wget https://downloads.openwrt.org/releases/25.12.3/targets/mediatek/filogic/openwrt-imagebuilder-25.12.3-mediatek-filogic.Linux-x86_64.tar.zsttar -xf openwrt-imagebuilder-*.tar.zstcd openwrt-imagebuilder-*/4.2 构建自定义固件
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 时自动索引并使用(优先级高于远程源):
# 将自定义包放入 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参数。官方支持的参数为PROFILE、PACKAGES、FILES、BIN_DIR、EXTRA_IMAGE_NAME、DISABLED_SERVICES、ADD_LOCAL_KEY、ROOTFS_PARTSIZE(可通过make help查看完整列表)。
也可以使用额外的远程 feeds:
# 方式一:传递自定义 repositories.confmake image PROFILE="openwrt_one" PACKAGES="luci custom-app" \ REPOSITORIES="../my-repositories.conf"
# 方式二:直接修改 ImageBuilder 自带的 repositories.confecho "src/gz custom_feed https://example.com/packages/mediatek/filogic" >> repositories.conf4.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.shStep 2 — 编写 Makefile:
注意:Makefile 的缩进必须使用 Tab 字符(不能是空格)。直接从网页复制可能导致缩进变成空格,编译时报
*** missing separator. Stop.错误。建议复制后在编辑器中确认缩进为 Tab。
include $(TOPDIR)/rules.mk
PKG_NAME:=default-settingsPKG_VERSION:=1.0PKG_RELEASE:=1PKG_ARCH:=all
include $(INCLUDE_DIR)/package.mk
define Package/default-settings SECTION:=base CATEGORY:=Base system TITLE:=Default custom settingsendef
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 目录并编译:
mkdir -p packagescp -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.itbopenwrt-25.12.3-mediatek-filogic-openwrt_one-snand-preloader.binopenwrt-25.12.3-mediatek-filogic-openwrt_one-factory.ubi5. 方式二: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=yCONFIG_TARGET_mediatek_filogic=yCONFIG_TARGET_mediatek_filogic_DEVICE_openwrt_one=yStep 3 — 自定义插件(可选): 编辑 diy-part.sh,添加额外包:
echo "src-git passwall https://github.com/xiaorouji/openwrt-passwall.git" >> feeds.conf.defaultStep 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 Firmwareon: 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:
# SDK(用于编译单个或一组 .ipk 包)docker run --rm -v "$(pwd)"/bin/:/builder/bin -it \ ghcr.io/openwrt/sdk:mediatek-filogic-25.12.3
# 进入容器后./scripts/feeds update packagesmake defconfig./scripts/feeds install <package-name>make package/<package-name>/{clean,compile} -j$(nproc)# 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 /openwrtCMD ["/bin/bash"]构建与运行:
docker build -t openwrt-builder .docker run --rm -v "$(pwd)"/openwrt:/openwrt -v "$(pwd)"/dl:/openwrt/dl -it openwrt-builder7. 本地完整编译
需要最大自由度(修改内核配置、打 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 安装必需依赖
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-essential | GCC、make 等基础编译工具链 |
libncurses-dev | make 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 用户运行。用普通用户执行所有编译命令:
whoami # 应显示你的用户名,不是 root
# 如果用 root 登录,先创建普通用户并切换# adduser builder && su - builder以 root 编译会导致权限混乱,部分构建脚本也会直接拒绝执行并报错。
7.4 克隆源码
git clone https://github.com/openwrt/openwrt.gitcd openwrtgit checkout v25.12.3 # 锁定稳定版本,不要用 main 分支版本选择:稳定版(tag)用于生产环境;
main分支用于开发和测试。25.12.3 是当前最新稳定版(2026-05-07)。需要长期稳定支持可选 24.10.6(安全更新至 2026 年 9 月)。
7.5 更新 Feeds
Feeds 是 OpenWrt 的包管理机制,包含 LuCI、第三方软件包等:
./scripts/feeds update -a./scripts/feeds install -a如需添加第三方 feed,编辑 feeds.conf.default:
src-git custom_packages https://github.com/xxx/custom-packages.git7.6 配置编译选项
make menuconfigmake menuconfig 关键配置路径(逐级进入):
Target System → MediaTek Ralink ARMSubtarget → 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 # VPNNetwork → 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 下载与编译
# 两步走:先下载所有源码包,再编译make -j$(nproc) download V=smake -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同步包依赖关系,否则编译可能因依赖缺失而失败。
修改配置后重新编译时的常用命令:
# 修改 .config 后同步依赖(新增/删除包后必须执行)make defconfig
# 仅清理某个包的编译产物(调试单个包时常用)make package/<name>/cleanmake package/<name>/compile -j$(nproc)
# 仅清理内核(调试内核配置时)make target/linux/clean
# dirclean:清理所有包的编译产物,保留 .config 和 dl/make dirclean
# clean:清理所有中间文件,保留 .config、dl/ 和 feeds/make clean
# distclean:恢复为初始状态(删除 .config 和所有中间文件)make distclean常用清理流程:
# 轻度问题(某个包编译报错)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 menuconfig7.10 使用 ccache 加速重复编译
sudo apt install ccacheexport 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 分区:
# 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.bindone
# 重点备份无线校准分区(名称可能为 factory、art 或 radio)# 确认分区名后单独备份dd if=/dev/mtdblockX of=/tmp/backup-factory.bin关键风险:无线校准数据(factory/art 分区)存储了每个设备独有的 WiFi 射频校准参数,出厂时写入,不可恢复。丢失后 WiFi 可能信号极弱、速率骤降或完全无法开启。务必在首次刷机前备份此分区。
备份 U-Boot 环境变量(如适用):
apk update && apk add uboot-envtoolsfw_printenv > /tmp/backup-uboot-env.txt将备份传输到安全位置:
scp root@192.168.1.1:/tmp/backup-* ./8.2 首次刷写(全新安装)
适用于从原厂固件或空白 NAND 首次安装 OpenWrt。
准备 FAT32 格式 U 盘,放入以下文件:
openwrt-*-openwrt_one-snand-preloader.binopenwrt-*-openwrt_one-factory.ubi
操作步骤:
- 关机,拨动开关到 NAND 模式
- 插入 U 盘
- 按住 Reset 按钮不放
- 通电开机,等待 LED 变化
- LED 熄灭后松开 Reset,等待 LED 变绿
- 完成,设备已启动进入 OpenWrt
8.3 常规升级
通过 LuCI Web 界面:
- 浏览器访问 LuCI(默认
192.168.1.1) - System → Backup / Flash Firmware
- Flash image → 选择
*squashfs-sysupgrade.itb文件 - 勾选 “Keep settings” 保留当前配置(仅限同版本升级)
- 点击 Flash image,等待自动重启
通过命令行:
# 上传固件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.itb8.4 恢复模式
OpenWrt One 内置恢复 Web 界面:
- 关机
- 拨到 NAND 模式
- 按住 USR 按钮(前面板按钮)
- 通电,持续按住 5 秒
- 用网线连接电脑到 LAN 口,浏览器访问
192.168.1.1 - 上传固件进行恢复
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 初始化代码:
// 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.6GHz | 0x50 | ~5400 | 推荐 |
| 1.7GHz | 0x55 | ~5750 | 基本稳定 |
| 1.76GHz+ | - | - | 高负载重启 |
警告:刷写 BL2 有变砖风险。务必先完成 8.1 节的备份步骤,并确认 NOR 恢复流程可用再操作。
9.2 使用 patch 目录自动打补丁
手动修改源码后 make clean 会丢失改动。正确做法是使用 OpenWrt 的 patch 机制,make clean 后自动重新应用。
为特定包添加 patch:
# 先进行一次完整编译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:
# 内核 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.localOpenWrt 构建系统会自动检测 files/ 目录并将其内容打包进固件,无需额外配置。
9.4 uci-defaults 脚本实战
uci-defaults 脚本在固件首次启动时以字母序自动执行,执行完毕后自我删除。以下是完整示例 files/etc/uci-defaults/99-custom-init.sh:
#!/bin/shset -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 restartwifi reload
exit 0确保脚本有执行权限:
chmod +x files/etc/uci-defaults/99-custom-init.sh9.5 双启动机制与 NOR 救砖
OpenWrt One 有 16MB SPI NOR + 256MB SPI NAND 两颗 Flash。拨动开关选择启动源:
NOR 启动 → 恢复模式,用于救砖、刷写 NANDNAND 启动 → 正常使用模式NOR 恢复流程:
- 准备 FAT32 格式 U 盘,放入
snand-preloader.bin和factory.ubi - 拨动开关到 NOR 模式
- 按住 Reset 按钮不放,通电开机
- LED 熄灭后松开按钮
- 等待 LED 变绿,刷写完成
- 关机,拨回 NAND 模式,正常开机
最佳实践:永远保持 NOR 中有一个可工作的系统。不要在测试新固件时同时覆盖 NOR 和 NAND。
9.6 全分区刷写(NOR + NAND 完整重建)
适用于系统严重损坏或需要完全重建的场景。此过程覆盖所有分区,包括 bootloader。
前置条件: 安装 mtk_uartboot 工具,准备 TFTP 服务器(本机 tftpd-hpa 即可)。
步骤 1 — NOR 阶段(通过 USB 串口写入 BL2 + U-Boot):
# 通过 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