装完 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 包括51f0、51f1、7af0等不同批次会有区别但处理方法完全一样。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 function、too 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 相关模块就够了不需要编译整个内核所以千万别省这一步。编译过程中终端会滚动大量输出看到CC、LD、Building 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就能看到类似wlan0或wlp0s20f3这样的无线网卡接口了。我自己测试时模块加载后 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_disable1这个11n_disable1是老教程里常见的选项作用是禁用 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.ucode、iwlwifi-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 NetworkManager6. 常见问题与排查技巧实录6.1 Secure Boot 导致模块签名验证失败这个问题在近几年出厂预装 Windows 的电脑上特别常见。主板开启了 UEFI Secure Boot 后Linux 内核只允许加载经过签名的内核模块。我们自己编译的模块没有签名系统会拒绝加载dmesg里会出现类似这样的报错Lockdown: modprobe: modprobe: kernel is locked down, cannot load unsigned modules解决办法有两种。最简单的就是进 BIOS 把 Secure Boot 关掉第一次开机时按F2或Del进 BIOS找到Secure Boot选项设成Disabled保存退出。如果你需要保留 Secure Boot就得走模块签名流程在 Ubuntu 里安装shim-signed和mokutil然后用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然而对于普通用户来说每次升级都要手动操作太麻烦。更省心的方法是使用 DKMSDynamic Kernel Module Support让系统在升级内核时自动帮你重新编译和安装模块。在 backport-iwlwifi 源码目录下注册 DKMS 支持sudo apt install -y dkms cd ~/backport-iwlwifi sudo make DKMS1 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-iwlwifiCannot use CONFIG_... is not set配置文件生成异常删掉.config重新生成必要时make mrproper/bin/sh: 1: bc: not found缺少 bc 工具sudo apt install bcmake[1]: *** [modules] Error 2代码有编译错误去掉-j参数单线程编译查看具体报错行遇到make报错大部分人第一反应是去网上搜错误信息但最优解其实是先确认自己的内核头文件版本是否匹配。我在帮朋友排查时发现至少三分之一的人编译失败都是因为linux-headers-$(uname -r)这个包没装对或者版本不匹配。7. 装好驱动后的一些后续延伸7.1 顺手开启远程桌面连接驱动装好、WiFi 连上之后如果你的这台 Ubuntu 机器是放在书房、机柜或者没有显示器的地方我建议顺手把远程桌面配置好这样以后无论在哪儿都能直接连进去管理。Ubuntu 20.04.6 本身自带 RDP 远程桌面的能力但默认没有开启。在系统设置里搜索“共享”打开“屏幕共享”并设置允许远程控制然后在另一台电脑上用支持 RDP 的客户端连接它的 IP 地址就行。如果连接不顺畅也可以装一个 xrdpsudo 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 不能用的问题。
