飞牛 NAS 折腾记:腾达 W311MI驱动安装,实现开机自动连接

飞牛 NAS 折腾记:腾达 W311MI驱动安装,实现开机自动连接

2026-11-13 08:38:23 0点赞 0收藏 0评论

前言:一个 USB 无线网卡,为什么能折腾这么久?

最近给自己的飞牛 NAS 配置无线网络,买的是 Tenda 腾达 W311MI AX300 USB 无线网卡。

本来以为这是一件很简单的事情:插上 USB 网卡,连接 Wi-Fi,完事。

结果又折腾了好久才弄完。

第一次插上网卡,系统虽然能识别 USB 设备,却没有正常生成无线网络接口。后来好不容易找到驱动、编译成功,也成功连接上了 Wi-Fi,结果一关机再开机,网卡又没了。

重新折腾一遍,终于再次连上。可第二次重启,问题依旧。

前前后后折腾了好几个小时,查 USB 设备 ID、Linux 内核模块、驱动源码、符号冲突、固件路径和 systemd 启动顺序,最后才算真正解决。

这里记录一下过程,希望能帮到同样使用飞牛 NAS(N100),以及 AIC8800DC 芯片无线网卡的朋友。

飞牛 NAS 折腾记:腾达 W311MI驱动安装,实现开机自动连接

一、设备环境

配置NAS 系统:飞牛 NAS
CPU:Intel N100
无线网卡:腾达 Tenda W311MI AX300 无线芯片AIC8800DC
USB设备ID:2604:0013
系统内核:6.18.18.c1186-trim
系统架构:x86_64
无线网络:2.4GHz Wi-Fi

网卡直接插在主板的USB接口上,没有使用前置接口或者USB Hub。

提醒:本文针对的是 USB ID 为 2604:0013 的 AIC8800DC 设备,其他W311MI 或 AX300 网卡可以参考方案。如果你的网卡硬件版本不同,建议先确认 USB ID 和芯片型号。

二、第一次插上网卡:USB 能识别,无线接口却没有出现

插上网卡后,因为在网络设置里看不到无线网卡,因此我用ssh登陆nas查看,我首先检查 USB 设备:

lsusb

可以看到设备:

2604:0013 Tenda AIC8800DC

这说明 USB 设备本身已经被系统识别。

但是,执行这一句:

nmcli device status

却没有看到对应的 Wi-Fi 网络接口。

这里有一个容易混淆的地方:

USB 能识别设备,不等于 Linux 已经有了能够使用它的无线网卡驱动。

简单来说,系统知道你插了一个什么 USB 设备,但还没有正确加载对应的驱动程序。

继续查看内核模块:

lsmod | grep -iE 'aic|8800'

以及内核日志:

sudo dmesg | grep -iE 'aicwf_usb|rwnx_usb|aic8800DC|AIC_WIFI|aicbsp'

最终确认问题集中在 AIC8800DC 驱动上。

三、寻找驱动:终于找到支持 2604:0013 的版本

经过查找,最终找到一个 GitHub 项目:

aic8800dc-linux-patched

项目地址:

https://github.com/Kiborgik/aic8800dc-linux-patched

这个项目的 README 中明确列出了:

2604:0013 | Tenda W311MI v6.0 | 8800DC | _2604

这条信息非常关键。

因为原系统自带的驱动并没有正确匹配我的 USB 设备 ID,而这个修补版项目明确支持它。

1. 下载源码

git clone https://github.com/Kiborgik/aic8800dc-linux-patched.git

进入目录:

cd ~/aic8800dc-linux-patched/drivers/aic8800

2. 编译驱动

make -j2

编译完成后,主要会得到两个需要使用的驱动模块:

aic_load_fw/aic_load_fw.ko aic8800_fdrv/aic8800_fdrv.ko

简单解释一下:

  • aic_load_fw.ko:提供驱动需要的固件相关支持。

  • aic8800_fdrv.ko:无线网卡的主要功能驱动。

3. 复制到固定目录

为了避免后续依赖源码目录,我把编译好的模块复制到系统目录:

sudo mkdir -p /usr/local/lib/aic8800

sudo cp aic_load_fw/aic_load_fw.ko /usr/local/lib/aic8800/

sudo cp aic8800_fdrv/aic8800_fdrv.ko /usr/local/lib/aic8800/

至此,驱动编译成功。

但真正的麻烦才刚刚开始。

四、第一次加载驱动成功,却发现旧驱动存在冲突

最初尝试加载新驱动时,出现了一个错误:

exports duplicate symbol aicwf_prealloc_txq_alloc (owned by aic8800_bsp)

翻译成人话就是:两个驱动模块导出了同一个内核符号,发生了冲突。

