收起左侧

飞牛OS (FNOS) 使用 MT7921U USB WiFi 6 网卡 完整攻略

1
回复
93
查看
[ 复制链接 ]

3

主题

5

回帖

0

牛值

系统先锋体验团🛩️

飞牛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日


image.png

一、前言

飞牛OS 默认内核没有编译进 MediaTek mt76 WiFi 驱动,导致 MT7921U 等网卡插上后无法识别。本教程详细记录了:

  1. 如何在 FNOS 上编译 mt76 驱动,也可直接使用已经编译好的文件
  2. 如何正确加载驱动并配置 WiFi
  3. 如何解决大文件传输断流问题(两个独立原因)
  4. 如何让 WiFi 接口名固定为易记的 wlan0
  5. 最后,强烈建议各位把这个教程给到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 配置(推荐)

  1. 打开 FNOS Web 管理界面(http://你的NASIP
  2. 进入「系统设置」→「网络」→「无线网络」
  3. 找到 USB WiFi 设备,选择你的 WiFi 热点,输入密码,保存
  4. 等待连接成功

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 持续下载无断流
收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

1

主题

28

回帖

0

牛值

江湖小虾

大佬你这个是arm的,x86的能用吗??

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则