博客-v37 部署 7 天体检报告:稳定运行 + 一个反复出现的隐形 bug

v37 已经放在展厅稳定跑了 7 天,今天做了一次全面体检。一切看起来很美,但有一个 bug 已经第三次踩到我头上了 —— 这次打算从根上解决它。


一句话结论

sysupgrade-v37.bin(md5 353fc69dac266a5b7a5dea4647b24eb6)从 7/26 刷入至今表现稳定 —— 5G HE160 2401 Mbps 持续、WireGuard 隧道穿越学校骨干漫游多次零中断、SMB 跨隧道 ~440 Mbps、坑 #6 修复(bridge-nf 开机时序)持久不复发。

但有一个真 bugU-Boot 网页刷机不清 overlay。每次刷完,开箱时 opkg 安装的旧 JS 文件会盖住 /rom 里的 v36+ 补丁版本 —— 无线 Edit 弹窗选择器消失、信道分析页空白。你看不到不代表它不在那,只是没去动无线配置而已。


健康体检数据

uptime:   6h15m (今天的 14:09 重启; 之前 5+ 天未中断)
load:     0.17 (15min 平均 0.04, 极度空闲)
内存:     130MB / 495MB (swap 0)
存储:     overlay 264KB / 53MB, /tmp 448KB
WG:       handshake 56s 前, transfer 31MB rx / 8MB tx, endpoint 自学到
WiFi:     rax0 = 5G HE160 ch56 2401Mbps
          ra0  = 2.4G HE40 ch8 573Mbps
eth1:     6h 内仅 1 次闪断(早先是 5 次 — 网线稳了)
桥接-nf:  1 (永久生效)
MSS clamp: nft mangle set 1360 在位
错误日志: 干净 (只有 dropbear auth/Disconnect)

隧道跟踪日志显示 7/26 以来有过若干次 WAN IP 切换,Plan C(office 端 endpoint_host=0.0.0.0)每次都能在 2 分钟内自动重连,这版固件的核心承诺兑现。


阴影复活 — 第三次

体检时发现 /overlay/upper/www/luci-static/resources/view/network/wireless.jsnetwork.js 又出现了。这两个文件 v37 /rom 里有 v36 选择器补丁 + v35 语法修复的版本,应该是正确的版本。但 overlay 上的这两个文件是:

  • md5 82b7a83c24c6739e4cc6c25bae68a6ee (wireless.js)
  • md5 582a43988dfb6bdb69446c2b3fea98bd (network.js)
  • mtime 2025-09-19 —— 设备开箱时 opkg 装 rpcd-iwinfo 的原始时间

字节和 7/26 我删过的那两个文件完全一致。也就是说:删了之后又回来了,文件本身没有任何"被重新写过"的痕迹 —— mtime 还是两年前。

那它是怎么回来的?

真相只有一个:你又 U-Boot 刷了一次。

为什么 U-Boot 刷机会恢复 overlay?

OpenWrt 的 squashfs 根 + overlayfs 上层设计:

  • /rom 在 firmware 分区(MTD)—— 刷机时被覆盖
  • /overlay/upper 在独立的 overlay 分区(/dev/ubi0_2)—— U-Boot 网页刷机从来不碰它

也就是说:U-Boot 网页刷机只是覆盖 firmware 二进制,用户的 overlay 数据原封不动保留。这设计本来是为了让用户刷机不丢配置。但反过来说 —— 任何"刷前就在 overlay 里的脏东西",刷完也依然在 overlay 里。

这台机器的原始 overlay 里就有这两个 JS 文件(开箱时 opkg 装的 luci + rpcd-iwinfo)。它们:

  • 没有 v35 的 SyntaxError 修复 —— 但有别的早期问题
  • 没有 v36 的 5 个选择器补丁 —— 所以无线 Edit 弹窗打不开信道/模式/频宽下拉
  • 不含 v37 的 3 个 channel_analysis 补丁 —— 信道分析页空白

每次刷机都"看似能用"只是因为用户没去动无线配置。一旦动了编辑,或者打开过信道分析页,立刻穿帮。