检查系统已有模块:

lsmod | grep -E 'aic_load_fw|aic8800'

发现系统中原本就有旧版 aic8800_bsp 模块。

而新编译的 aic_load_fw 也导出了:

aicwf_prealloc_txq_alloc

所以需要先卸载旧模块:

sudo /sbin/rmmod aic8800_bsp

随后卸载旧版 aic_load_fw,再加载我们自己编译的版本。

加载新模块:

sudo /usr/bin/busybox insmod /usr/local/lib/aic8800/aic_load_fw.ko

再加载无线网卡主驱动:

sudo /usr/bin/busybox insmod /usr/local/lib/aic8800/aic8800_fdrv.ko

这里还有一个细节:飞牛系统没有提供普通的 insmod、modprobe 等命令,但系统中存在 BusyBox,因此可以通过:

/usr/bin/busybox insmod

来完成模块加载。

终于,网卡成功创建了无线接口。

为避免公开设备 MAC 信息,以下使用通用接口名称 wlan0 作为示例。

再执行:

nmcli device status

看到类似结果:

wlan0 wifi connected MyWiFi-2.4G

第一次成功!

当时以为大功告成,结果没想到后面还有两个坑。

五、第一个坑:关机再开机,网卡又消失了

手动加载驱动后,Wi-Fi 可以正常使用。

但是关机再开机,网卡又无法正常识别。

原因其实不复杂:

之前只是手动执行了 insmod,并没有配置开机自动加载。

Linux 内核模块不会因为上一次手动加载成功,就自动记住下次开机还要加载它。

更麻烦的是,系统原本还有一个配置文件:

/etc/modules-load.d/aic8800.conf

里面写着:

aic_load_fw aic8800_fdrv

这意味着系统启动时会尝试加载原有模块,而不是我们刚刚编译好的修补版驱动。

因此,我把原来的配置文件改名禁用:

sudo mv /etc/modules-load.d/aic8800.conf /etc/modules-load.d/aic8800.conf.disabled

然后准备通过 systemd 创建一个专门的启动服务。

六、第二个坑:驱动加载顺序不对,还是启动失败

第二次配置自动加载时,又出现了新的问题。

查看内核日志,发现大量类似错误:

aic8800_fdrv: Unknown symbol cfg80211_classify8021d aic8800_fdrv: Unknown symbol wiphy_register aic8800_fdrv: Unknown symbol cfg80211_put_bss

这次不是驱动本身的问题,而是加载顺序不正确。

aic8800_fdrv 依赖 Linux 无线网络子系统 cfg80211。

如果 cfg80211 还没有加载,就先加载无线网卡驱动,内核自然找不到对应的符号。

进一步检查发现,系统里的模块经过了 XZ 压缩:

/lib/modules/6.18.18.c1186-trim/kernel/net/rfkill/rfkill.ko.xz /lib/modules/6.18.18.c1186-trim/kernel/net/wireless/cfg80211.ko.xz

所以最终确定正确的加载顺序应该是:

  1. rfkill

  2. cfg80211

  3. aic_load_fw

  4. aic8800_fdrv

其中 rfkill 是无线设备开关管理模块,cfg80211 是 Linux 无线网络配置子系统。

这也是整个折腾过程中非常关键的一步。

七、最终解决方案:使用 systemd 实现开机自动加载

前面的问题全部弄清楚后,最终采用 systemd 创建一个 oneshot 服务。

这样每次 NAS 开机时,系统就会按照正确顺序加载依赖和驱动。

1. 创建服务文件

文件位置:

/etc/systemd/system/aic8800-wifi.service

执行:

sudo nano /etc/systemd/system/aic8800-wifi.service

写入以下完整内容:

[Unit] Description=AIC8800DC USB WiFi Driver After=systemd-modules-load.service Before=NetworkManager.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'set -e; loaded(){ grep -q "^$1 " /proc/modules; }; if loaded aic8800_bsp; then /sbin/rmmod aic8800_bsp; fi; if ! loaded rfkill; then /usr/bin/xz -dc /lib/modules/$(uname -r)/kernel/net/rfkill/rfkill.ko.xz > /run/rfkill.ko; /usr/bin/busybox insmod /run/rfkill.ko; fi; if ! loaded cfg80211; then /usr/bin/xz -dc /lib/modules/$(uname -r)/kernel/net/wireless/cfg80211.ko.xz > /run/cfg80211.ko; /usr/bin/busybox insmod /run/cfg80211.ko; fi; if ! loaded aic_load_fw; then /usr/bin/busybox insmod /usr/local/lib/aic8800/aic_load_fw.ko; fi; if ! loaded aic8800_fdrv; then /usr/bin/busybox insmod /usr/local/lib/aic8800/aic8800_fdrv.ko; fi' [Install] WantedBy=multi-user.target

