飞牛OS (FNOS) 使用 MT7921U USB WiFi 6 网卡 — 完整攻略
适用设备:飞牛OS ARM64 NAS(OneThingCloud 某RK3566 等)
适配网卡:MediaTek MT7921AU / MT7921BU(USB WiFi 6)
内核版本:FNOS 6.12.41-trim(系统版本1.1.31)
更新日期:2026年4月26日

一、前言
飞牛OS 默认内核没有编译进 MediaTek mt76 WiFi 驱动,导致 MT7921U 等网卡插上后无法识别。本教程详细记录了:
- 如何在 FNOS 上编译 mt76 驱动,也可直接使用已经编译好的文件
- 如何正确加载驱动并配置 WiFi
- 如何解决大文件传输断流问题(两个独立原因)
- 如何让 WiFi 接口名固定为易记的
wlan0
- 最后,强烈建议各位把这个教程给到openclaw或者同类agent,让他们照做就行!
二、硬件与网络环境
测试设备
- NAS:某RK3566 T (ARM64 Rockchip RK3566)
- 固件:飞牛OS FNOS(Linux 6.12.41-trim,系统版本1.1.31)
- WiFi 网卡:MediaTek MT7921AU USB WiFi 6
- 路由器:中兴 BE7200 WiFi 7(5GHz WiFi 6,80MHz)
网络信息
- WiFi 协商速率:1200Mbps(WiFi 6, 80MHz)
三、编译 mt76 驱动
FNOS 6.12.41 内核没有自带 mt76 驱动,需要手动编译。如果懒得搞,也可以下载已经编译好的,然后直接到第四步
我用夸克网盘分享了「mt76.ko」,链接:https://pan.quark.cn/s/72e00815fce8 提取码:Dstx
3.1 环境确认
SSH 登录 NAS,执行:
# 查看内核版本
uname -r
# 应输出:6.12.41-trim
# 确认 kernel headers 可用
ls /usr/src/ | grep linux-headers
# 应显示:linux-headers-6.12.41-trim
# 确认 gcc 编译器
gcc --version
3.2 克隆驱动源码
注意:GitHub、Kernel.org 等在 FNOS 局域网上无法访问,需要从 Gitee 克隆。
cd /tmp
git clone https://gitee.com/mirrors_openwrt/mt76.git
cd mt76
# 查看源码日期
git log --oneline -1
3.3 修复 API 兼容性问题
FNOS 的 kernel headers 是裁剪版,缺少部分标准内核 API。直接编译可能会遇到 from_timer / timer_container_of 宏缺失的问题。
在 /tmp/mt76/mt792x_core.c 的 #include "dma.h" 之后加入:
#ifndef from_timer
#define from_timer(var, callback_timer, timer_fieldname) \
container_of(callback_timer, typeof(*var), timer_fieldname)
#endif
#ifndef timer_container_of
#define timer_container_of(var, callback_timer, timer_fieldname) \
container_of(callback_timer, typeof(*var), timer_fieldname)
#endif
3.4 编译
cd /tmp/mt76
# 设置环境变量
export KERNEL_VERSION=6.12.41-trim
export ARCH=aarch64
export CROSS_COMPILE=aarch64-linux-gnu-
# 清理旧编译产物
make -C /usr/src/linux-headers-$KERNEL_VERSION M=/tmp/mt76 clean
# 编译(单线程,FNOS 裁剪版内核 makefiles 不支持并行)
make -C /usr/src/linux-headers-$KERNEL_VERSION M=/tmp/mt76 modules -j1
# 编译完成后检查
ls -la /tmp/mt76/*.ko
# 应生成 mt76.ko(约 18MB)
3.5 验证编译产物
# 检查 vermagic 是否匹配当前内核
modinfo /tmp/mt76/mt76.ko | grep vermagic
# 应输出:6.12.41-trim SMP preempt mod_unload aarch64
四、安装模块
4.1 安装
# 备份旧模块(如果有)
sudo cp /lib/modules/6.12.41-trim/updates/mt76.ko \
/lib/modules/6.12.41-trim/updates/mt76.ko.bak
# 复制新模块到系统目录,如果是下载的话把/tmp/mt76/这个路径改为你的实际文件路径
sudo cp /tmp/mt76/mt76.ko /lib/modules/6.12.41-trim/updates/mt76.ko
# 更新模块依赖
sudo depmod -a 6.12.41-trim
# 卸载旧模块(如有)
sudo modprobe -r mt76 2>/dev/null
# 加载新模块
sudo modprobe mt76
4.2 验证加载
# 检查模块是否加载成功
lsmod | grep mt76
# 应输出:mt76 245760 0
# 查看驱动信息
sudo modinfo /lib/modules/6.12.41-trim/updates/mt76.ko | grep description
# 应包含:MediaTek MT7921U (USB) wireless driver
4.3 插入网卡并查看接口
插入 MT7921U 网卡,等待约 5 秒:
# 查看所有网络接口
ip addr
# 找到 WiFi 接口(MT7921U USB 会变成类似 wlx90de801c6c5a 这样的名字)
五、(可选)将接口名从 wlxMAC 改为 wlan0
Linux 默认把 USB WiFi 网卡命名为 wlx 开头加 MAC 地址后缀(一长串),可以通过 udev 规则固定为 wlan0。
查看网卡 MAC 地址:
ip addr | grep wlx
# 或者
cat /sys/class/net/wlx*/address
创建 udev 规则(将 xx:xx:xx:xx:xx:xx 替换为你的实际 MAC):
sudo python3 -c "
content = 'SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"xx:xx:xx:xx:xx:xx\", NAME=\"wlan0\"\n'
open('/etc/udev/rules.d/72-wireless.rules', 'w').write(content)
print('done')
"
使规则立即生效:
sudo udevadm control --reload-rules
sudo udevadm trigger --action=add --subsystem-match=net
之后接口名就固定为 wlan0 了。
六、WiFi 连接配置
6.1 通过 FNOS WebUI 配置(推荐)
- 打开 FNOS Web 管理界面(
http://你的NASIP)
- 进入「系统设置」→「网络」→「无线网络」
- 找到 USB WiFi 设备,选择你的 WiFi 热点,输入密码,保存
- 等待连接成功
6.2 命令行配置
IFACE=wlan0
# 启用接口
sudo ip link set $IFACE up
# 创建 wpa_supplicant 配置(把你的WiFi名和密码替换进去)
sudo wpa_passphrase "你的WiFi名称" "你的WiFi密码" \
| sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
# 停止现有进程
sudo killall wpa_supplicant 2>/dev/null
# 启动 wpa_supplicant
sudo wpa_supplicant -B -i $IFACE -c /etc/wpa_supplicant/wpa_supplicant.conf
# 等待连接
sleep 3
# 获取 IP(DHCP)
sudo dhclient $IFACE
# 查看连接状态
sudo wpa_cli -i $IFACE status
七、必做优化:解决大文件传输断流(重点!)
问题现象
上传大文件时,速度会一下子掉到 0,然后恢复,如此反复。
有两个独立原因,需要分别修复:
优化一:禁用网络接口 Runtime PM
原因: WiFi 接口默认启用了 runtime power management,空闲时会自动休眠导致断流。
检查:
sudo cat /sys/class/net/wlan0/power/control
# 输出 auto = 会断流,on = 正常
修复(临时,重启失效):
sudo sh -c 'echo on > /sys/class/net/wlan0/power/control'
修复(永久):
在 FNOS WebUI → 「系统设置」→「启动脚本」中加入:
for iface in /sys/class/net/wlx* /sys/class/net/wlan*; do
[ -d "$iface/power" ] && echo on > "$iface/power/control" 2>/dev/null
done
优化二:禁用 USB Scatter-Gather(高吞吐关键!)
原因: mt76 USB 驱动默认启用 scatter-gather,跟 FNOS ARM64 USB host 控制器存在兼容性问题,大流量时驱动内部丢包。这是高吞吐断流的主因!
检查:
cat /sys/module/mt76/parameters/disable_usb_sg
# N = 可能丢包,Y = 稳定传输
修复(临时,重启失效):
sudo -i
echo Y > /sys/module/mt76/parameters/disable_usb_sg
cat /sys/module/mt76/parameters/disable_usb_sg
# 应输出 Y
修复(永久):
echo 'options mt76 disable_usb_sg=Y' | sudo tee /etc/modprobe.d/mt76.conf
# 然后重启 NAS,或者重新插拔一次 USB 网卡
优化效果验证
两个优化都生效后,测试大文件传输:
# 监控丢包(应在持续传输时保持不增长)
for i in $(seq 1 20); do
echo "rx_drop=$(cat /sys/class/net/wlan0/statistics/rx_dropped) tx_drop=$(cat /sys/class/net/wlan0/statistics/tx_dropped)"
sleep 3
done
rx_errors / tx_errors 全程应为 0
rx_dropped 少量属于正常(USB 缓冲区边界情况),持续大量增长则未修复成功
- 大文件能够30-40MB/s 持续下载无断流