Ubuntu 20.04下Intel无线网卡无法识别?编译安装iwlwifi驱动与固件全攻略
2026/9/24 8:50:03 网站建设 项目流程

装完 Ubuntu 20.04.6 LTS 系统,结果发现 WiFi 图标直接消失,网卡明明在设备列表里,却怎么都连不上网络——这个场景我太熟了。很多人第一时间想到换内核或者退回 Windows,但其实不用那么麻烦。拿我自己手头的 Intel AX211 无线网卡来说,只要手动编译安装一次驱动,问题就能彻底解决,整个过程并不复杂。

这篇内容适合所有在 Ubuntu 20.04.6 LTS 上遇到 Intel 无线网卡无法识别、WiFi 无法打开、找不到无线网卡设备的用户。我会以 AX211 为例,从问题原因、编译环境准备、驱动源码获取、编译安装到最终调试验证,一步一步带你走完整个流程。文章里的命令我全部实测过,直接复制就能用。

1. 先搞清楚为什么无线网卡不工作

1.1 问题场景复现:设备存在但驱动没加载

我手上这台机器装的是 Ubuntu 20.04.6 LTS,内核版本是 5.15.0-xxx-generic。装好系统进入桌面后,右上角只有有线网络和“飞行模式”的图标,WiFi 选项完全消失。打开终端执行lspci | grep -i network,能看到类似这样的输出:

00:14.3 Network controller: Intel Corporation Device 51f0 (rev 1a)

设备在,但系统认不出具体型号,这说明驱动层没有任何对应的处理逻辑。再执行dmesg | grep iwl或者ip link show,大概率什么都看不到,因为内核里根本没有为这个设备注册网络接口。

这个现象在 20.04 LTS 上非常典型,原因不是你的硬件坏了,也不是系统装失败了,而是内核自带的 iwlwifi 驱动版本太老,不支持 AX211 这么新的硬件 ID。Ubuntu LTS 版本为了稳定,内核不会频繁升级,所以对新硬件的支持天然滞后。

1.2 核心原因拆解:驱动、固件和设备 ID 的三重门槛

Intel 无线网卡在 Linux 下正常工作需要满足三个条件,缺一不可:

  • 内核里的 iwlwifi 驱动模块:负责和网卡硬件通信,向系统注册无线网络接口。
  • 对应的无线固件文件:驱动本身只是“脑子”,固件文件才是“经验库”,网卡需要加载固件才能执行具体的无线电收发逻辑。
  • 驱动代码中的设备 ID 匹配表:驱动源码里必须有一行记录,写明“PCI ID 51f0 是 AX211,由某型号固件驱动”,否则就算驱动和固件都装好了,硬件照样被忽略。

Ubuntu 20.04.6 自带的 5.15 内核里,iwlwifi 驱动其实是有的,但 5.15 内核发布的时候 AX211 还不是主流硬件,设备 ID 只覆盖到少数几个早期版本。这就是为什么设备能被lspci看到,却没法正常工作——驱动压根不认识它。

注意:如果你发现dmesg里有类似Direct firmware load for iwlwifi-ty-a0-gf-a0-77.ucode failed这样的报错,说明驱动已经加载了,只是固件文件缺失。这时候只需要手动放固件文件,不需要编译驱动。只有当设备 ID 完全不匹配、驱动没有加载时才需要走编译的路线。

2. 编译前的准备工作:依赖、源码和基础环境

2.1 确认硬件型号和内核版本

动手之前,先花两分钟确认一下你的硬件到底是什么型号、系统内核是什么版本。这一步决定了你要不要去编译驱动,以及编译哪个版本的驱动。

# 查看无线网卡的 PCI 信息 lspci -nnk | grep -i network # 查看当前内核版本 uname -r

如果Network controller后面显示的是Intel Corporation Device 51f0或者51f1一类的 ID,那基本可以确定是 AX211 或同代的 Gig+ 系列网卡。我的机器上输出是这样的:

00:14.3 Network controller [0280]: Intel Corporation Device [8086:51f0] (rev 1a)

其中8086:51f0就是 Intel 的 vendor ID 和设备 ID。AX211 常见的几个 ID 包括51f051f17af0等,不同批次会有区别,但处理方法完全一样。

2.2 安装编译工具链和内核头文件

驱动编译不是直接在系统上跑一个安装包,而是要把驱动源码放到内核模块源码树里编译成.ko文件。这个过程需要 gcc、make 和与当前内核完全对应的头文件。

直接执行这一步,把依赖一次装齐:

sudo apt update sudo apt install -y build-essential linux-headers-$(uname -r) git wget gcc make

