本文记录一次真实的 Linux USB Wi-Fi 6 网卡驱动安装过程。主机为 ARM64/aarch64 架构,系统为 Ubuntu 26.04.1 LTS,内核为 7.0.0-30-generic。由于主机原有有线网卡没有可用驱动,整个过程采用"Windows 笔记本联网下载 .deb → U 盘/移动存储介质拷贝 → ARM64 主机离线安装"的方式完成。
本文重点不是简单告诉你"输入哪条命令",而是把 AIC8800 驱动为什么安装失败、make/gcc 分别起什么作用、为什么需要 ARM64 版本、如何逐层补齐依赖讲清楚,方便复现。
<hr/>
本文使用的 USB Wi-Fi 6 无线网卡。网卡采用 AIC8800 方案,厂商提供的是一个 Debian .deb 驱动包。
-Fi 6 无线网卡。网卡采用 AIC8800 方案,厂商提供的是一个 Debian .deb 驱动包。
最初遇到的问题比较典型:
sudo dpkg -i wifi6-adapter-linux-driver.deb
安装过程中驱动开始编译内核模块,但最终报错:
make: command not found
解决 make 后,问题进一步暴露成:
gcc: No such file or directory
继续补齐 ARM64 GCC 15 编译环境后,最终完成了 AIC8800 驱动配置。
整个过程可以概括为:
USB Wi-Fi 6 网卡
↓
AIC8800 驱动 .deb
↓
dpkg 安装
↓
厂商 postinst 脚本
↓
make 编译内核模块
↓
gcc 编译 C 源代码
↓
生成 AIC8800 内核模块
↓
安装模块 + depmod + udev
↓
USB Wi-Fi 网卡正常工作
二、硬件与软件环境
1. 硬件环境
主机
本文使用的 Linux 主机为 ARM64 架构设备。
关键环境:
CPU 架构:aarch64 / ARM64
USB 接口:用于连接 USB Wi-Fi 6 网卡
具体 CPU 型号不是本文驱动问题的重点,因此这里主要关注架构。
USB 无线网卡
使用:
类型:USB Wi-Fi 6 无线网卡
芯片/方案:AIC8800
驱动版本:1.0.1.10
实际厂商驱动包:
wifi6-adapter-linux-driver.deb
驱动目录:
wifi6-adapter-linux-driver-V1.0.1.10/
├── Appendix/
├── read me.txt
├── Linux System Quick Installation Guide.pdf
└── wifi6-adapter-linux-driver.deb
注意:如果准备把本文发到 CSDN,建议把自己购买的 USB 网卡"品牌 + 具体型号"补在这里。例如:
XX品牌 XX型号 USB Wi-Fi 6 网卡(AIC8800)这样其他读者更容易判断自己的硬件是否适用。
辅助设备
由于主机原有有线网卡没有可用驱动,本次无法直接通过有线网络联网,因此还使用:
Windows 笔记本:负责联网下载 ARM64 软件包
U盘/移动存储介质:负责把 .deb 文件转移到 Linux 主机
2. 软件环境
主机系统:
Ubuntu 26.04.1 LTS
查看:
cat /etc/os-release
实际环境:
PRETTY_NAME="Ubuntu 26.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04.1 LTS (Resolute Raccoon)"
CPU 架构:
aarch64
查看:
uname -m
内核版本:
7.0.0-30-generic
查看:
uname -r
三、第一次安装驱动:为什么失败?
进入驱动目录:
cd ~/Desktop/wifi6-adapter-linux-driver-V1.0.1.10
执行:
sudo dpkg -i wifi6-adapter-linux-driver.deb
第一次最核心的报错:
make: command not found
最后:
make failed, install aic8800 wifi drvier failed
这时候很容易误以为:
"是不是这个 USB 网卡没有 Linux 驱动?"
其实不是。
因为从安装日志可以看到,驱动已经完成了:
udev done
cp fw done
之后开始执行:
make -C /lib/modules/7.0.0-30-generic/build \
M=/usr/src/AIC8800/drivers/aic8800 \
ARCH=arm64 CROSS_COMPILE= modules
这说明:
厂商提供的 .deb 并不是简单地复制一个已经编译好的 .ko 文件,而是在安装阶段针对当前 Linux 内核重新编译 AIC8800 内核模块。
因此,需要一个基本的 Linux 内核模块编译环境。
四、第一关:安装 make
因为主机无法联网,所以不能直接:
sudo apt install make
只能在可以联网的电脑上下载对应架构的 .deb。
本机架构是:
aarch64 / ARM64
因此下载:
make_4.3-4.1_arm64.deb
把文件复制到 Linux 主机后:
cd ~/Desktop
sudo dpkg -i make_4.3-4.1_arm64.deb
安装完成后验证:
make --version
实际得到:
GNU Make 4.3
Built for aarch64-unknown-linux-gnu
至此:
make ✅
五、第二次安装驱动:make 有了,又失败了
重新执行:
cd ~/Desktop/wifi6-adapter-linux-driver-V1.0.1.10
sudo dpkg -i wifi6-adapter-linux-driver.deb
这一次已经不再报:
make: command not found
说明第一步已经成功。
驱动真正进入了内核模块编译阶段:
make -C /lib/modules/7.0.0-30-generic/build \
M=/usr/src/AIC8800/drivers/aic8800 \
ARCH=arm64 CROSS_COMPILE= modules
但是出现:
make[3]: gcc: No such file or directory
以及:
/bin/sh: 1: gcc: not found
最后:
make failed, install aic8800 wifi drvier failed
这时候问题已经非常明确:
make ✅
gcc ❌
六、为什么选择 GCC 15?
驱动编译日志中有非常重要的一段:
The kernel was built by:
aarch64-linux-gnu-gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0
这意味着:
当前内核本身是使用 GCC 15.2.0 构建的。
因此本次选择:
GCC 15
ARM64
15.2.0-16ubuntu1
对应的软件包包括:
gcc-15_15.2.0-16ubuntu1_arm64.deb
gcc-15-aarch64-linux-gnu_15.2.0-16ubuntu1_arm64.deb
这里一定要注意:
主机是
aarch64/arm64,不能下载常见的amd64GCC 包。
七、GCC 不是一个 .deb 就能解决
第一次安装:
sudo dpkg -i gcc-15_15.2.0-16ubuntu1_arm64.deb
出现:
gcc-15 depends on gcc-15-aarch64-linux-gnu
因此继续安装:
gcc-15-aarch64-linux-gnu_15.2.0-16ubuntu1_arm64.deb
随后又出现依赖:
libcc1-0
libgcc-15-dev
继续补齐
libcc1-0
libgcc-15-dev
而 libgcc-15-dev 又进一步依赖:
libitm1
libasan8
liblsan0
libtsan2
libubsan1
libhwasan0
最终准备的 ARM64 GCC 相关包包括:
gcc-15_15.2.0-16ubuntu1_arm64.deb
gcc-15-aarch64-linux-gnu_15.2.0-16ubuntu1_arm64.deb
libgcc-15-dev_15.2.0-16ubuntu1_arm64.deb
libcc1-0_16-20260322-1ubuntu1_arm64.deb
libasan8_16-20260322-1ubuntu1_arm64.deb
libhwasan0_16-20260322-1ubuntu1_arm64.deb
libitm1_16-20260322-1ubuntu1_arm64.deb
liblsan0_16-20260322-1ubuntu1_arm64.deb
libtsan2_16-20260322-1ubuntu1_arm64.deb
libubsan1_16-20260322-1ubuntu1_arm64.deb
然后批量安装:
sudo dpkg -i *.deb
必要时处理已经处于"解包但尚未配置"状态的软件包:
sudo dpkg --configure -a
八、一个非常容易踩坑的问题:gcc-15 ≠ gcc
这是本次排障中非常关键的一点。
安装了:
gcc-15
并不一定代表:
gcc
这个命令已经可以直接调用。
AIC8800 驱动的 Makefile 实际调用的是:
gcc
所以排障时应该检查:
command -v gcc
command -v gcc-15
gcc --version
而不能只检查:
gcc-15 --version
驱动能否继续编译,最终看的是:
gcc --version
能否正常执行。
九、内核 Headers 是否存在?
驱动需要针对当前内核编译模块,因此还需要当前内核的 headers。
检查:
ls -ld /lib/modules/$(uname -r)/build
本次得到:
/lib/modules/7.0.0-30-generic/build
-> /usr/src/linux-headers-7.0.0-30-generic
因此:
这一项不需要再额外处理。
这也可以帮助我们判断问题所在:
make ✅
kernel headers ✅
gcc ❌
所以当时真正的阻塞点就是 GCC 编译器。
十、AIC8800 驱动的编译流程到底是什么?
把整个过程串起来以后,可以理解成:
AIC8800 USB Wi-Fi 6 网卡
│
▼
wifi6-adapter-linux-driver.deb
│
▼
dpkg 安装
│
▼
postinst 安装脚本
│
▼
make
│
▼
Linux Kernel Build System
│
├── 当前 Kernel Headers
│
└── gcc
│
├── gcc-15
├── gcc-15-aarch64-linux-gnu
├── libgcc-15-dev
├── libcc1-0
├── libasan8
├── libhwasan0
├── libitm1
├── liblsan0
├── libtsan2
└── libubsan1
│
▼
编译 AIC8800 内核模块
│
▼
安装内核模块 / depmod / udev
│
▼
USB Wi-Fi 网卡正常工作
因此这个问题实际上不是:
"怎么安装一个 Wi-Fi 网卡?"
而是:
"怎么为当前 ARM64 Linux 内核准备好能够编译 AIC8800 内核模块的环境?"
这也是这次排障最重要的认识。
十一、厂商驱动实际上编译了什么?
从日志可以看到:
CC [M] aic8800_fdrv/rwnx_wakelock.o
CC [M] aic8800_fdrv/rwnx_msg_tx.o
CC [M] aic_load_fw/aic_bluetooth_main.o
CC [M] aic_load_fw/aicbluetooth.o
这意味着 GCC 正在把 AIC8800 驱动源代码编译成 Linux 内核模块。
核心驱动源码目录:
/usr/src/AIC8800/drivers/aic8800
编译使用:
/lib/modules/7.0.0-30-generic/build
作为当前内核的构建环境。
因此 AIC8800 驱动和当前 Linux 内核之间并不是完全独立的。
十二、第一次排障时看到的其他报错
除了主要错误之外,日志里还有一些容易让人误判的信息。
1. rmmod 报模块未加载
rmmod: ERROR: Module aic8800_fdrv is not currently loaded
rmmod: ERROR: Module aic_load_fw is not currently loaded
这发生在驱动安装脚本尝试卸载旧版本驱动的时候。
含义更接近:
当前没有加载这些模块。
并不是:
USB 网卡坏了。
2. test: -lt: unexpected operator
驱动卸载脚本里出现:
/bin/sh: 1: test: -lt: unexpected operator
这是厂商脚本中的 Shell 判断语句兼容性问题。
本次驱动真正停止安装的原因不是这一条,而是后面的:
gcc: not found
所以排障时应该优先找"第一次真正导致编译退出的错误"。
3. pahole 版本警告
日志还有:
warning: pahole version differs from the one used to build the kernel
The kernel was built with: 131
You are using: 0
这属于 warning。
在本次错误阶段,真正让 GCC 编译任务停止的是:
/bin/sh: 1: gcc: not found
因此没有把 pahole 当成第一阻塞点。
后续如果 GCC 已经正常、驱动继续编译却因为 BTF/pahole 失败,再单独处理即可。
十三、为什么最后可以成功?
整个过程实际上是一步一步排除阻塞点。
最开始:
make ❌
gcc ❌
kernel headers ✅
第一步解决:
make ✅
gcc ❌
kernel headers ✅
于是驱动继续向下编译。
然后解决 GCC:
make ✅
gcc ✅
kernel headers ✅
于是 AIC8800 驱动的内核模块终于具备完整的编译条件。
最终用户确认:
AIC8800 USB Wi-Fi 6 网卡驱动配置成功 ✅
十四、以后如何快速排查同类问题?
以后如果拿到一个 Linux USB 设备驱动,不要一看到:
driver install failed
就直接认为:
"驱动不兼容。"
可以先按下面这个顺序:
第一步:看架构
uname -m
本例:
aarch64
因此下载:
arm64
的软件包。
第二步:看内核
uname -r
本例:
7.0.0-30-generic
第三步:看 headers
ls -ld /lib/modules/$(uname -r)/build
如果存在:
/lib/modules/7.0.0-30-generic/build
说明当前内核构建目录存在。
第四步:看 make
make --version
如果出现:
make: command not found
先解决 make。
第五步:看 gcc
gcc --version
如果出现:
gcc: command not found
说明还缺编译器。
第六步:再运行驱动安装
sudo dpkg -i wifi6-adapter-linux-driver.deb
十五、离线安装场景下的建议
由于有些实验室机器存在:
- 有线网卡没驱动;
- 无线网卡正在安装驱动;
- 暂时无法联网;
- 系统软件包又不完整;
所以以后给 ARM64 设备部署环境时,可以提前准备一个离线安装目录。
例如:
AIC8800_offline/
├── driver/
│ └── wifi6-adapter-linux-driver.deb
│
├── make/
│ └── make_4.3-4.1_arm64.deb
│
├── gcc/
│ ├── gcc-15_15.2.0-16ubuntu1_arm64.deb
│ ├── gcc-15-aarch64-linux-gnu_15.2.0-16ubuntu1_arm64.deb
│ ├── libgcc-15-dev_15.2.0-16ubuntu1_arm64.deb
│ ├── libcc1-0_16-20260322-1ubuntu1_arm64.deb
│ ├── libasan8_16-20260322-1ubuntu1_arm64.deb
│ ├── libhwasan0_16-20260322-1ubuntu1_arm64.deb
│ ├── libitm1_16-20260322-1ubuntu1_arm64.deb
│ ├── liblsan0_16-20260322-1ubuntu1_arm64.deb
│ ├── libtsan2_16-20260322-1ubuntu1_arm64.deb
│ └── libubsan1_16-20260322-1ubuntu1_arm64.deb
│
└── README.txt
这样以后重新安装或者给同门复现时,可以直接从 U 盘拷过去。
十六、常用检查命令
查看系统信息
cat /etc/os-release
uname -m
uname -r
查看 make
command -v make
make --version
查看 gcc
command -v gcc
command -v gcc-15
gcc --version
查看 Kernel Headers查看内核头信息
ls -ld /lib/modules/$(uname -r)/build
查看 AIC8800 软件包状态
dpkg -l | grep wifi6-adapter
查看 AIC8800 内核模块
find /lib/modules/$(uname -r) -type f | grep aic8800
十七、本次排障中的几个关键经验
1. 不要看到"驱动安装失败"就先怀疑硬件
第一次看到:
wifi6 driver install failed
并不能说明 USB 网卡硬件有问题。
继续往上看真正的错误:
make: command not found
这才是实际原因。
2. Linux 驱动安装包不一定只是"复制文件"
AIC8800 的这个 .deb 在安装阶段实际上会:
复制固件
↓
调用 make
↓
调用 gcc
↓
编译内核模块
↓
安装模块
↓
depmod
所以 Linux 驱动的安装包本身可能包含一套完整的源码编译流程。
3. ARM64 和 AMD64 不能混用
这是离线安装时非常容易踩坑的地方。
本机:
aarch64
因此软件包需要:
arm64
而不是
amd64
gcc-15不等于gcc
可能已经存在:
gcc-15
但还没有:
gcc
所以真正验证驱动编译环境时,应该测试:
gcc --version
而不是仅仅:
gcc-15 --version
5. dpkg 报错时不要无限重复安装驱动
例如:
dpkg: error processing package ...
不要马上重复:
sudo dpkg -i wifi6-adapter-linux-driver.deb
先看最前面的真正错误:
make: command not found
或者:
gcc: not found
把依赖补齐以后,再
sudo dpkg --configure -a
或者重新执行:
sudo dpkg -i wifi6-adapter-linux-driver.deb
十八、最终环境
本次最终完成的环境:
Ubuntu 26.04.1 LTS
aarch64 / ARM64
Kernel 7.0.0-30-generic
Kernel Headers ✅
GNU Make 4.3 ✅
GCC 15 ✅
AIC8800 Driver 1.0.1.10 ✅
USB Wi-Fi 6 网卡 ✅
最核心的故障链:
第一次:
make: command not found
↓
安装 make
↓
第二次:
gcc: not found
↓
安装 GCC 15 ARM64 及依赖
↓
gcc 可以正常调用
↓
重新运行 AIC8800 驱动安装
↓
AIC8800 驱动配置成功
十九、总结
这次配置 AIC8800 USB Wi-Fi 6 网卡最大的难点,其实并不是网卡本身,而是:
离线 ARM64 Linux 驱动编译环境的准备。
整个过程实际上涉及:
USB Wi-Fi 6 网卡
↓
AIC8800 驱动
↓
dpkg
↓
postinst
↓
make
↓
Linux Kernel Build System
↓
gcc
↓
ARM64 GCC 15
↓
Kernel Headers
↓
编译内核模块
↓
驱动安装完成
理解了这条链路以后,以后再碰到其他 Linux USB 网卡、摄像头、无线模块、传感器驱动,只要驱动也是通过源码编译内核模块,就可以采用类似的方法进行排障。
结语
本文记录的是一次真实的 AIC8800 USB Wi-Fi 6 网卡 Linux 驱动部署过程。
整个过程最大的价值,并不是记住某一个 .deb 文件名,而是理解:
厂商驱动 → 内核模块编译 → make → gcc → kernel headers → ARM64 架构匹配
这条完整链路。
对于实验室里的 ARM64 Linux 设备,特别是那些暂时没有网络、需要通过 U 盘离线配置环境的设备,提前准备好对应架构的软件包会大大降低后续部署难度。
本文环境版本、软件包版本和命令均来自本次实际部署记录。更换 Ubuntu 版本、内核版本或 CPU 架构后,软件包版本和依赖关系可能需要相应调整。
lock-viewer">
USB Wi-Fi 6 网卡
↓
AIC8800 驱动
↓
dpkg
↓
postinst
↓
make
↓
Linux Kernel Build System
↓
gcc
↓
ARM64 GCC 15
↓
Kernel Headers
↓
编译内核模块
↓
驱动安装完成
理解了这条链路以后,以后再碰到其他 Linux USB 网卡、摄像头、无线模块、传感器驱动,只要驱动也是通过源码编译内核模块,就可以采用类似的方法进行排障。
结语
本文记录的是一次真实的 AIC8800 USB Wi-Fi 6 网卡 Linux 驱动部署过程。
整个过程最大的价值,并不是记住某一个 .deb 文件名,而是理解:
厂商驱动 → 内核模块编译 → make → gcc → kernel headers → ARM64 架构匹配
这条完整链路。
对于实验室里的 ARM64 Linux 设备,特别是那些暂时没有网络、需要通过 U 盘离线配置环境的设备,提前准备好对应架构的软件包会大大降低后续部署难度。
本文环境版本、软件包版本和命令均来自本次实际部署记录。更换 Ubuntu 版本、内核版本或 CPU 架构后,软件包版本和依赖关系可能需要相应调整。