1. 开局先确认问题:你的网卡到底什么状态
接手这个问题的第一周,我几乎每天都在跟"WiFi 图标消失"“连接一会儿就断”"系统设置里看不到无线网卡"这类描述打交道。说实话,十个咨询的人里面,有八个其实不是同一个故障,只是表现很像。盲目去搜"Intel wifi 驱动"然后照着一篇教程敲命令,大概率越搞越乱。
Ubuntu 20.04 下 Intel WiFi 出问题,常见的表象就三种:开机后无线网卡完全不被识别、能识别但反复断连、能连上但速度异常。它们的成因可能完全不同,第一步永远是收集信息,别急着动系统。
1.1 用 lspci 确认网卡型号
打开终端,先跑这条命令:
lspci -nnk | grep -i net -A 3输出大致长这样:
02:00.0 Network controller [0280]: Intel Corporation Wi-Fi 6 AX200 [8086:2723] (rev 1a) DeviceName: WLAN Subsystem: Intel Corporation Wi-Fi 6 AX200 [8086:0084] Kernel driver in use: iwlwifi重点看两处:
Kernel driver in use后面是否显示iwlwifi。如果显示(null)或者干脆没有这一行,说明内核根本没加载驱动。- 方括号里的
[8086:2723]是 PCI 设备 ID,8086是 Intel 的厂商 ID,后面四位是设备 ID。这个 ID 是判断固件匹配的黄金标准,比网卡名字更精确。
也有一种情况是网卡是新到的 AX210、AX411 这类,lspci 能认出来,但内核版本太老,不认得它的设备 ID,此时Kernel driver in use同样可能为空。这种情况往往不是驱动模块缺失,而是内核里的iwlwifi版本太旧,根本不认识这颗芯片。
1.2 看 dmesg 日志:驱动到底抱怨了什么
lspci只是静态信息,真正有价值的在日志里。接着敲:
dmesg | grep -i iwl dmesg | grep -i wifi常见的关键日志有这么几类,每一类指向的问题完全不同:
| 日志关键字 | 含义 | 初步判断 |
|---|---|---|
iwlwifi: No suitable firmware found! | 找不到匹配的固件文件 | 固件缺失或版本不匹配 |
Direct firmware load for iwlwifi-*.ucode failed with error -2 | 固件加载失败 | 固件文件不存在或路径不对 |
Unsupported splx | 固件与驱动版本不匹配 | 固件太老或驱动太新 |
Timeout waiting for hardware completion | 硬件响应超时 | 经常伴随射频开关问题或 PCIe 链路问题 |
HW Error | 硬件报错 | 可能是固件 bug,也可能是硬件真的有问题 |
Failed to load firmware chunk | 固件传输中断 | 常见于休眠唤醒后 |
看懂了这些,你就知道该往哪个方向使劲了。固件缺失的问题最简单,补固件就好;硬件报错的问题就比较麻烦,可能需要换驱动参数甚至换内核版本。
1.3 rfkill 和 NetworkManager 状态检查
还有一个很常见但时常被忽略的坑:rfkill软阻塞。某些笔记本有飞行模式快捷键,或者某些 BIOS 的无线开关状态不对,系统能看到网卡、驱动也能加载固件,但无线被软件层面关掉了。
rfkill list输出:
0: phy0: Wireless LAN Soft blocked: no Hard blocked: no只要Soft blocked是yes,网卡就起不来。解除方法:
rfkill unblock all如果Hard blocked: yes,那是硬件层面的物理开关或 BIOS 设置,软件无解,得去笔记本设置里找。
NetworkManager 的状态也值得扫一眼:
nmcli radio输出WIFI enabled就说明没问题。如果看到WIFI disabled,先执行:
nmcli radio wifi on我见过不少人折腾半天驱动,结果就是飞行模式没关。先花两分钟走完这三条命令,能避开一半的无效工作。
2. 驱动与固件:先说清楚它俩的关系,再决定动谁
很多朋友对"驱动"的理解是:装一个软件就行。但 Linux 无线网卡这块,"驱动"其实是两层东西:内核里的设备驱动模块,和网卡硬件里跑的固件。两者缺一不可。
2.1 iwlwifi 是驱动,iwlwifi-*.ucode 是固件
iwlwifi是 Intel 无线网卡在内核里的设备驱动模块,它负责跟 PCIe 总线对话、管理电源状态、处理上层协议。但网卡本身是个小型计算机,它自己有处理单元,需要接受一段微代码才能工作,这段微代码就是固件,以iwlwifi-*.ucode的形式存放在文件系统里。
驱动和固件必须配套。驱动版本太新,固件太老,会报Unsupported splx;驱动版本太老,固件太新,也可能加载失败。
Ubuntu 20.04 的软件源里有一个linux-firmware包,里面包含大量硬件固件。大部分 Intel 网卡的固件就在这个包里面,正常情况下不需要去 Intel 官网手动下载,因为 Ubuntu 已经帮你打好包了。但它有个自然滞后性:新网卡发布后,需要一段时间才会进入 Ubuntu 软件源,除非你用 HWE(Hardware Enablement)内核栈,它带的新固件更新更快一些。
2.2 内核版本决定了驱动能力的边界
Ubuntu 20.04 默认内核是 5.4,这个版本对 Intel 网卡的支持属于“稳定但并非最新”。它对 AX200、AX201、AX210 的支持逐步完善,但 AX411、BE200 这类较新的网卡,5.4 内核根本不认识,因为设备 ID 不在支持列表里。
如果你用的是新网卡,不要先急着折腾固件,先看看内核版本:
uname -r如果输出是5.4.0-xxx-generic,而你手里是一张 AX210 或更新的卡,那问题大概率出在内核太老。这时候装 HWE 内核,比手动编译什么驱动都高效。
2.3 别把问题想复杂:大多数情况是固件缺失
我统计过一段时间内遇到的同类案例,大约七成是固件文件缺失或者版本落后,两成是内核太老,真正需要手动编译驱动的不到一成。所以推荐的处理顺序永远是:
- 先确认固件是否完整
- 再考虑升级内核
- 最后才考虑手动编译 backport 驱动
这套顺序的背后逻辑是:固件和内核都是系统包管理器直接管理的东西,操作简单、回滚容易、风险最低。手动编译驱动虽然听起来"专业",但它需要编译环境、内核头文件、工具链,而且每次内核升级后模块可能失效,维护成本明显更高,不该成为首选方案。
3. 实操:四套方案按顺序来,先软后硬
下面这几套方案按风险从低到高排列。请一项一项试,别跳着来。很多人在第一步就能解决问题。
3.1 方案一:更新 linux-firmware 包
这个方法适用于dmesg里出现Direct firmware load for iwlwifi-*.ucode failed或No suitable firmware found的情况。意思是系统认得你的网卡,驱动也加载了,但固件文件没找到,或者不匹配。
sudo apt update sudo apt install linux-firmware装完之后,重启或者重新加载模块:
sudo modprobe -r iwlwifi sudo modprobe iwlwifi如果用modprobe -r卸载时报错Module iwlwifi is in use,说明无线网络管理程序还在占用,先停掉:
sudo systemctl stop NetworkManager sudo modprobe -r iwlwifi sudo modprobe iwlwifi sudo systemctl start NetworkManagerUbuntu 20.04 还有个特性:linux-firmware更新后,如果固件版本与当前内核不兼容,可能出现Unsupported splx报错。这种情况通常出现在老内核 + 新固件上。如果你不想升级内核,可以保留旧固件版本,用apt锁定版本。但说实话,大部分情况下直接升级内核更省事。
3.2 方案二:启用 HWE 内核
HWE(Hardware Enablement)是 Ubuntu 提供的新内核栈,给长期支持版带来更新的内核和驱动支持。Ubuntu 20.04 的 HWE 内核最初是 5.8,后来逐步跟进到 5.11、5.15。它的作用就相当于给 LTS 版本持续换血,特别适合新硬件。
sudo apt install linux-generic-hwe-20.04装完后重启,用uname -r确认已进入新内核。
HWE 内核升级后,原来的旧内核还在,不会立刻删除。如果新内核出现其他兼容性问题,重启是按 Shift 进入 GRUB 菜单,选Advanced options for Ubuntu,可以切换回旧内核启动。这个回滚机制是我一直建议用 HWE 而不是自己下载内核的原因之一,出问题有退路。
换内核后,iwlwifi模块会自动使用新版本。多数情况下,新旧内核之间的iwlwifi差异足够大,新网卡能直接被识别出来。
3.3 方案三:检查并手动放置 Intel 固件文件
如果linux-firmware已经是新版,内核也升级了,但dmesg仍然报固件加载失败,可能缺的是某个特定型号的固件文件。这时候可以到 Intel 的 Linux 无线支持仓库下载对应的固件,手动放入/lib/firmware。
注意:这里要明确一个常识,Intel 官方驱动包的固件文件并不总是最新的,反而各类发行版仓库里的linux-firmware更接近出厂状态。手动下载固件是迫不得已的补救手段,不是首选。
具体操作:
cd /lib/firmware ls | grep iwlwifi确认你的网卡所需的固件文件是否在里面。比如 AX200 需要iwlwifi-cc-a0-*.ucode,AX210 需要iwlwifi-so-a0-*.ucode。缺哪个就把对应的.ucode文件复制进去,然后重新加载模块。
放文件时注意文件权限,固件文件不需要执行权限,644就够了。放完一定要执行:
sudo update-initramfs -u sudo reboot跳过update-initramfs会导致一个问题:initramfs 是早期启动阶段加载的临时文件系统,如果固件文件需要在这个阶段就加载,你不更新初始内存盘镜像,重启后依然找不到固件。这是我常看到的一个疏忽点。
3.4 方案四:编译安装 backport 驱动
当新内核和最新固件都解决不了问题时,才进入这个环节。backport 是把新版本内核的iwlwifi驱动移植到旧内核上编译安装,比直接换内核更精确,但维护成本也高,内核一升级模块就得重编。
严格来说,在 Ubuntu 20.04 上,我更推荐直接升 HWE 内核而不是编 backport。因为 HWE 内核本身就是官方维护的,不需要你每次手动编译。backport 适合的场景是:你用的是某个很特殊的发行版,内核版本固定不能动,但必须用新版驱动。Ubuntu 用户遇到这种情况极少。
如果确实需要,流程是这样的:
sudo apt install build-essential git git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git cd iwlwifi-next make defconfig-iwlwifi make -j$(nproc) sudo make install编译时间视机器性能而定,一般 5 到 15 分钟。生成的模块会替代内核自带的iwlwifi。实测下来,这个方法在多数情况下有效,但每次内核升级后,模块需要重新编译。不推荐普通用户走这条路。
3.5 方案五:调整内核参数解决射频与省电问题
有一类问题比较隐蔽:驱动能加载、网卡能识别、固件正常,但连接质量极差,或者休眠唤醒后 WiFi 消失。这类问题通常和 PCIe 电源管理、射频状态有关。
在/etc/default/grub里找到这行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"把它改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=off"执行:
sudo update-grub sudo rebootpcie_aspm=off的意思是关闭 PCIe 链路的主动电源管理。有些笔记本的 BIOS 对 PCIe ASPM 支持不完善,网卡在省电状态切换时出现硬件超时或死锁,表现就是断流、休眠后掉网。关掉 ASPM 能立竿见影,代价是功耗略微上升,对笔记本续航影响大概在 5% 以内。这个参数对台式机的意义不大,主要针对笔记本。
还有人会遇到 5GHz 频段搜不到的问题,这通常是国家/地区码导致的。默认情况下,网卡可能会使用错误的无线调节域,导致某些信道不可用。可以临时测试:
sudo iw reg set CN如果设置后能看到更多 5GHz 信道,就需要把设置固化。但这一步涉及到无线法规,不同国家的信道开放情况不同,建议保持默认,除非你确认自己的设备所在地区法规允许。
4. 高频故障点与踩坑记录
这部分我打算按"症状 -> 排查方向 -> 解决办法"的思路整理,包含一些容易被文档忽略的细节。
4.1 症状一:WiFi 开关打不开,界面置灰
排查顺序:
rfkill list nmcli radio sudo systemctl status NetworkManager如果rfkill显示Soft blocked: yes,执行rfkill unblock all后立刻变no,问题就解了。但要注意:有些软件在系统启动后会再次设置软阻塞,比如rfkill服务或者某些省电脚本。此时可以检查/etc/rc.local或 systemd 服务中有没有设置rfkill block的规则。
另外,NetworkManager 如果状态异常,重启它试试:
sudo systemctl restart NetworkManager还有一个偏门但真实存在的坑:/etc/network/interfaces里如果写了旧的网络配置,可能会干扰 NetworkManager 对无线接口的管理。如果你之前手动配置过网络,检查一下这个文件。
4.2 症状二:能连接但频繁掉线
这种问题优先考虑电源管理。Ubuntu 20.04 的 NetworkManager 默认开启了 WiFi 省电模式,有些网卡和驱动组合在省电切换时会有问题。
关闭 WiFi 省电:
sudo iw dev wlp2s0 set power_save off临时测试,如果有效,就把它固化进 systemd 服务,写一个简单的服务脚本,开机自动设置。
另外,2.4GHz 和 5GHz 双频并发的情况下,路由器设置的自动切换频段也可能触发问题的假象。可以先用nmcli固定连接一个已知稳定的 AP,排除变量:
nmcli device wifi connect "你的SSID" password "你的密码"还有一类情况被很多人误解:掉线的不是网卡,而是 DHCP 租约出了问题。现象是 WiFi 图标显示已连接,但上不了网。这时候看系统日志:
journalctl -u NetworkManager -f看到频繁的DHCPDISCOVER、DHCPOFFER、DHCPREQUEST循环,说明是路由器 DHCP 的服务有问题,跟 Intel 驱动没直接关系。排查的时候一定要先把"无线连接本身"和"上层网络"分开,别一股脑全怪驱动。
4.3 症状三:休眠唤醒后 WiFi 消失
这个问题的经典日志长这样:
iwlwifi 0000:02:00.0: Timeout waiting for hardware completion触发机制是:休眠时 PCIe 链路进入低功耗状态,唤醒时网卡固件没有正确重新初始化。除了前面提到的pcie_aspm=off,还可以尝试卸载重挂模块:
sudo modprobe -r iwlwifi sudo modprobe iwlwifi但这个操作比较暴力,不推荐作为长期方案。更好的做法是写一个 systemd 服务,在suspend后自动执行模块重载。还有一个思路是升级固件,Intel 会在新固件里修复这类唤醒问题。
如果你用的是较新内核,还可以尝试:
sudo apt install linux-oem-20.04OEM 内核是厂商合作内核,专门针对特定机型做过调校,在一些笔记本上的表现比通用 HWE 更好。如果这台机器是品牌笔记本,先看看有没有对应的 OEM 内核。
4.4 症状四:蓝牙和 WiFi 互相干扰
Intel 的无线网卡通常 WiFi 和蓝牙二合一,共用一个射频模块。WiFi 和蓝牙同时工作出现干扰,表现为蓝牙设备音频卡顿、WiFi 速度下降。
遇到这种情况,可以先检查是不是驱动固件里两者的共存机制没有生效:
dmesg | grep -i coex如果查不到相关日志,尝试升级linux-firmware。较新固件对这一块做了大量改进。另外,有些笔记本 BIOS 里有关闭或开启蓝牙共存(Bluetooth Coexistence)的选项,去 BIOS 设置界面看看,如果有的话,强制打开。
4.5 症状五:升级系统后原有的正常 WiFi 反而坏了
这类问题多发生在do-release-upgrade或者apt upgrade之后。常见原因是:内核升级后,旧模块失效,而新模块和现有固件不匹配。
排查方法很简单:
lsmod | grep iwl modinfo iwlwifi | grep version如果驱动版本和固件版本明显不对应,先尝试:
sudo apt install --reinstall linux-firmware如果还不行,用回旧内核启动,确认旧内核下一切正常,就说明是新内核的问题,而不是硬件问题。这时候要么等新内核补丁,要么干脆锁内核版本。
锁内核版本的操作稍微绕一下,用apt-mark hold锁定内核包。但请谨慎用这招,因为安全补丁也一并停了,不是长期选择,只是过渡手段。
4.6 一个容易忽略的环境因素:PCIe 插槽和附加卡
如果用的是台式机加装了 Intel 无线网卡,还需要考虑 PCIe 插槽的兼容性。某些转接卡的 PCIe 链路协商有问题,网卡被识别为 x1 但链路不稳定,会出现偶发性的硬件报错。这种问题驱动层面无解,只能换插槽或换转接卡。
笔记本用户则要关注换网卡是否在 BIOS 白名单限制内。部分品牌的笔记本 BIOS 有硬件白名单,不是指定型号的网卡装上去,开机会报 unrecognized device,这样连系统都进不了。这种情况别折腾驱动,先确认硬件兼容性。
5. 一套顺手的完整排查流程
拿我个人的处理流程当模板,你照着敲一遍,基本能定位九成问题。
# 第一步:确认硬件是不是被系统识别了 lspci -nnk | grep -i net -A 3 # 第二步:检查驱动负载状态 lsmod | grep iwl # 第三步:查看固件加载日志 dmesg | grep -i iwl # 第四步:检查无线开关状态 rfkill list nmcli radio # 第五步:确认内核版本 uname -r # 第六步:列出已安装的无线固件包 dpkg -l | grep linux-firmware这套流程走完,你手上至少有这几条信息:
- 网卡型号和 PCI 设备 ID
- 驱动有没有加载
- 固件加载有没有报错
- 无线开关状态
- 内核版本
- 固件包版本
带着这些信息去搜问题,命中率会高得多。很多人在论坛上只发一句"Intel 网卡不能用",别人想帮你都不知道从哪下手。把上面六条命令的输出贴出来,基本能收到对症的回答。
另外有个小技巧值得分享:把dmesg里跟 iwlwifi 相关的日志按时间顺序保存下来,方便对比不同操作前后的变化:
dmesg | grep -i iwl > wifi_driver_log_before.txt # 执行某种操作后 dmesg | grep -i iwl > wifi_driver_log_after.txt diff wifi_driver_log_before.txt wifi_driver_log_after.txt这个方法在你试不同方案时特别有用。很多调节的效果不是立刻可见的,对比日志能看出差异,也能帮你确认某个参数到底有没有真正生效。
6. 为什么建议你留一份环境记录
回到最开始说的:同样的"Intel WiFi 驱动问题",十个案例九个不同。驱动调试的本质不是找到某个万能命令,而是建立一个"硬件状态 -> 日志 -> 操作 -> 结果"的闭环。
我现在的习惯是给每台机器写一个简单的环境记录,包含三行内容:
网卡型号 + PCI ID 内核版本 + 固件版本 最后生效的解决方案别小看这三行字,下次系统升级后再出问题,你只需要把当前状态跟上次记录对比,就能判断是升级引入的回归,还是新出现的硬件故障。这个方法省了我大量重复排查的时间。
Ubuntu 20.04 已经是很成熟的版本了,Intel 网卡的大多数问题都有标准解法,不神秘,也不难。希望这篇梳理能让你少走点弯路,更希望你的问题能在前两个方案里就解决掉。如果实在没解决,带着环境记录去社区提问,大概率很快能得到针对性帮助。