这里最容易踩的一个坑是:linux-headers-$(uname -r)这个包可能装不上,因为默认的 apt 源里内核头文件版本和当前运行内核不是完全同步。如果遇到这种情况,先用apt search linux-headers-5.15看看源里有哪些版本,找一个和你uname -r最接近的版本装上。只要头文件的大版本号和运行内核一致,编译通常就没问题。

我测试时装的版本是5.15.0-91-generic,执行完uname -r后直接装对应的头文件就成功了。这一步别省,缺少内核头文件会导致编译一开始就报错,后面我还会在常见问题里提到。

2.3 网络临时方案:编译期间怎么联网

这是个很现实的问题——你的 WiFi 用不了,那怎么下载源码和依赖?我实测下来最靠谱的办法有三个:

  • 手机通过 USB 线共享网络:Android 手机插上 USB 线后,在设置里打开“USB 网络共享”,Ubuntu 会直接识别成一个有线网卡,不需要任何额外驱动。这是我最推荐的方式,稳定且不需要驱动。
  • 有线网线直连路由器:如果电脑有 RJ45 网口,插上网线后 Ubuntu 会自动获取 IP,一条网线解决所有问题。
  • USB 无线网卡临时顶替:手头如果有别的免驱 USB WiFi 网卡,也可以临时用一下。

我个人测试时用的是手机 USB 共享网络,整个过程大概十几分钟,下载速度足够快,完全能满足编译需求。

3. 核心方案一:backport-iwlwifi 驱动,省心第一

3.1 为什么要选 backport 而不是原版 iwlwifi

编译无线网卡驱动,网上一搜有一堆教程,有的让你直接去 Intel 官网下载最新固件,有的让你改内核启动参数,还有的让你升级整个内核。这些方法不是不行,但都不够“对症”。

其实 Intel 官方维护了一个专门用于旧内核 + 新无线网卡的源码仓库,叫backport-iwlwifi。这个名字里的 backport 翻译过来是“反向移植”,意思是把最新的 iwlwifi 驱动代码,移植到老内核上编译使用。它比直接拉取内核主线里的 iwlwifi 源码更省事,因为仓库里已经帮你处理好了大部分和旧内核的兼容性问题。

我之前也试过直接从git.kernel.org拉取最新的 iwlwifi-next 分支源码去编译,结果在 Ubuntu 20.04.6 这种老内核上遇到各种 API 不兼容的报错,比如implicit declaration of functiontoo many arguments to function之类。后来改用 backport 仓库,一次通过。所以如果你只是想让 AX211 在 Ubuntu 20.04.6 上跑起来,直接选 backport 是效率最高的路径。

3.2 完整编译安装流程

我用的源码仓库是 Intel 官方维护的 backport-iwlwifi,地址是git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git。整个流程分四步:拉取源码、生成默认配置、编译、安装。

# 1. 拉取源码 cd ~ git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git cd backport-iwlwifi # 2. 生成无线驱动的默认配置 make defconfig-iwlwifi # 3. 开始编译,-j 后面的数字改成你 CPU 核数的两倍 make -j$(nproc) # 4. 安装编译好的驱动模块 sudo make install

第 2 步的make defconfig-iwlwifi很关键,它会自动生成一个.config配置文件,这个文件决定了要编译哪些模块。对于我们的需求,只要编译 iwlwifi 相关模块就够了,不需要编译整个内核,所以千万别省这一步。

编译过程中终端会滚动大量输出,看到CCLDBuilding modules这些字样都是正常的。整个过程我这边大概花了 2 分多钟,比想象中快很多。如果你的 CPU 比较老,make -j$(nproc)可能会编译出错,可以先去掉-j参数,用单线程编译试试,虽然慢一点,但能避免内存不足或者任务调度的问题。

3.3 安装后的模块替换和加载

编译安装完成后,新的驱动模块会被放到/lib/modules/$(uname -r)/updates/drivers/net/wireless/intel/iwlwifi/这个路径下。这里需要特别注意:系统里其实已经有一个旧版 iwlwifi 模块,如果不做任何处理,直接重启后系统可能会加载旧模块,导致你白折腾半天。

# 查看当前已加载的模块信息 modinfo iwlwifi # 刷新模块依赖关系 sudo depmod -a # 卸载旧模块(如果已经加载) sudo modprobe -r iwlwifi # 加载新模块 sudo modprobe iwlwifi

执行完这一系列命令后,马上执行dmesg | tail -30,应该能看到类似这样的输出:

iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz iwlwifi 0000:00:14.3: loaded firmware version 77.2f9d47c9.0 ty-a0-gf-a0-77.ucode iwlwifi 0000:00:14.3: Microcode SW error detected. Restarting 0x0. # 如果有这行说明固件加载有问题,后面会讲

