W103D 盒子完整指南:从开箱到 MRRC 干活
面向手里刚拿到一台 W103D、什么都没做过的人。全程分两大段:先把系统刷进去(§1–§8), 再把 MRRC 配到能用(§9–§16)。最后一节是一张打勾清单。
速查版(已熟悉流程时看):packaging/box/README.md要自己出镜像才看:docs/w103d_pack.md
三条前置说明,先说清楚:
—— 那是推荐的最终形态:盒子 + 一根电源线 + 一根网线,不再需要 U 盘。
而且每台盒子的口令都不一样。
不一致。我把三种手段都写了,按你的机器试。
- 走 U 盘路线:Android 的分区与数据不动(只写一次 u-boot 环境,见 §5)。刷坏了拔掉 U 盘重新上电就回到原厂安卓。验收通过后把系统固化进 eMMC(§17)
- 镜像里没有任何密钥。 Web 口令、自签证书都在盒子首启时现生成——所以公开下载这份镜像是安全的,
- §5(让盒子从 U 盘启动)是最容易卡住的一步,因为那一段在原厂安卓里操作,各家固件的菜单路径
---
1. 先认清你的盒子
| 项 | 必须是 |
|---|---|
| 型号 | ZTE W103D(中兴云电脑 / 电视盒子) |
| 芯片 | Amlogic S905L3A(G12A 家族,4×Cortex-A53) |
| 内存/存储 | 2 GB / 32 GB eMMC |
| 网口 | 100M 有线(够用:一路客户端约 60 KB/s) |
| 无线 | MT7663S(当前已发布镜像上不稳:2020 版 N9 固件会渐进式挂死,见 §20.5;出厂 2021 版固件已钉进仓库,下个镜像修复。实时音频优先走有线) |

⚠️ 认准芯片。国科 GK6323、RK3566 的同名/同形盒子不适用——那份镜像的内核补丁与 WiFi 固件 是专门烘给 S905L3A-w103d 的。

芯片叫法对照(别被卖家说晕)
| 你在哪看到 | 名字 |
|---|---|
| 卖家 / 线刷包 / 论坛 | 晶晨 S905X2 |
| ophub 板级库 / 本文档 | s905l3a |
| 设备树 / 平台 | meson-g12a(G12A 家族) |
三个说的是同一颗芯片的家族:S905L3A 属于 G12A,市面俗称 S905X2,ophub 钉的是具体变体名。 所以卖家说"S905X2"、而本文档说"S905L3A",不矛盾 ✅
同族的几个兄弟型号(固件通刷)
中兴云电脑 W100D / W102D / W103D / W105D ← 论坛实测:这几款固件通刷
| W100D(太极) | W105D(玲珑) | W103D(本指南) | W102D | |
|---|---|---|---|---|
| 芯片 | 晶晨 S905X2 | 晶晨 S905X2 | 晶晨 S905X2(=s905l3a) | 同类 |
| 内存 / 存储 | 2 G + 8 G | 2 G + 8 G | 2 G + 32 G | — |
| 系统 | 安卓 9 | 安卓 9 | 安卓 9 | 安卓 9 |
(W100D 与 W105D 的公开配置完全一样,差别在形态与命名:W100D 属"太极"、W105D 属"玲珑"名片式。)
"通刷"说明硬件几乎同源 ✅ 但存储差 4 倍(8 G vs 32 G)——本镜像装完约占 3 GB、载荷仅 145 MiB, 8 G 型号够用 ✅
关于无线网卡:论坛资料没有一款写明(四款都没写)。但"固件通刷"是一条支持性证据 —— 一份线刷包能同时驱动四款的 WiFi,说明它们多半是同一颗或兼容网卡 ✅(这是推断,不是确证 ⚠️)。 真要买之前,以实物为准:getprop 或拆机看丝印。
⚠️ 但有一处本指南无法替你确认:W105D/W100D 用的是不是同一颗 MT7663S 无线网卡(论坛资料没写)。 本镜像最难的部分正是 MT7663S 的驱动适配,这块不一样的话,WiFi 就要重新适配。 另外 ophub 的板级库里只有 W103D(s905l3a-w103d),没有 W105D 的条目——同族不等于配置可直接复用。
盒子上的口要认一遍(拍照存着,接线时省事):
- 网口、HDMI、电源
- USB 口 ≥ 2:一个插 U 盘(走 U 盘路线时),一个给电台
- 复位孔(AV 孔里那个小按钮)——§5 的兜底手段要用
2. 准备清单
- W103D 盒子 + 原装电源
- ≥8 GB U 盘(会被完全擦除)
- 网线(必须——首启要联网)
- 电台 USB 线。FT-710 要插盒子/电台的上方
Enhanced口(不是 Standard 口) - 电脑(烧盘用)
- 原厂线刷固件包(兜底;走 U 盘路线时用不到,但建议先下载好放在手边)


3. 下载镜像并校验
mkdir -p ~/w103d && cd ~/w103d
curl -LO https://www.vlsc.net/mrrc_modern/downloads/MRRC-Modern-1.25.5-w103d.img.gz
校验(这一步别跳——1.07 GB 下坏了是能下坏的):
# macOS
shasum -a 256 MRRC-Modern-1.25.5-w103d.img.gz
# Linux
sha256sum MRRC-Modern-1.25.5-w103d.img.gz
| 字节数 | 1,154,545,271 |
| SHA-256 | 5d74f7378b64bd7ebff16528aa4b5222097de22b9f3b214fe1ccebc62dc8ffc1 |
两者都对不上就别往下走。先确认字节数(ls -l)——大小不对说明下载被截断了。
4. 烧到 U 盘
认准盘符,别烧错盘。(这一步会把目标盘整个擦掉。)
macOS:
diskutil list # 找到你的 U 盘,记下 /dev/diskN(N 是数字)
diskutil unmountDisk /dev/diskN
gzip -dc MRRC-Modern-1.25.5-w103d.img.gz | sudo dd of=/dev/rdiskN bs=4m
sync # 等它真的写完
⚠️ 用 /dev/rdiskN(裸设备)不是 /dev/diskN——后者慢十倍以上。
Windows:用 Rufus 或 balenaEtcher,选那个 .img.gz(两者都能直接吃 gz)。 目标是"从镜像写入"模式,不是解压后复制文件。
Linux:
lsblk # 找盘
gzip -dc MRRC-Modern-1.25.5-w103d.img.gz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync
烧完把 U 盘安全弹出(macOS:diskutil eject /dev/diskN)。系统可能提示"此磁盘无法读取"—— 那是正常的,镜像是 Linux 分区,Windows/macOS 读不懂。
5. 让盒子从 U 盘启动(新机器最容易卡的一步)

