ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Ubuntu 22.04下Intel WiFi驱动问题全解决:从固件安装到网络调优

Ubuntu 22.04下Intel WiFi驱动问题全解决:从固件安装到网络调优 1. 项目背景与核心需求拆解1.1 为什么Ubuntu 22.04下Intel WiFi驱动总出问题如果你刚装完Ubuntu 22.04发现右上角网络图标里压根没有WiFi选项或者能看到WiFi列表但死活连不上大概率不是硬件坏了而是驱动没到位。Ubuntu 22.04 LTS用的是Linux 5.15内核后续小版本会升级到5.19或6.2这个内核已经内置了绝大多数Intel无线网卡的iwlwifi驱动模块但“内置”不等于“开箱即用”——固件文件、内核模块加载顺序、Secure Boot签名、网卡电源管理策略任何一个环节出问题都会让你陷入“无网困境”。我经手过的不下几十台机器里Intel WiFi出问题的场景集中在这么几类一是新买的笔记本用了AX211、AX201这类CNVi架构网卡固件版本太新Ubuntu 22.04自带的linux-firmware包没跟上二是从Windows双系统切过来Windows快速启动没关网卡处于半休眠状态Linux这边识别不到三是手动编译过内核或者用了第三方内核iwlwifi模块没编进去四是Secure Boot开着第三方驱动签名过不了模块直接被内核拒绝加载。这几种情况的表现各不相同排查思路也不一样后面我会逐一拆开讲。这个内容适合谁看刚接触Ubuntu的新手、需要给开发机配无线网络的工程师、在虚拟机或WSL2里折腾网络配置的玩家以及那些“网卡明明在但就是没WiFi”的倒霉蛋。我会从最基础的硬件识别开始一路讲到固件安装、模块加载、网络配置和故障排查每一步都给可直接复制的命令和参数说明。1.2 先搞清楚你的网卡到底认没认出来动手之前先确认系统到底有没有识别到你的Intel无线网卡。打开终端跑这条命令lspci -nnk | grep -A3 -i network输出里你会看到类似这样的内容00:14.3 Network controller [0280]: Intel Corporation Device [8086:51f0] (rev 01) Subsystem: Intel Corporation Device [8086:0074] Kernel driver in use: iwlwifi Kernel modules: iwlwifi重点看三个地方第一Network controller后面跟的厂商是不是Intel第二Kernel driver in use这一行有没有内容如果显示iwlwifi说明驱动已经加载了如果为空或者显示N/A那就是驱动没起来第三方括号里的[8086:51f0]是PCI ID8086是Intel的厂商代码后面那串是设备代码这个ID决定了你需要哪个固件文件。如果lspci压根没输出Network controller那问题就不在驱动层面了可能是BIOS里无线网卡被禁用了或者硬件接触不良。这时候进BIOS检查Wireless或WLAN选项是否开启笔记本还要看看有没有物理的无线开关有些老机型侧面有个拨动开关。还有一种情况是lspci能看到网卡但Kernel driver in use显示的是none或者别的驱动名。这说明内核没有自动匹配到iwlwifi需要手动干预。你可以用lspci -k看更详细的驱动绑定信息或者直接dmesg | grep iwl看内核日志里有没有报错。提示如果你用的是USB无线网卡而不是内置的M.2网卡lspci是看不到的得用lsusb来查。Intel的USB无线网卡比较少大部分是M.2接口的CNVi或独立PCIe网卡。2. iwlwifi驱动与固件安装全流程2.1 iwlwifi驱动的工作机制与固件依赖关系Intel无线网卡在Linux下的驱动叫iwlwifi它和普通驱动不太一样——内核里编译进去的只是驱动框架真正让网卡跑起来还需要对应的固件文件firmware。固件是网卡内部处理器运行的微码没有它驱动加载了也没用网卡就是个摆设。iwlwifi驱动加载时会根据网卡的PCI ID去/lib/firmware/目录下找对应的.ucode文件。比如AX210网卡需要iwlwifi-ty-a0-gf-a0-*.ucodeAX201需要iwlwifi-QuZ-a0-hr-b0-*.ucode。如果找不到匹配的固件dmesg里会报firmware: failed to load或者no suitable firmware found网卡自然就用不了。Ubuntu 22.04默认安装了linux-firmware包里面包含了很多Intel网卡的固件但有些新网卡的固件可能没包含在初始版本里。你可以用这条命令查看当前linux-firmware的版本dpkg -l linux-firmware | tail -1如果版本比较老比如20220329开头的而你的网卡是2022年之后出的新型号大概率需要更新固件包。更新方法很简单sudo apt update sudo apt install linux-firmware但前提是你得有网。如果WiFi用不了、有线网也没有那就得用另一台电脑下载.deb包用U盘拷过来手动安装。或者用手机USB共享网络给电脑临时上网这个后面会讲。2.2 手动安装固件从下载到生效的完整步骤当apt更新解决不了问题或者你压根没网的时候手动安装固件是唯一出路。整个流程分四步确认网卡型号、下载对应固件、拷贝到固件目录、重新加载驱动。第一步确认网卡型号和所需固件。用lspci -nn拿到PCI ID后去Intel的官方Linux驱动页面或者linux-firmware的Git仓库里查对应的固件文件名。比如你的网卡ID是8086:51f0查下来对应的是AX211需要iwlwifi-gl-c0-fm-c0-*.ucode系列固件。第二步下载固件文件。可以从Intel官方仓库或者kernel.org的linux-firmware仓库下载。假设你下载下来的是iwlwifi-gl-c0-fm-c0-83.ucode把它拷贝到/lib/firmware/目录sudo cp iwlwifi-gl-c0-fm-c0-83.ucode /lib/firmware/注意有些固件需要同时存在多个版本文件驱动会按优先级尝试加载。你最好把同一系列的所有.ucode文件都拷过去。第三步重新加载驱动模块。先卸载再加载sudo modprobe -r iwlwifi sudo modprobe iwlwifi如果卸载时报Module iwlwifi is in use说明有网络接口还在用这个驱动先sudo ip link set wlan0 down把接口关掉再卸载。第四步验证固件是否加载成功。跑dmesg | grep iwlwifi | tail -20如果看到loaded firmware version 83.xxxx这样的字样说明固件加载成功了。如果还是报failed to load检查文件名是否完全匹配权限是否正确应该是644属主root。注意手动拷贝的固件文件在系统更新linux-firmware包时可能会被覆盖或删除。如果你经常更新系统建议把固件文件备份一份或者用dpkg-divert把官方包里的同名文件屏蔽掉。2.3 Secure Boot与驱动签名冲突的处理Secure Boot是UEFI的一个安全特性它会验证内核模块的签名没签名的第三方驱动直接拒绝加载。Ubuntu官方内核里的iwlwifi模块是有签名的但如果你自己编译了内核或者用了DKMS安装的驱动签名就对不上了。判断是不是Secure Boot导致的问题跑这条命令mokutil --sb-state如果输出SecureBoot enabled而dmesg里有Loading of unsigned module is tainted或者module verification failed的报错那基本就是它了。解决办法有两个一是进BIOS关掉Secure Boot简单粗暴但会降低系统安全性二是给驱动模块签名麻烦但更规范。关Secure Boot的步骤因主板而异一般是在BIOS的Security或Boot选项卡里找Secure Boot选项设为Disabled。保存重启后iwlwifi模块就能正常加载了。如果你不想关Secure Boot可以用mokutil给模块签名。先生成密钥对openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj /CNCustom Module Signing/然后给模块签名sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /lib/modules/$(uname -r)/kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko最后导入密钥sudo mokutil --import MOK.der重启时会弹出MOK管理界面选择Enroll MOK输入刚才设置的密码完成后模块就能在Secure Boot开启的情况下加载了。3. 网络配置与连接实战3.1 用netplan配置WiFi连接桌面版和服务器版通用Ubuntu 22.04桌面版默认用NetworkManager管理网络图形界面点点就能连WiFi。但服务器版或者最小化安装的桌面版可能只有netplan得手动写配置文件。netplan的配置文件在/etc/netplan/目录下通常叫01-network-manager-all.yaml或者00-installer-config.yaml。先看看目录里有什么ls /etc/netplan/假设你要配置一个静态IP的WiFi连接配置文件大概长这样network: version: 2 renderer: networkd wifis: wlan0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] access-points: MyWiFi: password: your_password几个关键点renderer写networkd还是NetworkManager取决于你的系统装了什么桌面版一般用NetworkManagerwlan0是你的无线接口名用ip link确认一下access-points下面的WiFi名称和密码要写对密码是明文注意文件权限。写完配置文件后先测试一下语法sudo netplan try这个命令会应用配置并等待120秒如果网络断了会自动回滚。确认没问题后按回车确认或者直接sudo netplan apply。提示netplan对缩进极其敏感必须用空格不能用Tab层级关系错了会直接报错。建议用yamllint检查一下语法。3.2 用nmcli命令行连接WiFi无图形界面时的救星如果你用的是服务器版或者图形界面崩了nmcli是最靠谱的连接工具。先确认NetworkManager服务在跑sudo systemctl status NetworkManager没跑的话启动它sudo systemctl start NetworkManager sudo systemctl enable NetworkManager然后扫描WiFinmcli device wifi list输出里会列出所有可用的WiFi包括SSID、信号强度、加密方式。找到你的WiFi后连接nmcli device wifi connect MyWiFi password your_password如果WiFi是隐藏的得手动指定nmcli device wifi connect MyWiFi password your_password hidden yes连接成功后用nmcli connection show查看所有连接配置用nmcli device status确认wlan0的状态是connected。有个坑要注意如果你之前用netplan配过WiFiNetworkManager可能会和netplan冲突。解决办法是在netplan配置文件里把renderer改成NetworkManager然后netplan apply让NetworkManager接管。3.3 手机USB共享网络临时救急当你既没有WiFi也没有有线网连固件都下载不了的时候手机USB共享网络是最快的救急方案。Android和iPhone都支持这个功能。Android手机用USB线连上电脑进设置里的“网络和互联网”或“连接”菜单找到“USB网络共享”或“USB tethering”打开开关。Ubuntu这边会自动识别出一个新的网络接口通常是usb0或enp0s20f0u1然后自动通过DHCP获取IP。如果Ubuntu没有自动识别跑一下ip link show看看有没有新接口出现。如果有但没IP手动跑sudo dhclient usb0获取地址。然后ping baidu.com测试连通性。iPhone的话连上USB后需要在手机上点“信任此电脑”然后在“设置-个人热点”里打开“允许其他人加入”。Ubuntu需要安装libimobiledevice和usbmuxd才能识别iPhone的USB网络共享sudo apt install libimobiledevice6 usbmuxd装完后重新插拔iPhone应该就能看到新的网络接口了。注意手机USB共享网络会消耗手机流量临时救急可以别拿来下载大文件。另外有些运营商会对USB共享做限制连上了但没网的情况也有换个手机试试。4. 常见故障排查与避坑指南4.1 WiFi图标消失、网卡不见了的排查思路“网卡不见了”是Ubuntu 22.04下Intel WiFi最常见的问题之一。表现是右上角网络菜单里只有“有线连接”没有“WiFi”或者ip link里压根没有wlan0。排查按这个顺序来第一层确认硬件层面。lspci -nnk | grep -i network看网卡在不在。如果不在进BIOS检查无线网卡是否被禁用。有些笔记本尤其是联想和惠普在BIOS里有Wireless LAN开关默认可能是关闭的。另外Windows快速启动会导致网卡在关机时进入休眠状态Linux启动时无法唤醒。解决办法是在Windows里关掉快速启动控制面板-电源选项-选择电源按钮的功能-更改当前不可用的设置-取消勾选“启用快速启动”。第二层确认驱动加载。如果lspci能看到网卡但Kernel driver in use是空的跑sudo modprobe iwlwifi手动加载。如果报Module not found说明内核里没有iwlwifi模块可能是你用的内核版本太老或者被裁剪过。用uname -r看内核版本Ubuntu 22.04默认是5.15肯定包含iwlwifi。如果内核版本对但模块不在跑sudo apt install linux-modules-extra-$(uname -r)补装。第三层确认固件加载。dmesg | grep iwlwifi看有没有failed to load firmware的报错。有的话按第2章的方法手动装固件。第四层确认rfkill没禁用。rfkill list看wlan是不是被soft blocked或hard blocked了。soft blocked用sudo rfkill unblock wifi解除hard blocked说明有物理开关或BIOS禁用了。第五层确认NetworkManager没抽风。重启NetworkManager服务sudo systemctl restart NetworkManager。如果还不行看看/etc/NetworkManager/NetworkManager.conf里managed是不是设成了false改成true后重启服务。4.2 能连WiFi但网速慢、频繁断连的调优方法WiFi能连上但速度慢、看视频卡顿、隔一会儿就断这种问题比“完全没网”更烦人。原因通常出在电源管理、信道干扰或驱动参数上。电源管理是头号嫌疑犯。Intel网卡默认开启了省电模式信号弱的时候会降速甚至断连。关掉它sudo iw dev wlan0 set power_save off这条命令是临时的重启后失效。永久关闭的话创建/etc/NetworkManager/conf.d/wifi-powersave.conf文件写入[connection] wifi.powersave 2然后重启NetworkManager。信道干扰也很常见。尤其是2.4GHz频段周围十几个WiFi挤在一起互相干扰严重。用sudo iw dev wlan0 scan | grep -E SSID|freq看看周围WiFi都在哪些信道。2.4GHz建议用1、6、11这三个不重叠信道5GHz信道多干扰相对小。如果你能控制路由器把信道固定到干扰少的上面。驱动参数调优。iwlwifi模块有一些可调参数比如11n_disable可以禁用802.11n有时候能解决兼容性问题amsdu_size可以调整聚合帧大小。临时设置sudo modprobe -r iwlwifi sudo modprobe iwlwifi 11n_disable1永久设置的话创建/etc/modprobe.d/iwlwifi.conf写入options iwlwifi 11n_disable1。MTU值也可能有问题。有些路由器或ISP的MTU不是标准的1500导致大包被丢弃表现为能ping通但网页打不开。用ping -M do -s 1472 baidu.com测试如果报Frag needed逐步减小-s的值直到能通然后算出实际MTU-s的值加28。设置MTUsudo ip link set wlan0 mtu 14004.3 常见问题速查表问题现象可能原因排查命令解决方法无WiFi图标ip link无wlan0驱动未加载/硬件禁用lspci -nnk | grep -i network加载iwlwifi模块检查BIOS和rfkill有wlan0但扫描不到WiFi固件缺失/射频被禁dmesg | grep iwlwifi安装对应固件rfkill unblock wifi能扫描但连不上密码错误/认证失败nmcli device wifi connect检查密码尝试wpa_supplicant手动连接连上后频繁断连电源管理/信道干扰iw dev wlan0 get power_save关闭省电模式更换路由器信道网速极慢MTU问题/驱动参数ping -M do -s 1472调整MTU修改iwlwifi模块参数Secure Boot下驱动加载失败模块签名问题mokutil --sb-state关闭Secure Boot或给模块签名双系统切换后WiFi消失Windows快速启动无Windows里关闭快速启动4.4 几个我踩过的坑和独家技巧坑一linux-firmware更新后网卡反而挂了。有一次我手贱跑了apt upgradelinux-firmware从20220329升到了20230815结果AX210网卡直接不认了。查了半天发现是新版固件和当时的内核版本不兼容。解决办法是用apt install linux-firmware20220329*降级或者升级内核到6.2以上。所以如果你网卡本来能用别没事儿就更新linux-firmware除非有明确需求。坑二modprobe -r iwlwifi卸载不掉。有时候iwlwifi模块被其他模块依赖或者有网络接口没关干净modprobe -r会报Module is in use。这时候先sudo ip link set wlan0 down再sudo rfkill block wifi然后卸载。还不行就sudo rmmod iwlmvm iwlwifi按依赖顺序手动卸载。坑三虚拟机里直通Intel网卡后驱动加载失败。在VMware或PVE里把Intel无线网卡直通给Ubuntu虚拟机lspci能看到但驱动加载不了。这是因为虚拟机没有物理网卡的固件加载权限或者IOMMU分组有问题。解决办法是别直通无线网卡用USB无线网卡直通或者干脆用虚拟机的桥接网络。技巧一用dmesg -w实时看驱动日志。插拔网卡或者加载驱动的时候开一个终端跑sudo dmesg -w能实时看到内核输出比事后翻日志高效得多。技巧二备份能用的固件和配置。网卡调通之后把/lib/firmware/下相关的.ucode文件和/etc/modprobe.d/iwlwifi.conf备份到U盘或云盘。下次重装系统或者换机器直接拷回去省得再折腾一遍。技巧三用iw代替iwconfig。iwconfig是老的无线工具很多新功能不支持。iw dev wlan0 link看连接状态iw dev wlan0 station dump看信号强度和速率iw phy看网卡支持的频段和功能比iwconfig详细得多。技巧四WSL2里没有WiFi驱动这回事。如果你在WSL2里跑Ubuntu 22.04别折腾iwlwifi了WSL2用的是虚拟网卡网络走的是Windows宿主机的。WSL2的网络配置在.wslconfig文件里跟Linux驱动没关系。同理VMware和VirtualBox里的Ubuntu也用虚拟网卡不需要装Intel WiFi驱动。技巧五ubuntu22.04网卡不见了先别急着重装。我见过太多人一遇到网卡不见就重装系统其实90%的情况是驱动或固件问题重装解决不了根本问题。按第4.1节的排查顺序走一遍大部分问题都能定位到具体原因。重装系统的时间够你把驱动问题研究透了。最后说一个真实案例。我有一台ThinkPad X1 Carbon装完Ubuntu 22.04后WiFi时好时坏有时候开机有WiFi有时候没有。查了半个月最后发现是BIOS里Wireless Auto Disconnect选项在作怪——这个选项会在笔记本用电池供电时自动关闭无线网卡以省电。进BIOS关掉它之后再也没出过问题。所以遇到诡异问题别忘了翻翻BIOS设置厂商预装的电源管理策略有时候比驱动本身还坑。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进