只要看到Detected Intel(R) Wi-Fi 6E AX211这行,说明驱动已经成功识别到硬件了。再执行ip link或者iwconfig,就能看到类似wlan0wlp0s20f3这样的无线网卡接口了。

我自己测试时,模块加载后 Wi-Fi 6E 的 AX211 接口就被正确识别了,右上角网络图标里直接出现了 WiFi 选项,连接到 5GHz 路由器后速度实测能达到 800Mbps 以上,和 Windows 下的表现基本一致。

3.4 让驱动在每次开机时自动生效

手动modprobe iwlwifi只对当前开机有效,重启后系统自己会去遍历/lib/modules下的模块文件。因为我们编译安装的模块已经放到了updates目录下,正常情况下系统启动时会优先加载updates里比原版更新版本的模块。但为了保险起见,还是建议做两件事:

第一,确认/etc/modules文件里是否已经有 iwlwifi 的加载记录。如果没有,可以手动加上:

echo "iwlwifi" | sudo tee -a /etc/modules

第二,检查 blacklist 配置。有些系统会自动生成一些模块黑名单,或者你自己之前手动黑名单过其他无线网卡驱动。执行一下这个命令,确认没有blacklist iwlwifi之类的配置:

grep -r iwlwifi /etc/modprobe.d/

正常情况下应该输出:

/etc/modprobe.d/iwlwifi.conf:options iwlwifi 11n_disable=1

这个11n_disable=1是老教程里常见的选项,作用是禁用 802.11n 的某些省电特性,解决网卡掉线问题。但 AX211 这种新网卡不需要这个参数,如果看到说明可以删掉或者保留,问题不大。关键是不要有blacklist字样。

4. 核心方案二:直接用 iwlwifi 官方源码编译

4.1 什么时候需要走官方源码路线

backport-iwlwifi 虽然省心,但它更新节奏不算最快,有时候你在安装某些特殊的无线网卡型号时会发现,它已经合并了最新代码。但在两种情况下,你需要考虑直接使用 iwlwifi 官方源码:

  • backport 仓库的 release 版本和你系统里某些内核补丁冲突,编译报错无法解决。
  • 你的网卡是极新的型号,backport 仓库还没来得及更新 ID 表,但 iwlwifi 主线源码里已经支持了。

我个人的习惯是:先试 backport,不行再拉官方源码。反正步骤差别不大,编译失败的成本很低,最坏也就是回到原状态。

4.2 官方源码的编译安装流程

iwlwifi 官方源码仓库地址是https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi.git,我一般会拉取iwlwifi-next分支,这个分支是面向新硬件的开发分支,对 AX211 的支持最全。

cd ~ git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi.git -b iwlwifi-next cd iwlwifi make defconfig-iwlwifi make -j$(nproc) sudo make install

注意一个细节:官方源码编译出来的模块会被放到不同的路径,和 backport 的updates目录不太一样。安装完成后强烈建议执行一次:

sudo depmod -a sudo modprobe -r iwlwifi sudo modprobe iwlwifi

确保新模块真正替换了旧模块。如果modinfo iwlwifi显示的filename路径还是原来的/lib/modules/.../kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko,说明系统的模块加载顺序没变,可能会导致新模块没生效。这时候可以手动删除或者用insmod强制加载新的.ko文件。

在实际测试中,官方源码和 backport 两个产物的最终效果没有区别,都是让 AX211 正常识别和联网。所以除非你有特殊需求,否则我建议优先选择 backport 方案,少踩坑。

5. 驱动装完还不能上网?固件文件与加载顺序

5.1 固件文件放哪里、怎么放

很多人在编译安装完驱动后,满心欢喜重启系统,发现 WiFi 还是不能用。这时候八九不离十是固件文件没放对位置。

Intel 无线网卡驱动本身不包含无线电发射逻辑,它只是一个“翻译官”,负责把 Linux 内核的命令转给网卡硬件。而网卡硬件真正执行的无线电参数、频道带宽、省电策略等逻辑,都打包在一个.ucode固件文件里。驱动加载时,会按照固定路径去查找固件文件:

/lib/firmware/

对于 AX211,驱动会在/lib/firmware/下寻找iwlwifi-ty-a0-gf-a0-77.ucodeiwlwifi-ty-a0-gf-a0-78.ucode等文件。如果找不到,dmesg里会明确报错:

iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-ty-a0-gf-a0-77.ucode failed with error -2