原理:已从镜像里核实,不是猜的
原厂安卓的 u-boot 有一个 update 模式。进去以后它会到 U 盘上找并运行 aml_autoscript——这个脚本就在镜像的启动分区里,内容是:
setenv bootcmd 'run start_autoscript; run storeboot'
setenv start_autoscript '... SD 卡 → USB(0..3) → eMMC ...'
setenv upgrade_step 2
saveenv # 写入 u-boot 环境
reboot
它做的就是把启动顺序改成「先 U 盘/SD、再 eMMC」,存进 u-boot 环境,然后重启。 重启后 u-boot 从 U 盘加载 s905_autoscript → 读 uEnv.txt(里面写着本板的 FDT=/dtb/amlogic/meson-g12a-w103d.dtb)→ 引导 Linux 内核。
所以整件事的关键只有一条:让原厂 u-boot 进 update 模式。
⚠️ 更正一处说法
之前写「eMMC 一个字节不动」不准确——上面的 saveenv 确实会写 eMMC(写的是 u-boot 环境变量, 不是 Android 的分区数据)。
准确的说法:不碰 Android 的分区与数据,只改 u-boot 的启动顺序偏好。 回滚依然简单(见下)。
三种触发方式(按独立性排)
① 复位孔(最不依赖原厂软件,第一次建议用它)
- 断电,U 盘插好
- 用回形针按住复位孔里的按钮
- 通电,按住约 10 秒再松手
② adb(原厂安卓里打开了 USB/ADB 调试)
adb connect <盒子IP>:5555
adb shell reboot update
③ 盒子上的终端 App
su -c 'reboot update'
reboot update 就是让安卓把 u-boot 的 upgrade_step 置位——u-boot 下次启动看到它就运行 U 盘上的 aml_autoscript ✅
成功的样子
HDMI 上是 Linux 内核日志(不再有安卓开机动画)。因为 uEnv.txt 里配的控制台是 console=ttyAML0,115200n8 console=tty0——串口和 HDMI 都能看,所以刷机失败时接上 HDMI 就能看到卡在哪 ✅
第一次开机要几分钟:扩 rootfs、生成 SSH 密钥。
回滚:断电 → 拔 U 盘 → 上电。u-boot 在 U 盘上找不到脚本,走 eMMC → 回安卓。 (u-boot 环境里那条“优先 U 盘”的偏好还在,但没有 U 盘时它是无害的。)
6. 首启会自动完成什么
镜像里已经烘好了不需要硬件的全部东西(用户、代码、venv、依赖、frpc、FTDI 库、11 份机型配置、systemd 单元)。 首启只做必须碰硬件的四件事:

| 首启做 | 为什么不能提前做 |
|---|---|
| 生成 Web 登录口令 | 每台机器应当不同;写死在镜像里等于公开口令 |
| 生成自签证书 | 证书要绑定本机名/IP,且私钥不该随镜像分发 |
探测串口(/dev/ttyUSB / ttyACM) | 端口号只有在真机上插了电台才知道 |
| 探测声卡(电台的 USB 声卡) | 同上 |
首启不需要联网:上面四件事全在本机完成(生成口令、自签证书、探测串口与声卡), 不下载任何东西。开机后 mrrc-firstboot.service 跑完会把自己标记成"已做",之后不再重复。
既没有网线、也没有能连上的已保存 Wi-Fi 时,mrrc-setup-ap.service 会另外开一个 开放热点让你进去配置 —— 见 §9.6。⚠️ 但这条路在 W103D 上目前走不通(信标不上空, 见 §9.6 的真机警告):首次配置请走网线或 HDMI。热点按网络状态判断,不按"是否首次开机": 盒子一旦有了可用网络,热点就不存在了,那个免口令页面也随它一起消失。
7. 进系统,第一件事改口令
从路由器 DHCP 列表里找到盒子的 IP,然后:
ssh root@<盒子IP> # 出厂口令 1234(ophub Armbian 的默认值)
进去第一件事就改掉它:
passwd root
⚠️ 出厂 root/1234 是公开知识,不改等于把盒子送人。
8. 拿到 Web 口令,打开界面
mrrc-show-password
这个命令必须用 root 跑——口令存在一个 0640 root:root 的文件里。
首启时 HDMI 控制台的横幅上也会印一次;之后想不起来就用这个命令取回。
浏览器打开:
https://<盒子IP>:8888
自签证书会警告一次 → 高级 → 继续前往。
⚠️ 必须走 HTTPS,不要关。 手机浏览器要调用麦克风发射(PTT),而在 HTTP 下浏览器不给麦克风权限—— 这是浏览器安全策略,不是我们的设置问题。
登录后你应该看到主界面:频率、模式、S 表、瀑布图。这时候还没有电台——下一步接上。

