GL-MT6000 CSI 固件预刷机审计:第一次刷机前的六项检查

作者 Wu Jun · 更新于 2026-10-29 · GL-MT6000, MT7986, OpenWrt, 固件校验, sysupgrade, Wi-Fi CSI, 回退 · 约 6 分钟

路由器镜像“能启动”不等于“适合这次实验”。它可能刷错板型、包含错误 Wi-Fi 固件、漏掉 CSI 符号、 没有 daemon,或者根本没有可验证的原厂回退文件。本文记录 2026-10-10 第一次 GL-MT6000 CSI 刷机前的 六项检查。

对本项目构建产物的检查属于 E 级证据。本站不发布该镜像文件;读者应使用下面命令检查自己构建的镜像。 预检只能证明产物来源与组件存在,不能证明固件运行时真的上报 CSI。运行证据是另行公开的 10 分钟原始抓包与数据集 [1] [2]。

已验证的产物集合

项目 验证值
目标板 glinet_gl-mt6000
内核 6.18.36
OpenWrt CSI 分支 tip aed26e5f95963cd725d9ff097c713af8c24afd35 [3]
mt76 pin 59676919ea408b0b13a9d23f2e2e1a1ab407fba1
sysupgrade 容器 GNU tar,含 CONTROL、kernel、root
sysupgrade 字节数 12,677,432
sysupgrade SHA-256 3226cde7201c43f2c015d1be035888bc269cc98070f678a03b1a185ca6c4defe
原厂回退镜像字节数 83,146,618
原厂回退镜像 SHA-256 4004632eaf516fd2844be0e5595b6e4171d243181ff49b81569b986c79007dae
Wi-Fi 固件字节数 2,229,264
Wi-Fi 固件 MD5 3ce21edabe201608e7bec0dd16898019
Wi-Fi 固件 SHA-256 86baa5bcb05436c23ac443dd937cbb6d8cc9920eab6fd86bc4421038f526a03a
固件构建串 ____00000020260515120459

原厂回退镜像来自 GL.iNet 官方 GL-MT6000 下载入口 [4]。上面的哈希只对应 本次实验下载的那个文件。以后重新下载同一版本也不能直接沿用哈希,必须在新的下载文件上重新计算。

检查 1:确认外层镜像和目标板

.bin 文件名不能作为证据。必须打开容器检查内部成员:

IMG=openwrt-mediatek-filogic-glinet_gl-mt6000-squashfs-sysupgrade.bin

shasum -a 256 "$IMG"
# 本次构建期望:
# 3226cde7201c43f2c015d1be035888bc269cc98070f678a03b1a185ca6c4defe

tar -tf "$IMG"
# sysupgrade-glinet_gl-mt6000/
# sysupgrade-glinet_gl-mt6000/CONTROL
# sysupgrade-glinet_gl-mt6000/kernel
# sysupgrade-glinet_gl-mt6000/root

tar -xOf "$IMG" sysupgrade-glinet_gl-mt6000/CONTROL
# BOARD=glinet_gl-mt6000

这一步能发现三种不同错误:

  1. 镜像在构建测试后被替换或损坏;
  2. 把 factory 镜像、其他设备镜像放进了 sysupgrade 文件名;
  3. 镜像目标是另一块 GL.iNet 或 OpenWrt 板卡。

哈希只能识别产物,不能自动建立信任。还要记录构建来源,并确认这个文件与可信构建的输出一致。

检查 2:回退镜像必须有独立身份

回退文件不能只是“放在桌面某处”的另一个 .bin,它必须是经过验证的具体产物:

shasum -a 256 mt6000-4.11.0_release3.bin
# 本次期望:
# 4004632eaf516fd2844be0e5595b6e4171d243181ff49b81569b986c79007dae

