飞牛 NAS 折腾记:腾达 W311MI驱动安装,实现开机自动连接
前言:一个 USB 无线网卡,为什么能折腾这么久?
最近给自己的飞牛 NAS 配置无线网络,买的是 Tenda 腾达 W311MI AX300 USB 无线网卡。
本来以为这是一件很简单的事情:插上 USB 网卡,连接 Wi-Fi,完事。
结果又折腾了好久才弄完。
第一次插上网卡,系统虽然能识别 USB 设备,却没有正常生成无线网络接口。后来好不容易找到驱动、编译成功,也成功连接上了 Wi-Fi,结果一关机再开机,网卡又没了。
重新折腾一遍,终于再次连上。可第二次重启,问题依旧。
前前后后折腾了好几个小时,查 USB 设备 ID、Linux 内核模块、驱动源码、符号冲突、固件路径和 systemd 启动顺序,最后才算真正解决。
这里记录一下过程,希望能帮到同样使用飞牛 NAS(N100),以及 AIC8800DC 芯片无线网卡的朋友。

一、设备环境
配置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
所以最终确定正确的加载顺序应该是:
rfkillcfg80211aic_load_fwaic8800_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 网卡驱动安装问题,而是三个问题叠加:
驱动兼容性: 原系统驱动没有正确支持 Tenda W311MI AX300 的 USB ID
2604:0013。内核模块冲突与依赖: 旧 BSP 和新驱动存在符号冲突,且主驱动依赖
cfg80211。开机自动加载: 手动加载成功不等于重启后自动加载成功,需要通过 systemd 管理驱动加载顺序。
最终通过修补版 AIC8800DC 驱动、正确的模块加载顺序,以及 systemd oneshot 服务,实现了开机自动识别和自动连接。
当前已通过实际重启验证,不再需要每次开机手动安装或加载驱动。
如果你也使用飞牛 NAS、N100 小主机,以及采用 AIC8800DC 芯片的 USB 无线网卡,希望这篇文章能帮你少走一些弯路。
折腾几个小时,终于不用再每次开机手动加载驱动了。收工!
#飞牛 #飞牛NAS #飞牛无线网卡驱动


登录