9. 接网络(有线 / Wi-Fi)
⚠️ 2026-10-11 真机结论:热点引导这条路在 W103D 上目前走不通 —— MT7663S 的驱动 能把 AP 模式激活(系统日志一切正常),但信标不上空,手机扫不到 MRRC-Setup。 首次配置请走网线(§9.2)或 HDMI(§9.4)。 第 4 条的具体说明与"驱动修好后如何恢复" 见 §9.6。
9.1 按你手边有什么选
| # | 你手边有 | 方式 | 现在能用吗 |
|---|---|---|---|
| 1 | 一根网线 | 直接插网线(最省事) | ✅ 能用 → §9.2 |
| 2 | 电脑 + 读卡器 | 预置:刷盘前把配置写进启动分区 | ✅ 能用 → §9.3 |
| 3 | HDMI + USB 键盘 | nmtui:盒子上的全屏文字界面 | ✅ 能用 → §9.4 |
| 4 | 只有一台手机 | 热点引导:盒子自己发热点 | ❌ 本板目前不可用(信标不上空,见 §9.6) |
⚠️ 一个限制:第 2 条(预置)只能写口令与电台设置,写不了 Wi-Fi 密码——Wi-Fi 归 NetworkManager 管,不走 env 文件(设计 D-4:两个域各有唯一写入者)。所以要连 Wi-Fi, 用第 3 条(有键盘)或第 1 条(有网线)。(第 4 条本板暂不可用,见 §9.6。)
9.2 第 1 条:网线(推荐)
插上就通,确认一下:
ip a # 看有没有拿到地址
nmcli device status # eth0 应显示 connected
9.3 第 2 条:预置(刷盘时就写进去,零键盘零网线)
镜像的 FAT 启动分区会被挂到 /boot。往那儿放一个 mrrc.env,首启会自动采纳并改名成 mrrc.env.applied:
# 烧完盘、还没插进盒子之前(macOS 上那个 FAT 分区叫 BOOT,直接拖文件进去也行)
cat > /Volumes/BOOT/mrrc.env <<'EOF'
MRRC_WEB_PASSWORD=你自己定一个
MRRC_RADIO_MODEL=ft710
MRRC_PTT_MAX_TX_SECONDS=120
EOF
支持任意 MRRC_* 键(就是 §13 那张表里的那些)✅
9.4 第 3 条:HDMI + nmtui(没有任何网络时最省事)
盒子接 HDMI + 一个 USB 键盘,登录 root / 1234,然后:
nmtui
方向键选「启用连接 / Activate a connection」→ 选你的 SSID → 输密码。 这是全屏文字界面,既不需要网络也不需要图形环境 ✅
已经在 SSH 里(有网线)就用 nmcli:
nmcli device status # 先看 wlan0 在不在
nmcli device wifi list # 扫(要等几秒)
nmcli device wifi connect "你的SSID" password "你的密码"
nmcli connection show --active # 确认连上了
ip a show wlan0 # 拿到 IP 没
盒子换了网络导致 IP 变了,就去路由器里重新找一下。
9.5 无线起不来时,按顺序查
每一条排除的东西都不一样,别跳步:
| 检查 | 命令 | 说明 | |
|---|---|---|---|
| 硬件在不在 | rfkill list | 显示 Soft blocked: yes → rfkill unblock wifi;看不到 wlan0 才往下查 | |
| 驱动加载没 | `lsmod \ | grep mt76` | 应有 mt7663s 与 mt76_sdio;没有就 modprobe mt7663s |
| 固件加载成功没 | `dmesg \ | grep -i mt76` | 有 firmware 失败字样 = 固件没加载上(本镜像带 4 个 mt7663 固件) |
| 网卡认出来没 | iw dev | 应列出 wlan0 | |
| 扫描有结果没 | nmcli device wifi list | 空列表 → 多半是天线或信道问题 | |
| 监管域 | iw reg get | 显示 country 00 时部分信道不可用;iw reg set CN 后重试 |
背景(决定你该查什么):W103D 的无线是 MT7663S,WiFi 与蓝牙同一颗芯片,走 SDIO 而不是 USB。这块板的驱动是 ophub 专门适配的(上游 PR #3658 / #3659),所以 内核绝不能换——换通用内核 = 静默丢 WiFi(见 §19 红线③)。
设计上能用,但当前已发布镜像上不稳:这份镜像带的还是 linux-firmware 的 2020 版 N9 固件,会渐进式挂死(见 §20.5;出厂 2021 版固件已钉进仓库,下个镜像修复)。而且无论哪版, 无线抖动都大,长时间听音频容易卡。实时音频始终优先走有线,无线只用来配置。
9.6 第 4 条:热点引导(零键盘零网线,只要一台手机)
⚠️ 2026-10-11 真机边界:这条路在 W103D 上目前走不通。 MT7663S 的驱动能把 AP 模式激活(系统日志一切正常),但信标不上空——手机扫不到MRRC-Setup。 上游移植记录同样只验证过 STA 模式。首次配置请走网线(§9.2)或 HDMI +nmtui(§9.4)。本节保留给驱动修好后的未来版本。
盒子上电后,如果既没有网线链路、也没有能连上的已保存 Wi-Fi,它会自己开一个 开放热点:
| Wi-Fi 名 | MRRC-Setup(MRRC_SETUP_AP_SSID 可改) |
| 密码 | 无(开放热点,故意的——你还没有办法被告知一个密钥) |
| 页面 | https://10.42.0.1:8888/setup |
| 窗口 | 30 分钟,用完自动关(MRRC_SETUP_AP_TIMEOUT_MIN 可改) |
操作步骤:
手机可能提示"该网络无互联网连接"——这是对的,选「保持连接」。
会先弹一次证书警告(盒子用的是自签证书):选「高级 / 详细信息」→「继续访问」。 这一步绕不过去,也不该绕——它只出现在盒子自己开的那个热点上。
- 第 1 步:设置登录口令(至少 8 位)。必须先做:切网之后热点会关,这个免口令 页面也随之消失。此刻盒子里生效的口令是首启自动生成的随机值、你并不知道, 所以不先设成自己的就会被锁在盒子外面(服务端也会用 409 挡住"先切网")。 - 第 2 步:扫描并选择你的 Wi-Fi,输入密码,点「连接并切换到这个 Wi-Fi」。
走 SDIO),AP 与 STA 不能同时存在(设计 D-3)。页面在断开之前就把后续步骤显示 出来了,照着做:把手机连回你自己的 Wi-Fi,然后在路由器后台的客户端列表里找到盒子, 用 https://它的IP:8888 打开控制界面,用刚设的口令登录。
- 盒子上电,等 约 15–30 秒,在手机 Wi-Fi 列表里找
MRRC-Setup并连上(无密码)。 - 浏览器打开
https://10.42.0.1:8888/setup。 - 页面上按顺序做两件事:
- 点下去之后手机会与盒子断开——盒子只有一颗射频(MT7663S,Wi-Fi 与蓝牙同一颗芯片,
如果 Wi-Fi 密码输错了:盒子会自动把热点重新开回来(设计上禁止静默失败,见 §6 数据流), 手机重连 MRRC-Setup、刷新页面,就能看到失败原因并直接重试。一次失败还会重置那 30 分钟 窗口,所以多试几次不会把窗口耗光。
窗口用完了 / 错过了怎么办:断电重启。那个 30 分钟的闩是按开机次数算的,不写在 盘上——所以只要盒子还没有可用网络,每次上电都会重新给一次机会。(这是设计 D-6 的恢复路径; 把它做成持久状态就等于把盒子变砖。)
插上网线会怎样:热点立刻关闭,免口令页面随之失效。判据是网络状态而不是"是否配置 过",所以一台配好的盒子永远不会再开热点。
有显示器的人可以完全不碰热点:mrrc-setup-ap 会把地址打到 HDMI 控制台上 (journalctl -u mrrc-setup-ap 里也有同一行)。这是设计对"开放热点期间被邻居抢先设口令" 那条残留风险的缓解手段——你不必依赖热点。
排查:
| 现象 | 查什么 | |
|---|---|---|
手机里看不到 MRRC-Setup | journalctl -u mrrc-setup-ap -n 50 --no-pager。有 could not start the setup hotspot ⇒ 看它后面那句 nmcli 的原因;rfkill list 显示软阻塞就 rfkill unblock wifi;再往下按 §9.5 的顺序查驱动与固件 | |
| 连上了热点但打不开页面 | `nmcli device show wlan0 \ | grep IP4(盒子应有 10.42.0.1/24);command -v dnsmasq` —— 缺 dnsmasq 的话手机能连上热点但拿不到地址,任何地方都不报错,这是设计 D-2 专门点名的那个坑 |
打开的是 /login 而不是向导 | 免口令闸门没开。cat /run/mrrc/setup-ap/state.json 看 mode 是不是 hotspot、heartbeat 是不是最近 45 秒内的;再确认你确实是从热点网段访问的(不是从家里 Wi-Fi) | |
| 点"连接并切换"后一直转圈 | 这时手机应该已经掉线了,按页面说的连回你自己的 Wi-Fi。如果手机又自动连回了 MRRC-Setup,说明切换失败,刷新页面看红字原因 | |
| 切过去了但找不到盒子 IP | 路由器客户端列表里按主机名找;盒子自己也记了一行:`journalctl -u mrrc-setup-ap \ | grep joined` |
| 想改热点名 / 窗口时长 | 编辑 /opt/mrrc_modern/env/mrrc.env,加 MRRC_SETUP_AP_SSID=… 或 MRRC_SETUP_AP_TIMEOUT_MIN=…,然后 systemctl restart mrrc-setup-ap |
2026-10-11 已真机验证(结果是否定的):MT7663S 这颗 SDIO 变体在这块板上起不了 AP——驱动与 NetworkManager 都报成功,但信标不上空(源码走查:mt7615_ops没有start_ap,mac80211 缺 op 时静默返回成功);AP 折腾还会楔死驱动,只能断电复位。 切换体验与10.42.0.0/24网段冲突这两件事留待驱动修好后再验。设计上不依赖热点 成立:真起不来的时候,网线(§9.2)与 HDMI +nmtui(§9.4)永远可用。
10. 接电台
FT-710 的线插口别搞错:用上方 Enhanced 口,它同时承载 CAT 串口和 FT4222 scope。 插 Standard 口的话 CAT 可能通但没有真频谱。
接好后确认三样东西都出现了:
ls -l /dev/ttyUSB* /dev/ttyACM* # CAT 串口
arecord -l # 电台的 USB 声卡(RX)
aplay -l # 播放设备(TX)
⚠️ 这三样一样都不能少。少串口 = 没有 CAT 控制;少声卡 = 没有声音。

11. 选机型
mrrc-radio list # 11 个型号,带 ✅已验证 / ⚠实验性
已验证的三个:ft710、ic7300、ic7300mk2。其余 8 个是实验性(默认只收不发,见下)。

mrrc-radio use ft710 # 自动探测串口 → 写配置 → 重启服务
mrrc-radio use ic7300 --port /dev/ttyACM0 # 或者你直接指定端口
mrrc-radio show # 核对当前生效的配置
use 做了四件事:停服务 → 探测串口(真发包问电台)→ 写配置 → 起服务。 所以它需要电台是开机状态。
换机型时旧串口会被自动清掉。 FT-710 是ttyUSB0/1、IC-7300 是ttyACM0—— 留着上一个型号的串口等于配了一条没有报错的死链路。
关于 8 个实验性机型(重要)
ic705 ic7610 ic7760 ftdx10 ftdx101d ftdx101mp ftx1 ft891 —— 这些机型的指令表来自 Hamlib 与设备手册,不是真机实测。默认只收不发。
(在镜像里看得出来:这三个已验证机型的 profile 根本不写 MRRC_ALLOW_UNVERIFIED_TX 这一行, 而那 8 个都显式写着 =0——默认是安全的,要发射得主动改。)
理由(AD-019):在没有实测过的频率/功率语义上发射,对电台和天线都不好。
要发射必须显式开门:
vi /opt/mrrc_modern/env/mrrc.env # 加一行 MRRC_ALLOW_UNVERIFIED_TX=1
systemctl restart mrrc-modern
换回已验证机型时这个键会自动重置为 0,不会带着开着。
12. 验收:确认"真的能工作"
scp packaging/box/verify.sh root@<盒子IP>:/tmp/
ssh root@<盒子IP> 'bash /tmp/verify.sh'
12 项,每项失败都会给出排查命令。先跑这个,再动手调别的。
| 项 | 查什么 |
|---|---|
| 1/12 | 有线网络(nmcli device status) |
| 2/12 | 电台串口(/dev/ttyUSB / ttyACM) |
| 3/12 | 电台 USB 声卡(arecord -l) |
| 4/12 | Python 与依赖 |
| 5/12 | 服务在跑 |
| 6/12 | 8888 上的 HTTPS 真的在应答(只看有没有应答,不看证书是否受信——自签证书本来就不受信) |
| 7/12 | 配置一致性(设计 D-11:EnvironmentFile 与 MRRC_CONFIG_FILE 同一文件) |
| 8/12 | Cloud Hub 隧道客户端(fleet/frpc) |
| 9/12 | Cloud Hub 公网入口(未接入时自动跳过) |
| 10/12 | PTT 安全上限(MRRC_PTT_MAX_TX_SECONDS 有值) |
| 11/12 | 盒子身份与权限通道(NM polkit 规则、avahi-daemon/hostname.local 解析、mrrc-box-helper 套接字——LAN 引导页写网络全靠它们) |
| 12/12 | WiFi N9 固件(必须是出厂 2021 版,SHA 223f73f1…——linux-firmware 的 2020 版会渐进式挂死 WiFi,见上面 MT7663 固件节) |
前 3 项就是硬件三件套。第 7 与第 10 项都是“没有报错也会出问题”的那类:第 7 项不合格时界面会显示 “已连接”而公网 TLS 校验失败;第 10 项没值时少一道防线①/② 中的第②道。
第 11 项查的是"出问题时你还能不能找到这台盒子、网页还能不能写网络"—— <hostname>.local 解析、NM 授权规则、box-helper 套接字都在,LAN 引导页才玩得转; 因为出问题的时刻你正好连不上盒子、没法查。第 12 项只认出厂 2021 版 N9 固件: 当前已发布的 v1.25.5 镜像(5d74f737…)还是 2020 版,这一项会红—— 现场换法见 §20.5,换完必须断电重启(软重启芯片不复位)。
2026-10-11 固化到 eMMC 那一轮的实测判读(自建镜像,版本串同为 1.25.5):第 12 项绿 (7663mp1827,2021 版);第 11 项红 —— 该镜像构建于 10-11 中午,早于box_helper/ NM polkit 规则 /avahi-daemon落地,三件都不在,不是盒子故障,要用上得重刷含它们的镜像;第 9 项红是判定偏严: 公网入口未登录时返回 302(跳/login)就是正常应答,脚本目前只认 200/401。
然后实际用一次——打开界面,调频率、看瀑布、按 PTT 说一句。这才是真的验收。
13. MRRC 的全部可调项
配置文件:/opt/mrrc_modern/env/mrrc.env。改完 systemctl restart mrrc-modern 生效。
| 变量 | 作用 |
|---|---|
MRRC_WEB_PASSWORD | Web 登录口令(首启生成;想自己定就写这里) |
MRRC_LISTEN_PASSWORD | 收听专用口令:用它登录是只读访客(能听、能改频率/模式,不能发射、不能改设备设置)。留空=不启用 |
MRRC_WEB_PORT / MRRC_WEB_HOST | 监听端口(默认 8888)/ 绑定地址 |
MRRC_RADIO_MODEL | 当前机型(用 mrrc-radio use 改,别手改) |
MRRC_SERIAL_PORT / MRRC_BAUD_RATE | CAT 串口与波特率(同上,让 mrrc-radio 管) |
MRRC_ALLOW_UNVERIFIED_TX | 未验证机型的发射门禁(§11) |
MRRC_PTT_MAX_TX_SECONDS | 发射时长上限(镜像默认 120)——防线② |
MRRC_REMOTE_SESSION_TX_HEARTBEAT_S | 会话活性闸门;Cloud Hub 接入后自动写 5——防线① |
MRRC_SCOPE_PORT / MRRC_SCOPE_BAUD | FT-710 的 FT4222 scope 串口 |
MRRC_FTDI_LIB_DIR | FTDI 库目录(镜像里已预置 aarch64 版本) |
MRRC_RX_BUFFER_MS | 接收音频的宿主缓冲深度(毫秒,默认:盒子/其他 Linux 100,macOS/Windows 20)。见下方「声音卡顿」 |
MRRC_AUDIO_RX_DEVICE / MRRC_AUDIO_TX_DEVICE | 指定音频设备(多声卡时有用) |
MRRC_RECORDINGS_DIR | 通联录音目录(服务端存 MP3) |
MRRC_RECORDINGS_MAX_SESSION_MIN / MRRC_RECORDINGS_BITRATE | 单次录音时长上限 / 码率 |
MRRC_ATR1000_HOST / MRRC_ATR1000_PORT | ATR-1000 天调的地址(§15) |
MRRC_SESSION_METRICS_INTERVAL_S | 会话遥测上报间隔(默认 300 秒,0=关) |
常用场景:
# 给朋友开一个"只能听"的入口
echo 'MRRC_LISTEN_PASSWORD=换个好记的' >> /opt/mrrc_modern/env/mrrc.env
systemctl restart mrrc-modern
# 之后访问 https://<盒子IP>:8888/listen 用这个口令登录
# 发射时长上限调长一点
sed -i 's/^MRRC_PTT_MAX_TX_SECONDS=.*/MRRC_PTT_MAX_TX_SECONDS=300/' /opt/mrrc_modern/env/mrrc.env
systemctl restart mrrc-modern
MRRC_RX_BUFFER_MS(声音卡顿才需要动):接收方向的采集缓冲深度。盒子上的 USB 声卡(ALSA)只给 1–2 个 20 ms 周期,读得稍慢就溢出;溢出之后采集接口会静默停摆 (PyAudio 仍报流是开的、内核也不报错),于是声音先被切碎、随后彻底安静。镜像默认已经 给到 100,调大可换稳定性、代价是延迟:
sed -i 's/^MRRC_RX_BUFFER_MS=.*/MRRC_RX_BUFFER_MS=200/' /opt/mrrc_modern/env/mrrc.env
systemctl restart mrrc-modern # 判定:journalctl -u mrrc-modern | grep -i "capture stalled"
14. 公网接入(Cloud Hub)
让盒子在公网可用(https://<呼号>.mrrc.vlsc.net/,例:https://bg1sb.mrrc.vlsc.net/)。界面上 设置 → Cloud Hub:
- MRRC_SSL_CERT / MRRC_SSL_KEY(这个机型的入口证书) - MRRC_REMOTE_SESSION_TX_HEARTBEAT_S=5(防线①:PTT 半开时自动释放)
- apply:填呼号 + 联系方式,提交申请。
- 等批准。
- connect:自动完成——签证书、enroll、写隧道配置、起 frpc,并自动写两个配置键:
之后用 https://<呼号>.mrrc.vlsc.net/ 访问(例:https://bg1sb.mrrc.vlsc.net/)。

两条 PTT 防线互相独立,都要在:防线①=会话活性闸门(公网必经),防线②=时长上限(MRRC_PTT_MAX_TX_SECONDS)。 公网路径下 NAT 掉表、换 Wi-Fi、静默丢包都不会产生"断线",只有这两条能兜住。
15. 天调 ATR-1000(可选)
盒子支持 ATR-1000 自动天调。配好地址就能用:
cat >> /opt/mrrc_modern/env/mrrc.env <<'EOF'
MRRC_ATR1000_HOST=<天调IP>
MRRC_ATR1000_PORT=<端口>
EOF
systemctl restart mrrc-modern
配好之后:发射中驻波超阈值会自己发一次完整调谐(一次,不是反复试),调谐有效才写回学习库。 它绝不自行键控电台——触发前提是操作者自己在发射。
16. 日常运维
日志:
journalctl -u mrrc-modern -n 100 --no-pager # 服务日志
tail -f /opt/mrrc_modern/logs/server-stdout.log # 服务 stdout
升级:
MRRC_UPDATE_SRC=<git url 或本地目录> mrrc-update
只做三件事:拉代码 → 装依赖 → 重启。配置不会被碰。没有自动回滚——升级前先备份(下面)。
备份(升级前做):
tar czf /root/w103d-backup-$(date +%F).tgz \
/opt/mrrc_modern/env/ /opt/mrrc_modern/mem_channels.json /var/lib/mrrc/
(/opt/mrrc_modern/env/ 里有口令与 Cloud Hub 证书路径。这份备份含私钥,别乱放。)
手动装机内容检查:
bash /tmp/verify.sh # §12 那份,随时可重跑
17. 写进 eMMC(推荐的最终形态)
U 盘路线跑通、验收过了就做这一步 —— 它是推荐的最终形态:盒子 + 一根电源线 + 一根网线, 不再需要 U 盘,28.9 GB eMMC 全归它自己。这一步会覆盖 eMMC;做法是在跑着的 U 盘系统里执行 ophub 自带的安装器,它把当前系统克隆进 eMMC 并自动处理引导 —— 不需要线刷工具、不需要重打镜像。
2026-10-11 在真机上完整走了一遍:盒子现在就从 eMMC 启动(findmnt /=/dev/mmcblk2p2, 28 GB 全用上),原厂引导逐字节保留。下面每一步都是那一次的实操记录。
17.1 先备份(务必先做)
armbian-ddbr # 交互里选 b
全盘(29 GB,含原厂引导)压到 /ddbr/BACKUP-arm-64-emmc.img.gz(实测 2.2 GB),留在 U 盘上别删。 单线程 gzip 在这块 SoC 上约 10 MiB/s(≈40 分钟);先装 pigz 手动跑三线程只要 ≈9 分钟, 产物同样是标准 gzip 流,armbian-ddbr 的恢复路径不变:
apt-get install -y pigz
mkdir -p /ddbr
nohup sh -c 'dd if=/dev/mmcblk2 bs=4M | pigz -c -p 3 > /ddbr/BACKUP-arm-64-emmc.img.gz' >/ddbr/backup.log 2>&1 &
# 跑完自检:pigz -t -p 3 /ddbr/BACKUP-arm-64-emmc.img.gz → TEST-OK
17.2 安装进 eMMC
armbian-install # 不要加 -m yes
交互只有两个问题:
| 提示 | 答 |
|---|---|
Please Input ID: | 307(设备表里的 ZTE-W103D) |
Please Input ID (1/2): | 1(ext4,与镜像一致) |
它会自动完成(输出可逐步核对):备份并回写原厂引导 → ampart 重建 Amlogic 分区表 → 建 p1(512 MB FAT,引导)+ p2(其余全部,ext4)→ 拷 /boot 并改写 boot.scr / uEnv.txt 的 新 UUID → tar 克隆整个根文件系统(约 2.5 GB)→ 提示 Installation completed successfully. Run [ poweroff ], remove the installation media…。
板级身份是钉死的(/etc/ophub-release 与 ophub model_database.conf 核对过):MODEL_ID=307、 FDTFILE=meson-g12a-w103d.dtb、启动器 u-boot-w103d.bin、BOARD=s905l3a-w103d。 -m yes 会换主线 u-boot,本板不行。安装器还会重新生成 machine-id(写进 eMMC 那份),副作用见 17.4。
17.3 切换:关机 → 拔 U 盘 → 上电
poweroff
断电,拔掉 U 盘,重新上电。启动顺序是 SD → USB → eMMC,没有 U 盘就落在 eMMC 上。
17.4 起来之后核对
findmnt -no SOURCE / # 应为 /dev/mmcblk2p2
df -h / # 约 28 GB
systemctl is-active mrrc-modern
bash /tmp/verify.sh # §12 那份
IPv6 地址会变:machine-id 重生成,SLAAC 的接口标识跟着变(…c4c1:3f5e:173f:96d1 → …e7c0:4b51:b64e:8b49)。 域名解析 / Cloud Hub 入口几分钟内自愈(DDNS 类脚本与隧道都会自己跟上);IPv4 由 DHCP 按 MAC 发放,一般不变。 口令、env/mrrc.env、证书、录音、/opt 下的附加件都随系统搬过去了。判读 verify.sh 的红项前先看 §12 的注。
最终形态:盒子、一根电源线、一根网线 —— 不再需要 U 盘;28.9 GB eMMC 全是它自己的。 那根 U 盘留着当救砖盘(整盘备份就在里面)。

⚠️ 变砖兜底:Amlogic 的 MaskROM 在 SoC BootROM 里(短接可重新进刷写模式), 加上你手上的原厂线刷固件包,就能恢复。这两样在手,这一步的风险才是可控的。
18. 退回去
- 最省事:把 U 盘插回去 —— u-boot 的启动偏好仍优先 U 盘,插上就从 U 盘跑(安装器回写的是原厂 u-boot,偏好没变)。 - 用备份恢复:从 U 盘启动后 armbian-ddbr 选 r,从 /ddbr/BACKUP-arm-64-emmc.img.gz 还原。 - 回原厂安卓:原厂线刷固件包 + MaskROM 短接重刷(§20.5)。
- U 盘路线(eMMC 没写):断电 → 拔 U 盘 → 上电 = 原厂安卓。零痕迹。
- 已写 eMMC:
19. 三条红线(会踩出"没有报错的故障")
① 停服务只用 systemctl,不要 kill 进程。
Linux 上 frpc 的残留清理是 Windows-only 的。一个残留的 frpc 会占住 proxy 名,导致下次启动 隧道起不来而界面毫无提示。systemctl stop 会连带清掉 frpc,kill 不会。
② 登录限流是全局桶,误锁影响所有人。
经公网访问时所有登录共享同一个来源 IP,限流是 5 次失败 / 300 秒,而且全局。 不是你一个人被锁 5 分钟——是所有人。
③ 内核升级只走 armbian-update,保持 w103d 变体。
W103D 的 WiFi 完全依赖专属内核补丁 + MT7663S 固件 overlay。 换成通用内核 = 静默丢 WiFi:没有报错,只是连不上。
20. 排障
| 症状 | 先看 | 多半是 | |
|---|---|---|---|
| 打不开网页 | ip a;systemctl status mrrc-modern | 网线/服务;journalctl -u mrrc-modern -n 50 | |
| 网页只转圈 | 换 https://(不是 http) | 端口 8888 + 自签证书警告要放行 | |
| 手机按 PTT 没反应 | 地址栏是不是 https:// | HTTP 下浏览器不给麦克风权限 | |
| 没有网口地址 | nmcli device status | 换网线/换口;路由器 DHCP | |
| 没有串口 | ls /dev/ttyUSB /dev/ttyACM | USB 线;FT-710 要插上方 Enhanced 口;电台菜单 MOD SOURCE = USB | |
| 有串口但连不上 | mrrc-radio show 的串口对不对 | mrrc-radio use <model> --port /dev/ttyXXX | |
| 没声音 | arecord -l 有没有电台声卡 | 换线/换口;服务日志里的 PyAudio 设备列表 | |
| 声音卡顿/断续、听一会儿就没了 | cat /proc/asound/card1/stream0(看 Capture 是不是 Status: Stop);`journalctl -u mrrc-modern \ | grep -i "capture stalled"` | 采集缓冲溢出后静默停摆(本机 ALSA 只给 1–2 个 20 ms 周期)。服务会自己重开并把原因写进日志;若反复出现,把 MRRC_RX_BUFFER_MS 调大(§13) |
| 瀑布图是合成谱(S 表) | ls -l /opt/mrrc_modern/vendor/ftdi/;ls -l /etc/udev/rules.d/99-mrrc-ftdi.rules | 缺 FTDI 库,或没插 Enhanced 口(`cat /sys/bus/usb/devices/*/idProduct \ | grep 601c);或 udev 规则缺失 —— 真 FFT 要服务用户 mrrc 能写那个 USB 节点,判定:sudo -u mrrc test -w /dev/bus/usb/001/00N && echo ok` |
| Cloud Hub 显示"已连接"但公网 502 | verify.sh 第 8、9 项 | 多半 fleet/frpc 缺失(connect() 会返回 tunnel_started:false) | |
| 公网证书报错 | verify.sh 第 7 项 | EnvironmentFile 与 MRRC_CONFIG_FILE 必须指向同一个文件(设计 D-11) | |
| 服务反复重启 | journalctl -u mrrc-modern -n 100 | Python traceback;核对机型与串口 | |
| 发射没功率 | 状态行的 TX[... pk:...] | 采集源/音量;FT-710 的 mic_gain;SSB 无话音即无功率 | |
| 延迟越来越大 | 状态行 J: | 正常 100–300 ms;长期 >500 说明抖动缓冲在追,查网络 |
20.5 另一条路线:线刷(USB Burning Tool,直接写 eMMC)
来自网上另一个人给 W103D 做的 Armbian 桌面版。它走的是完全不同的路线:不烧 U 盘,而是用晶晨的 线刷工具直接把系统写进 eMMC(覆盖原厂安卓)。
代价与收益:一步到位、不占 USB 口、32 GB 全用上;但原厂安卓被覆盖,回滚要靠线刷固件包 + MaskROM 短接。想先零风险试跑,走本文 §4–§5 的 U 盘路线。
| U 盘路线(本文主线) | 线刷路线(本节) | |
|---|---|---|
| 工具 | dd / Etcher 烧 U 盘 | Amlogic USB Burning Tool(导入 .img,不是写盘工具) |
| 目标 | 从 U 盘运行 | 直接写 eMMC |
| 原厂系统 | 保留 | 被覆盖 |
| 进模式 | update 模式(复位孔 / reboot update) | 线刷模式(见下) |
进线刷模式(W103D 特有的做法):
- 用 晶晨线刷 HDMI 短接器(短接 HDMI 口内特定引脚)
- USB 公对公线插「靠 HDMI 那个 USB 口」
- 工具识别到设备后开始刷写
工具里的擦除选项:选「擦除 flash / 普通擦除 / 擦除 bootloader」,不要选「强制全擦除」。 刷到 100% 再点停止。
首次启动:会建立 eMMC 启动入口并自动重启一次,然后扩容文件系统、建 swap。 给足 3–5 分钟,别以为死机了。
首次登录:root / 1234 或 armbian / 1234 —— 进去第一件事改口令(同 §7)。 SSH 主机密钥是首启新生成的,所以旧指纹会变(客户端会警告,正常)。
MT7663 固件:出厂 2021 版已钉进仓库(2026-10-11 真机定案)
W103D 的无线是 MT7663S(WiFi 与蓝牙同一颗芯片),开源驱动是这块板最麻烦的部分; 上游适配见 ophub 的 PR #3658 / #3659。
2026-10-11 真机定案:基底镜像自带的 linux-firmware 2020 版 N9 固件(3.1.1 / 20200604) 在这块板上会渐进式挂死(能连、每 ~30 秒掉线一次、扫描楔死、~16 分钟后 MCU 无响应、 软重启都不复位)。可用的是出厂 Android 里的 2021 版(7663mp1827 / 20210308):
SHA-256 223f73f17f0f986dc4e7167daa6eef14ffb41c713f22d70f9645eb049bdec80a
这份固件已经钉进仓库、随构建装入镜像(vendor/mediatek/ → /lib/firmware/mediatek/, 构建期校验 SHA,dpkg-divert 防包升级覆盖)——下一份镜像构建起生效。⚠️ 注意区分: 当前线上下载的 v1.25.5 镜像(SHA 5d74f737…)里没有它,那份镜像的 N9 还是 2020 版, WiFi 就是会渐进式挂死(症状见上)。装好新版镜像后,现场核实方法:
sha256sum /lib/firmware/mediatek/mt7663_n9_v3.bin # 必须是 223f73f1 开头
dmesg | grep "N9 Firmware" # 必须是 7663mp1827, Build Time: 20210308205639
修好后实测(2.4G):200 包 0.5% 丢包、平均 6.3 ms、零掉线。两个仍然成立的边界: 5GHz 能连上但数据面严重丢包(别用);AP 模式不发信标(初始化热点在这块板上 起不来,首次配置走网线或 HDMI)。
老镜像(含当前已发布的 v1.25.5)现场换法:拿到钉版文件后
cp mt7663_n9_v3.bin /lib/firmware/mediatek/mt7663_n9_v3.bin
dpkg-divert --add --no-rename /lib/firmware/mediatek/mt7663_n9_v3.bin
# 必须断电重启(软重启芯片不复位,固件不会重载)
---
21. 打勾清单:从零到 "MRRC 能干活"
刷机段
- 认准芯片是 S905L3A(不是 GK6323/RK3566)
- 镜像 SHA-256 =
5d74f737…,字节数 =1,154,545,271 - U 盘烧好、安全弹出
- 按复位孔(或
reboot update)从 U 盘启动,屏幕上是 Linux 日志不是安卓动画 -
ssh root@<IP>进得去,并且已经passwd root改掉 1234 -
mrrc-show-password拿到 Web 口令 -
https://<IP>:8888打得开、登录成功
MRRC 配置段
- 网线插好(
ip a有地址) - 电台 USB 线插在上方 Enhanced 口
-
/dev/ttyUSB*出现、arecord -l能看到电台声卡 -
mrrc-radio use ft710(或你的机型)跑通、mrrc-radio show对得上 - 界面上频率/模式跟着电台走(CAT 通)
- 瀑布图是真频谱(不是 S 表合成谱)
- 按下 PTT 能发射、松开能收到(这一步才算真的能用)
- (没有网线时)原"只用手机走通 §9.6"本板目前不可用(信标不上空);改用 HDMI +
nmtui(§9.4)或预置mrrc.env(§9.3) -
verify.sh12 项全过 - (可选)
MRRC_LISTEN_PASSWORD给朋友开了收听入口 - (可选)Cloud Hub 接入,公网
https://<呼号>.mrrc.vlsc.net/打得开 - 固化进 eMMC(推荐的最终形态;先
armbian-ddbr备份原厂):从此不插 U 盘,接线只剩电源 + 网线