Ubuntu 26.04 ARM64 下 AIC8800 USB Wi-Fi 6 网卡驱动安装实战:从 make 缺失到驱动编译成功

本文记录一次真实的 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,不能下载常见的 amd64 GCC 包。


七、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-15gcc

这是本次排障中非常关键的一点。

安装了:

复制代码
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
  1. 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 架构后,软件包版本和依赖关系可能需要相应调整。

相关推荐
liferecords1 天前
第 5 讲 · 内存模型:复现一个“x86 能跑、ARM 挂掉“的 bug 并修好它
arm64·鲲鹏·内存模型·内存屏障·原子操作
金士顿2 天前
ASP.NET Core BackgroundService 深度解析:设备后台任务到底应该怎么设计
linux·嵌入式·asp.net core·arm64
潜创微科技13 天前
CH9153:USB 转千兆网口国产替代首选,Pin-to-Pin 直替 RTL8153、免改板免驱工业级
网卡·沁恒·千兆网卡
k4m7v2pz21 天前
交叉编译 Rust 到 aarch64 Linux 掌机:glibc 版本与 sysroot 重建的完整踩坑记录
rust·glibc·交叉编译·aarch64·zigbuild·sysroot
Quincy_Freak25 天前
银河麒麟终端数据处理标准化实践:SQLiteGo 效能评估与落地路径
sqlite·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
深圳联瑞电子LRLINK1 个月前
数据中心TOR交换机和服务器网卡怎么搭配
网络·网卡
Quincy_Freak2 个月前
银河麒麟 SQLite 实操:Excel 导入与 SQL 语法编辑功能详解摘要
数据库·arm·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
Quincy_Freak2 个月前
信创内网数据规范实践:银河麒麟下SQLite本地数据安全管理方案
数据库·sqlite·arm·数据库管理·大数据分析·银河麒麟·aarch64
咕咚.萌西3 个月前
ARMv8-A 体系架构
系统架构·arm64