这里面主要做了几件事情:

  • 检查旧的 aic8800_bsp 是否已经加载,如果加载了就卸载。

  • 检查 rfkill 是否加载,没有就解压并加载。

  • 检查 cfg80211 是否加载,没有就解压并加载。

  • 加载我们自己编译的 aic_load_fw。

  • 最后加载 aic8800_fdrv。

使用 loaded() 检查模块是否已经加载,可以避免重复插入模块。

2. 启用服务

执行:

sudo systemctl daemon-reload

然后:

sudo systemctl enable aic8800-wifi.service

检查:

systemctl is-enabled aic8800-wifi.service

正常情况下返回:

enabled

3. 手动测试服务

执行:

sudo systemctl restart aic8800-wifi.service

查看服务:

systemctl status aic8800-wifi.service --no-pager

成功时会看到:

Active: active (exited)

注意,active (exited) 并不是失败。

因为这是一个 Type=oneshot 服务,完成驱动加载后进程就会退出,systemd 仍然将服务标记为 active。

4. 检查无线网卡

nmcli device status

如果看到类似结果:

wlan0 wifi connected MyWiFi-2.4G

就说明当前驱动和 Wi-Fi 连接都正常。

八、最重要的一步:重启验证

这里必须强调:手动运行服务成功,并不代表开机自动加载一定成功。

所以最后还要进行一次真正的重启测试。

执行:

sudo reboot

等待 NAS 完全启动后,重新登录终端。

首先检查:

systemctl is-active aic8800-wifi.service

实际返回:

active

然后检查:

nmcli device status

实际结果中:

wlan0 wifi connected MyWiFi-2.4G enp2s0 ethernet connected Wired connection 2

也就是说:

  • USB 无线网卡正常识别;

  • 驱动自动加载;

  • Wi-Fi 自动连接;

  • 原有有线网络没有受到影响;

  • NAS 重启后不需要任何手动操作。

至此,整个问题终于彻底解决。

九、以后如果出现问题,可以怎么检查?

以后如果升级 NAS 系统或者内核,建议先检查下面几个项目。

检查服务:

systemctl status aic8800-wifi.service --no-pager

检查驱动:

lsmod | grep -E 'aic_load_fw|aic8800_fdrv|cfg80211|rfkill'

检查无线接口:

nmcli device status

查看启动日志:

sudo journalctl -u aic8800-wifi.service -b --no-pager

查看内核日志:

sudo dmesg | grep -iE 'aic|8800|cfg80211|firmware'

另外要注意:驱动是针对当前内核 6.18.18.c1186-trim 编译的。如果以后升级内核,可能需要重新编译驱动,同时检查 systemd 服务里依赖模块的路径。

十、最后总结

这次折腾下来,最大的感受就是:

Linux 下 USB 网卡能不能用,不只是看有没有驱动,还要看 USB ID 是否匹配、内核模块是否冲突、依赖是否正确,以及开机加载顺序是否合理。

整个过程可以归纳为:

阶段问题解决办法:第一次插入USB 能识别=》无线接口不存在=》找到支持 2604:0013 的驱动=》第一次安装=》新旧模块符号冲突=》卸载旧 BSP=》第一次连接Wi-Fi =》可以使用手动加载新驱动=》第一次重启驱动没有自动加载=》禁用旧模块=》加载配置=》第二次配置cfg80211 =》依赖缺失=》调整模块加载顺序=》最终配置需要自动加载和连接=》创建 systemd 服务=》最终重启=》再次验证开机自动识别=》自动连接成功

最终结论

这次问题并不是简单的 USB 网卡驱动安装问题,而是三个问题叠加:

  1. 驱动兼容性: 原系统驱动没有正确支持 Tenda W311MI AX300 的 USB ID 2604:0013。

  2. 内核模块冲突与依赖: 旧 BSP 和新驱动存在符号冲突,且主驱动依赖 cfg80211。

  3. 开机自动加载: 手动加载成功不等于重启后自动加载成功,需要通过 systemd 管理驱动加载顺序。

最终通过修补版 AIC8800DC 驱动、正确的模块加载顺序,以及 systemd oneshot 服务,实现了开机自动识别和自动连接。

当前已通过实际重启验证,不再需要每次开机手动安装或加载驱动。

如果你也使用飞牛 NAS、N100 小主机,以及采用 AIC8800DC 芯片的 USB 无线网卡,希望这篇文章能帮你少走一些弯路。

折腾几个小时,终于不用再每次开机手动加载驱动了。收工!
#飞牛 #飞牛NAS #飞牛无线网卡驱动

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章