这条经验在文档里早就有 —— 但没人在意

Openwrt 连接另一个openwrt 上网.md 笔记里早就写过:

刷机后第一件事:ls /overlay/upper/www/ 检查残留

这条经验只在我主动想起来时才查。我已经踩了三次:7/22 首次(v25 无限重启事故期间就发现 overlay shadow 在破坏 LuCI)、7/26 现场修过、今天 8/2 又复发。该把这个检查自动化了


永久方案:v38 rc.local 自检

我打算在 v38 加一段 rc.local 自检:

1
2
3
4
5
# 开机自检:清理 U-Boot 网页刷机不请 overlay 的旧 JS 阴影
F=/overlay/upper/www/luci-static/resources/view/network/wireless.js
[ -f "$F" ] && ! grep -q 'freq.mhz>50000' "$F" && rm "$F"
F=/overlay/upper/www/luci-static/resources/view/network/network.js
[ -f "$F" ] && ! grep -q 'freq.mhz>50000' "$F" && rm "$F"

逻辑很直白:如果这个文件存在,但不包含 v36 补丁标记 freq.mhz>50000,就说明它是 opkg 时代的旧版本 —— 删掉它,让 overlay 自动回落到 /rom 里的新版本。

安全性:

  • 只针对这两个特定文件路径,不会乱动其它 overlay
  • 用补丁标记检测,不会误删正常文件
  • 幂等,每次开机跑一次
  • 净效果:U-Boot 网页刷机后不再需要任何手工 overlay 清理

预计 v38 build ~2 分钟(在 192.168.1.143 增量编译),其它 v37 全部继承。


还没解决的两个问题

1. IDM 下载群晖 20MB/s,SMB 到另一台机 55MB/s

体检期间用户报:IDM 下载 192.168.1.102(群晖)只有 20MB/s,SMB 到 192.168.1.175 能跑 55MB/s。

我从路由器分别 ping 两台:

.102 (群晖):  0% 丢包, avg 1.10ms
.175 (SMB):   0% 丢包, avg 1.06ms

隧道链路质量完全一样,瓶颈不在隧道。我顺手抓了 15 秒 IDM 下载的实际流量:

10.7s 226MB → 21.1 MB/s (隧道这边已经达成 21MB)

也就是说隧道只能给到 ~21MB/s —— 不是隧道满速,是 HTTP 流的实际吞吐受限。

我注意到一个细节:群晖的 MAC 00:e0:1e:2d:61:d8 不是群晖的 OUI(群晖应该是 00:11:32)。如果是黑群晖/虚拟机,虚拟网卡的上限可能就是 200Mbps 左右。

待用户验证:从 \\192.168.1.102 用 SMB 拷一个大文件。如果 SMB 也只有 ~20MB/s → 群晖这台机器本身上限就是这样(虚拟网卡/网线/CPU);如果能到 ~55MB/s → 纯群晖 HTTP 服务慢,IDM 换 SMB 共享盘就解决。

2. eth1 网线还在闪

6h 内 eth1 还闪了 1 次。早先 5 次,现在 1 次 —— 在好转,但还是不稳。建议换根网线,不急但早换早踏实。


致谢

  • 呼啦大棒(right.com.cn 教程)—— X1 Pro 刷机基础
  • Gzxhwq/hanwckf/padavanonly —— mt_wifi 闭源驱动 + ImmortalWrt 24.10 fork 预编译基线
  • Claude Code —— v36/v37 的补丁编写、squashfs 雕刻验证、永久方案设计
  • 办公室 OpenWrt / iKuai 至今没被动过,OpenClash nftables 链序安然无恙 —— 这就够了

关键词 / Tags

花生壳 X1 Pro · Cudy TR3000 · MT7981B · ImmortalWrt 24.10 · overlayfs 阴影 · U-Boot 网页刷机不清 overlay · v37 部署报告 · WireGuard 异地组网 · MSS clamp 持久化 · bridge-nf 开机时序 · Health Audit 7天 · rc.local 自检