解决方法是下载 Intel 官方的 linux-firmware 仓库里的固件文件。你可以不要在整台机器上重新编译固件,只需要把几个关键的.ucode文件拷贝到/lib/firmware/目录下就行了。

cd ~ git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/linux-firmware.git cd linux-firmware sudo cp iwlwifi-ty-a0-gf-a0-*.ucode /lib/firmware/

注意:如果你用的是 backport 或者官方 iwlwifi 源码编译的驱动,驱动代码里会写死固件文件名。AX211 对应的是ty-a0-gf-a0系列的固件,不同网卡型号固件名前缀不一样,千万别把其他型号的固件拷过来。

拷贝完固件后,重新加载一次驱动:

sudo modprobe -r iwlwifi sudo modprobe iwlwifi

再查看dmesg | tail -20,如果看到loaded firmware version 77.字样,说明固件加载成功了。

5.2 从 dmesg 到最终联网的验证链路

驱动加载成功 ≠ 无线网络一定可用,中间还有几道验证环节。我每次装完驱动都会按下面的顺序排查一遍,基本十拿九稳:

第一,确认无线网络接口已经创建:

ip link

输出里如果能看到类似wlp0s20f3: <NO-CARRIER,BROADCAST,MULTICAST,UP>这样的接口,说明驱动和固件已经协同工作,接口层没问题。

第二,用nmcli或者右上角图形界面扫描 WiFi 网络:

nmcli device wifi list

能看到附近路由器广播的 SSID,就说明无线网卡搜台功能正常。

第三,连接一个 WiFi 网络测试实际连通性:

nmcli device wifi connect "你的WiFi名称" password "你的WiFi密码"

这一步成功以后,ping baidu.com能通,整个驱动安装就彻底完成了。

我自己的经验是:到第二步为止都正常,但第三步连接时如果一直转圈不成功,多半是系统 NetworkManager 缓存问题,重启一下网络服务就好:

sudo systemctl restart NetworkManager

6. 常见问题与排查技巧实录

6.1 Secure Boot 导致模块签名验证失败

这个问题在近几年出厂预装 Windows 的电脑上特别常见。主板开启了 UEFI Secure Boot 后,Linux 内核只允许加载经过签名的内核模块。我们自己编译的模块没有签名,系统会拒绝加载,dmesg里会出现类似这样的报错:

Lockdown: modprobe: modprobe: kernel is locked down, cannot load unsigned modules

解决办法有两种。最简单的就是进 BIOS 把 Secure Boot 关掉,第一次开机时按F2Del进 BIOS,找到Secure Boot选项设成Disabled保存退出。如果你需要保留 Secure Boot,就得走模块签名流程,在 Ubuntu 里安装shim-signedmokutil,然后用sign-file工具对编译出来的.ko文件签名,再进 MOK 管理界面导入公钥。这个过程比较繁琐,我实测下来绝大多数人不需要这么麻烦,直接关掉 Secure Boot 就能解决。

6.2 内核升级后驱动失效

Ubuntu 系统会不定期更新内核,比如从5.15.0-91-generic升到5.15.0-94-generic。每次内核升级后,/lib/modules/$(uname -r)/下的路径会变,我们自己编译的模块不会自动复制到新内核的模块目录下,导致重启后 WiFi 又消失。

这就是我前面为什么反复强调sudo depmod -a的原因。每次升级完内核,都先执行一遍:

sudo depmod -a sudo modprobe iwlwifi

然而对于普通用户来说,每次升级都要手动操作太麻烦。更省心的方法是使用 DKMS(Dynamic Kernel Module Support),让系统在升级内核时自动帮你重新编译和安装模块。在 backport-iwlwifi 源码目录下注册 DKMS 支持:

sudo apt install -y dkms cd ~/backport-iwlwifi sudo make DKMS=1 install

执行完这一条,以后每次内核升级,DKMS 都会自动重新编译 iwlwifi 模块并放到新内核目录下,再也不用担心升级完没 WiFi 了。我目前已经经历了两次内核小版本升级,完全没有再手动处理过驱动。

6.3 双系统切换后蓝牙与 WiFi 冲突

AX211 除了 WiFi 6E,还集成了蓝牙功能。在 Windows 和 Ubuntu 双系统环境下,经常出现一个问题:在 Windows 里关闭了蓝牙,切到 Ubuntu 后发现 BLuetooth 设备消失,有时候 WiFi 也跟着异常。

这里边的坑在于,Intel 的 WiFi 和蓝牙共用同一个射频模块,有一些电源管理和 RF 状态是存储在硬件寄存器里的,而 Windows 驱动在关机时可能会把射频状态写进一个“已关闭”的状态。解决方法是开机进入 Ubuntu 后重新初始化一次射频硬件:

sudo modprobe -r iwlwifi btusb sudo modprobe iwlwifi btusb

如果还是不行,直接在 Windows 里把电源选项中的“快速启动”关掉,再正常关机,然后开机进 Ubuntu。这个操作能解决九成以上的双系统无线硬件异常问题。

6.4 编译过程中常见的报错速查

我在给不同内核版本、不同机器编译驱动时,遇到过不少编译报错,这里整理几个典型问题:

错误信息片段原因解决方式
Unable to find the kernel source tree内核头文件没装重新执行sudo apt install linux-headers-$(uname -r)
error: implicit declaration of function ‘foo’源码版本和内核版本不匹配换 backport 仓库或切换分支
No rule to make target ‘modules’当前目录没有 Makefile先执行make defconfig-iwlwifi
Cannot use CONFIG_... is not set配置文件生成异常删掉.config重新生成,必要时make mrproper
/bin/sh: 1: bc: not found缺少 bc 工具sudo apt install bc
make[1]: *** [modules] Error 2代码有编译错误去掉-j参数单线程编译,查看具体报错行

遇到make报错,大部分人第一反应是去网上搜错误信息,但最优解其实是先确认自己的内核头文件版本是否匹配。我在帮朋友排查时发现,至少三分之一的人编译失败都是因为linux-headers-$(uname -r)这个包没装对或者版本不匹配。

7. 装好驱动后的一些后续延伸

7.1 顺手开启远程桌面连接

驱动装好、WiFi 连上之后,如果你的这台 Ubuntu 机器是放在书房、机柜或者没有显示器的地方,我建议顺手把远程桌面配置好,这样以后无论在哪儿都能直接连进去管理。Ubuntu 20.04.6 本身自带 RDP 远程桌面的能力,但默认没有开启。

在系统设置里搜索“共享”,打开“屏幕共享”并设置允许远程控制,然后在另一台电脑上用支持 RDP 的客户端连接它的 IP 地址就行。如果连接不顺畅,也可以装一个 xrdp:

sudo apt install -y xrdp sudo systemctl enable --now xrdp

对我来说,远程桌面最大的价值是:再遇到驱动升级、配置调整这些操作时,我不用跑到机器前面去插键盘显示器了,直接在笔记本上远程敲命令就好。

7.2 这套方法对其他 Intel 网卡同样适用

文章标题用的是 AX211,实际测试过程中我也顺手验证了 AX210、AX201、AX200 等几款常见的 Intel 网卡。结论是:只要你的网卡是 Intel 的 PCIe 无线网卡,并且系统是 Ubuntu 20.04 或 22.04 这一代,手动编译安装 iwlwifi 驱动的思路完全一致。

区别只在于固件文件名不同:AX210 用的是iwlwifi-ty-a0-gf-a0系列,AX201 用的是iwlwifi-so-a0-hr-b0系列,AX200 用的是iwlwifi-cc-a0-系列。遇到具体型号,只需要修改第 5.1 节里拷贝固件的命令,把文件名换成对应的型号就行。

另外,如果你在国产的银河麒麟 V10 系统上遇到同样的问题,其实也能套用这套流程。麒麟 V10 底层内核和 Ubuntu 基本相同,我自己在测试环境里试过,编译步骤完全一致,只要系统里装好 build-essential 和内核头文件就能正常工作。唯一的区别是模块安装路径和/lib/modules的目录名可能需要按照麒麟的实际环境微调。

结尾:一点个人的经验心得

编译无线网卡驱动这件事,第一次做的人总觉得高大上,其实真正操作下来也就几条命令的事。我踩过的最大的坑不是编译出错,而是搞混了驱动和固件的区别——驱动编译装了一大堆,最后发现问题只是固件文件没放对位置。后来我总结出一个原则:先查lspci确认硬件,再看dmesg定位报错,最后才动手编译。顺序对了,90% 的问题都能快速解决。

另一个实用的建议是,编译之前一定准备好手机 USB 共享网络这条路。很多人装 Ubuntu 的初衷就是 Windows 用腻了想换换口味,结果卡在没网没法装依赖这一步,特别沮丧。手机 USB 共享网络这个大招,能在没有网线、没有 WiFi 的情况下让你快速上网,一旦联网了,后面的所有操作都不再是问题。

你自己动手试过之后会发现,Linux 对硬件驱动的处理逻辑其实非常清晰,相比 Windows 那种黑盒式的安装过程,这种手动编译的方式反而能让你更清楚地理解系统是怎么和硬件打交道的。希望这篇内容能帮你摆脱 WiFi 不能用的问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询