这份原厂镜像为 83,146,618 字节。应保存在路由器之外,把哈希写进实验记录,并在恢复电脑通过有线连接后 重新校验。GL-MT6000 的 U-Boot 恢复页为 192.168.1.1;进入恢复模式需要断电与按键, 因此真正的救砖演练要放在刷机窗口内完成。

预检记录没有发布或分发原厂二进制。官方下载页仍是来源,本地哈希只负责把恢复方案绑定到这次实际测试的文件。

检查 3:对 Wi-Fi 固件做双重识别

MT7986 Wi-Fi 固件独立于 OpenWrt 内核和 rootfs。本实验已知可工作的版本是 2026-05-15 构建:

md5sum mt7986_wm.bin
# 3ce21edabe201608e7bec0dd16898019

sha256sum mt7986_wm.bin
# 86baa5bcb05436c23ac443dd937cbb6d8cc9920eab6fd86bc4421038f526a03a

strings mt7986_wm.bin | grep -o '_[_0-9]*20260515120459' | head
# ____00000020260515120459

为什么还保留 MD5?MediaTek 固件生态与 CSI 项目一直用 3ce21eda… 作为紧凑的已知构建标识。 这里的 MD5 只用于精确识别版本,不能用来判断下载是否安全;完整性由 SHA-256 负责。

重要顺序是:

  1. 计算构建目录中 Wi-Fi 固件的哈希;
  2. 解开 sysupgrade 的 rootfs;
  3. 计算 rootfs 内 /lib/firmware/mediatek/mt7986_wm.bin 的哈希;
  4. 只有两者一致,才能确认打包过程没有替换固件。

只检查构建目录、不检查最终 rootfs,可能漏掉错误的软件包安装或镜像复制。

检查 4:证明 CSI 代码进入内核模块

镜像中存在 mt7915e.ko,不代表 CSI 路径被编译进去。本次验证搜索了实现相关字符串:

strings mt7915e.ko | grep -E \
  'mt7915_vendor_csi_ctrl|mt7915_vendor_csi_ctrl_dump|mt7915_get_csi_stats|csi_stats|data_i|data_q'

实际观察到的符号包括:

MTK_VENDOR_ATTR_CSI_DATA_I
MTK_VENDOR_ATTR_CSI_DATA_INFO
MTK_VENDOR_ATTR_CSI_DATA_Q
csi_stats
mt7915_get_csi_stats
mt7915_vendor_csi_ctrl
mt7915_vendor_csi_ctrl_dump

这比只看包名更有力:它证明即将在路由器加载的内核模块里存在 CSI 控制、dump 和数据字段。 但它仍然不能证明固件返回 CSI 事件。驱动和固件是两层,这正是“预检证据”和“运行证据”的核心区别。

驱动来自上游 mt76,CSI 改动叠加在其上 [5]。本文锁定了具体社区分支与 commit, 方便其他人重复检查 [3]。

检查 5:确认用户态程序与自启动

CSI 采集还需要控制工具和 daemon。镜像 rootfs 中存在:

/usr/sbin/mt76-vendor
/usr/sbin/mt76-csi-daemon
/etc/init.d/mt76-csi
/etc/mt76-csi.conf
/etc/rc.d/S95mt76-csi
/etc/rc.d/K10mt76-csi

两个 rc.d 链接很重要:二进制存在但从不启动,不能算可用镜像。刷机后应分别检查软件包与服务:

apk info -e mt76-vendor mt76-csi-daemon luci-app-csi
/etc/init.d/mt76-csi enabled && echo enabled
lsmod | grep -E 'mt7915e|mt76'
find /sys/kernel/debug -name csi_stats

服务成功启动也不能推出“已经产生帧”。下一道验收门是收到符合 256 子载波形状、并能按 chain_info 分组的 UDP 记录。

检查 6:在 manifest 中锁定包版本

镜像安装清单里的关键行:

kmod-mt7915e - 6.18.36.2026.07.01~59676919-r100
kmod-mt7986-firmware - 6.18.36.2026.07.01~59676919-r100
mt7986-wo-firmware - 20260622-r1
mt76-vendor - 1
mt76-csi-daemon - 1.0.0-r3
luci-app-csi - 0.260905.03384

这些名称与版本让另一名研究者能对比不同构建,而不是只留下“我用了 OpenWrt”这一句。内核包版本还把 mt76 pin 暴露在软件包 release 中。

当时通过了什么,没通过什么

刷机前通过:

刷机前没有证明:

这些问题只能上真机。项目后来继续发布原始记录、10 分钟校验值、时间轴审计和 Wi-Fi 变慢实验, 而不是停在“镜像里有 CSI 代码”这一步。

刷机当天的顺序

本次采用的保守顺序是:

  1. 先验证能进入 U-Boot 恢复页,但不上传文件;
  2. 再次校验原厂回退镜像;
  3. 拔掉 WAN,只保留电脑到 LAN 口的有线连接;
  4. 刷 sysupgrade,不保留原配置;
  5. 访问临时 LAN 地址,在重新接 WAN 前先把网段移出上游冲突范围;
  6. 校验 Wi-Fi 固件、模块、服务、debugfs 节点与 UDP 输出;
  7. 在 CSI 与正常 Wi-Fi 双双通过前,始终保留回退镜像。

当路由器和上游网关都使用 192.168.1.1/24 时,断开 WAN 不是可选步骤。否则首启地址会与家庭网关冲突, 把“网段冲突”误判成“刷机失败”。

下载脱敏后的预检记录

记录刻意去掉了内部 IP、用户名、本地文件路径和固件二进制。它保留的是对比构建所需的数值, 不公开实验室网络信息。

参考与数据来源

本文的每条外部结论都标注来源与证据等级(分级标准);标注 E 级的是本项目可复现的实测数据。

  1. E 级 · 本项目实测 本项目 10 分钟实测抓包(57,293 条 / 600.0 s,SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    okwujun.pw/zh/datasets/ · 核实: 分片重组逐字节校验通过(2026-10-11) · 本地原始母片 SHA-256 为 00373f83…95e2;公开下载的是去标识派生文件,SHA-256 为 527466ce…a440,两者不可混用。
  2. E 级 · 本项目实测 Router CSI Lab — GL-MT6000 (MT7986) Wi-Fi CSI dataset, 10 s sample + 10 min capture
    Router CSI Lab · 2026
    doi:10.5281/zenodo.23434789 · 核实: CC BY 4.0;SHA-256 已发布;Zenodo DOI 10.5281/zenodo.23434789 · 数据集已获 Zenodo DOI(10.5281/zenodo.23434789),可直接引用。
  3. D 级 · 预印本/百科 ossiemarks/openwrt — feature/csi-mt7915 CSI stack
    ossiemarks
    github.com/ossiemarks/openwrt/commit/aed26e5f95963cd725d9ff097c713af8c24afd35 · 核实: Public commit page fetched 2026-10-29; community project, not peer-reviewed. · 本项目构建所用的社区 OpenWrt CSI 分支。其存在不证明 MT7986 能出帧,后者必须由本项目实机数据验证。
  4. C 级 · 官方资料 GL.iNet download center — GL-MT6000 firmware
    GL.iNet
    dl.gl-inet.com/router/mt6000/stable · 核实: Official download page fetched 2026-10-29; used only to establish the vendor rollback source, not to claim a checksum without a downloaded file. · GL-MT6000 官方固件下载入口。回退镜像的实际哈希必须对下载文件重新计算。
  5. C 级 · 官方资料 openwrt/mt76 — mac80211 driver for MediaTek Wi-Fi chipsets
    OpenWrt project / MediaTek
    github.com/openwrt/mt76 · 核实: GitHub API 2026-10-11 (stars 890, last push 2026-10-08) · 本项目使用的开源 mt76 驱动上游;CSI 能力的补丁正是在这一代码库之上编排。