卡WiFi與藍(lán)牙驅(qū)動(dòng)固件問(wèn)題排查指南)
1. 為什么AX200在Ubuntu 20.04上總出幺蛾子英特爾AX200這塊網(wǎng)卡在DIY圈子里出鏡率極高尤其是2020年前后裝機(jī)的朋友主板自帶WiFi6的基本都是它。但只要你裝過(guò)Ubuntu 20.04大概率會(huì)遇到一個(gè)很尷尬的局面裝完系統(tǒng)右上角網(wǎng)絡(luò)圖標(biāo)里壓根沒(méi)有WiFi選項(xiàng)藍(lán)牙設(shè)置里也空空如也lspci能看到網(wǎng)卡lsusb也能看到藍(lán)牙設(shè)備但就是用不了。這不是Ubuntu故意跟你過(guò)不去核心原因在于內(nèi)核版本與固件文件的匹配問(wèn)題。AX200屬于Intel Wi-Fi 6系列它的驅(qū)動(dòng)iwlwifi早就進(jìn)了Linux內(nèi)核主線但固件文件firmware是獨(dú)立分發(fā)的Ubuntu 20.04初始版本搭載的是5.4內(nèi)核這個(gè)內(nèi)核雖然支持AX200的基本功能但固件包linux-firmware的版本可能偏舊缺少AX200需要的iwlwifi-cc-a0-*.ucode文件。沒(méi)有固件驅(qū)動(dòng)加載了也白搭網(wǎng)卡就是個(gè)擺設(shè)。另一個(gè)容易被忽略的點(diǎn)是藍(lán)牙和WiFi雖然在同一塊物理網(wǎng)卡上但在系統(tǒng)里走的是兩條完全不同的路徑。WiFi走PCIe總線由iwlwifi驅(qū)動(dòng)負(fù)責(zé)藍(lán)牙走USB總線由btusb驅(qū)動(dòng)負(fù)責(zé)。所以你會(huì)看到一種奇怪的現(xiàn)象WiFi修好了藍(lán)牙還是不能用或者藍(lán)牙能用WiFi搜不到信號(hào)。這兩者需要分別排查不能混為一談。這篇文章面向的是在Ubuntu 20.04上使用AX200網(wǎng)卡、遇到WiFi或藍(lán)牙無(wú)法正常工作的人。不管你是剛裝完系統(tǒng)的新手還是折騰了半天沒(méi)搞定的老玩家下面的內(nèi)容會(huì)從內(nèi)核版本檢查開(kāi)始一步步把驅(qū)動(dòng)和固件的問(wèn)題理清楚。我自己的主力機(jī)就是AX200前前后后裝過(guò)不下十次Ubuntu踩過(guò)的坑足夠?qū)懸槐拘?cè)子這里把最有效的排查路徑和操作方法整理出來(lái)。提示操作前建議先用有線網(wǎng)絡(luò)或者手機(jī)USB共享網(wǎng)絡(luò)因?yàn)橄旅娴牟襟E需要下載固件包沒(méi)網(wǎng)會(huì)很被動(dòng)。2. 動(dòng)手之前先把內(nèi)核版本和硬件信息摸清楚2.1 確認(rèn)內(nèi)核版本是否滿(mǎn)足AX200的最低要求AX200的iwlwifi驅(qū)動(dòng)支持從Linux 5.1內(nèi)核開(kāi)始但真正穩(wěn)定運(yùn)行建議至少5.4以上。Ubuntu 20.04 LTS默認(rèn)搭載5.4內(nèi)核理論上夠用但如果你用的是20.04.0的初始ISO內(nèi)核可能是5.4.0-26這種早期版本固件包也相應(yīng)偏舊。查內(nèi)核版本很簡(jiǎn)單uname -r輸出類(lèi)似5.4.0-26-generic。如果小版本號(hào)低于5.4.0-40建議先通過(guò)apt更新內(nèi)核和固件包很多問(wèn)題在更新后自動(dòng)消失。更新命令sudo apt update sudo apt upgrade linux-generic linux-firmware sudo reboot重啟后再看uname -r如果變成了5.4.0-xx更高版本先別急著往下折騰檢查WiFi和藍(lán)牙是否已經(jīng)恢復(fù)。我遇到過(guò)至少三次單純更新固件包就解決了問(wèn)題根本不需要手動(dòng)下載固件。2.2 用lspci和lsusb確認(rèn)硬件是否被識(shí)別在排查驅(qū)動(dòng)之前先確認(rèn)系統(tǒng)到底有沒(méi)有“看見(jiàn)”這塊網(wǎng)卡。WiFi部分用lspci -nn | grep -i network正常輸出應(yīng)該包含Intel Corporation Wi-Fi 6 AX200 [8086:2723]。如果什么都沒(méi)輸出那問(wèn)題可能出在硬件層面——網(wǎng)卡沒(méi)插緊、M.2插槽禁用、或者BIOS里WiFi被關(guān)了。這種情況軟件層面怎么折騰都沒(méi)用先回BIOS檢查。藍(lán)牙部分用lsusb | grep -i bluetoothAX200的藍(lán)牙通常顯示為Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP)或者類(lèi)似的AX200標(biāo)識(shí)。如果lsusb里沒(méi)有但lspci里有WiFi說(shuō)明藍(lán)牙的USB通道沒(méi)被識(shí)別可能是btusb模塊沒(méi)加載或者USB總線的問(wèn)題。還有一個(gè)命令可以一次性看全sudo lshw -C network這個(gè)輸出比較長(zhǎng)重點(diǎn)看description里有沒(méi)有Wireless interface以及driver后面跟的是不是iwlwifi。如果driver顯示的是N/A或者別的什么說(shuō)明驅(qū)動(dòng)沒(méi)綁定上。2.3 檢查固件文件是否存在于/lib/firmware這是最關(guān)鍵的一步。AX200需要的固件文件命名規(guī)則是iwlwifi-cc-a0-XX.ucode其中XX是固件版本號(hào)。檢查命令ls /lib/firmware/ | grep iwlwifi-cc-a0如果沒(méi)有任何輸出說(shuō)明固件包不包含AX200的固件這就是WiFi不能用的直接原因。如果有輸出但版本號(hào)很低比如只有iwlwifi-cc-a0-46.ucode而內(nèi)核驅(qū)動(dòng)期望的是更高版本也會(huì)出問(wèn)題。內(nèi)核日志里會(huì)明確告訴你它想要哪個(gè)版本dmesg | grep iwlwifi典型報(bào)錯(cuò)是iwlwifi 0000:03:00.0: firmware: failed to load iwlwifi-cc-a0-XX.ucode后面跟著Direct firmware load failed??吹竭@個(gè)基本可以確診固件缺失或版本不匹配。3. 固件缺失的修復(fù)路徑從apt到手動(dòng)下載3.1 優(yōu)先嘗試通過(guò)apt更新linux-firmwareUbuntu的linux-firmware包會(huì)定期更新里面包含了Intel網(wǎng)卡的固件。先確認(rèn)當(dāng)前版本dpkg -l linux-firmware如果版本號(hào)比較老比如1.187以下直接升級(jí)sudo apt install --only-upgrade linux-firmware升級(jí)完成后重新檢查/lib/firmware/下是否有iwlwifi-cc-a0開(kāi)頭的文件。如果有重啟系統(tǒng)WiFi大概率就能用了。這一步能解決大部分人的問(wèn)題因?yàn)閁buntu 20.04的更新源里linux-firmware版本已經(jīng)足夠新。但有一種情況例外你的系統(tǒng)裝完后從沒(méi)更新過(guò)而且網(wǎng)絡(luò)不通導(dǎo)致apt用不了。這時(shí)候需要手動(dòng)下載固件包??梢栽诹硪慌_(tái)能上網(wǎng)的電腦上訪問(wèn)Ubuntu的官方包倉(cāng)庫(kù)搜索linux-firmware下載對(duì)應(yīng)的.deb文件然后用U盤(pán)拷過(guò)來(lái)安裝sudo dpkg -i linux-firmware_*.deb3.2 手動(dòng)下載Intel官方固件并放置到正確位置如果apt源里的固件版本仍然不夠新或者你用的不是標(biāo)準(zhǔn)Ubuntu源那就需要從Intel的官方Linux固件倉(cāng)庫(kù)手動(dòng)獲取。Intel在GitHub上維護(hù)了一個(gè)iwlwifi固件倉(cāng)庫(kù)直接下載最新的iwlwifi-cc-a0-*.ucode文件即可。下載完成后把文件復(fù)制到/lib/firmware/目錄sudo cp iwlwifi-cc-a0-*.ucode /lib/firmware/ sudo chmod 644 /lib/firmware/iwlwifi-cc-a0-*.ucode然后重新加載iwlwifi模塊sudo modprobe -r iwlwifi sudo modprobe iwlwifi如果模塊正在被使用導(dǎo)致無(wú)法卸載可以先斷開(kāi)WiFi連接或者直接重啟。重啟后檢查dmesg | grep iwlwifi如果看到loaded firmware version XX且沒(méi)有報(bào)錯(cuò)說(shuō)明固件加載成功。注意手動(dòng)放置固件時(shí)文件名必須和內(nèi)核請(qǐng)求的版本號(hào)完全一致。內(nèi)核日志里說(shuō)failed to load iwlwifi-cc-a0-50.ucode你就得放一個(gè)叫這個(gè)名字的文件改名或者放錯(cuò)版本都不行。如果手頭只有更高版本的固件可以嘗試創(chuàng)建一個(gè)軟鏈接指向它但最穩(wěn)妥的還是找到完全匹配的版本。3.3 驗(yàn)證WiFi是否真正工作固件加載成功后用ip link查看網(wǎng)絡(luò)接口ip link show應(yīng)該能看到一個(gè)wlan0或者wlp3s0之類(lèi)的接口狀態(tài)是DOWN。把它啟用sudo ip link set wlan0 up然后用nmcli掃描WiFinmcli device wifi list如果能列出周?chē)腤iFi熱點(diǎn)說(shuō)明驅(qū)動(dòng)和固件都正常了。接下來(lái)在圖形界面里連接就行。如果nmcli報(bào)Error: Device wlan0 not found說(shuō)明接口沒(méi)創(chuàng)建成功回到dmesg繼續(xù)排查。4. 藍(lán)牙不工作的獨(dú)立排查鏈路4.1 確認(rèn)btusb模塊是否加載并綁定WiFi修好后藍(lán)牙往往還是不能用。先檢查btusb模塊lsmod | grep btusb如果沒(méi)有輸出手動(dòng)加載sudo modprobe btusb然后看dmesg里有沒(méi)有藍(lán)牙相關(guān)的信息dmesg | grep -i blue正常應(yīng)該看到Bluetooth: hci0: Firmware loaded之類(lèi)的字樣。如果看到Bluetooth: hci0: Failed to load firmware說(shuō)明藍(lán)牙固件也有問(wèn)題。AX200的藍(lán)牙固件通常包含在linux-firmware包里文件名類(lèi)似intel/ibt-20-1-3.sfi。檢查ls /lib/firmware/intel/ | grep ibt如果沒(méi)有對(duì)應(yīng)的文件同樣需要更新linux-firmware或者手動(dòng)下載。4.2 用bluetoothctl做一次完整的配對(duì)測(cè)試藍(lán)牙服務(wù)默認(rèn)是bluetooth.service確認(rèn)它運(yùn)行正常systemctl status bluetooth如果沒(méi)啟動(dòng)sudo systemctl start bluetooth并設(shè)置開(kāi)機(jī)自啟。然后用bluetoothctl進(jìn)入交互模式bluetoothctl依次執(zhí)行power on agent on default-agent scan on這時(shí)候應(yīng)該能看到周?chē)乃{(lán)牙設(shè)備。找到你的設(shè)備MAC地址后pair XX:XX:XX:XX:XX:XX trust XX:XX:XX:XX:XX:XX connect XX:XX:XX:XX:XX:XX如果pair失敗常見(jiàn)原因是設(shè)備沒(méi)進(jìn)入配對(duì)模式或者被其他設(shè)備占用了。我遇到過(guò)藍(lán)牙鼠標(biāo)在Windows下配對(duì)過(guò)切到Ubuntu后死活連不上最后在Windows里刪除了配對(duì)記錄Ubuntu這邊才成功。雙系統(tǒng)用戶(hù)特別注意這一點(diǎn)。4.3 藍(lán)牙和WiFi共存時(shí)的干擾問(wèn)題AX200的WiFi和藍(lán)牙共用天線2.4GHz頻段上兩者會(huì)互相干擾。如果你發(fā)現(xiàn)WiFi速度慢、藍(lán)牙音頻卡頓大概率是這個(gè)原因。解決辦法有兩個(gè)一是把WiFi切到5GHz頻段避開(kāi)2.4GHz的擁擠二是調(diào)整藍(lán)牙的共存參數(shù)。查看當(dāng)前共存設(shè)置cat /sys/module/btusb/parameters/enable_autosuspend如果輸出是Y可以嘗試關(guān)閉自動(dòng)掛起echo options btusb enable_autosuspendN | sudo tee /etc/modprobe.d/btusb.conf sudo modprobe -r btusb sudo modprobe btusb這個(gè)改動(dòng)對(duì)藍(lán)牙音頻的穩(wěn)定性有明顯幫助尤其是用藍(lán)牙耳機(jī)聽(tīng)歌時(shí)斷斷續(xù)續(xù)的情況。5. 內(nèi)核升級(jí)與降級(jí)什么時(shí)候該動(dòng)內(nèi)核5.1 判斷是否需要升級(jí)到HWE內(nèi)核Ubuntu 20.04的默認(rèn)內(nèi)核是5.4但可以通過(guò)HWEHardware Enablement棧升級(jí)到5.15甚至更高。如果你的AX200在5.4下始終不穩(wěn)定比如頻繁斷連、速度上不去可以考慮升級(jí)HWE內(nèi)核sudo apt install linux-generic-hwe-20.04 sudo reboot升級(jí)后uname -r會(huì)顯示5.15.x。新內(nèi)核通常包含更新的iwlwifi驅(qū)動(dòng)對(duì)AX200的支持更好。但要注意HWE內(nèi)核的固件包也需要同步更新否則可能出現(xiàn)驅(qū)動(dòng)版本和固件版本不匹配的新問(wèn)題。5.2 降級(jí)內(nèi)核的適用場(chǎng)景反過(guò)來(lái)有些人在升級(jí)到5.15后反而遇到了WiFi斷流的問(wèn)題這時(shí)候降回5.4可能更穩(wěn)。降級(jí)的方法是安裝特定版本的內(nèi)核包sudo apt install linux-image-5.4.0-XX-generic linux-headers-5.4.0-XX-generic然后在GRUB啟動(dòng)菜單里選擇舊內(nèi)核啟動(dòng)。GRUB默認(rèn)會(huì)保留最近幾個(gè)內(nèi)核版本開(kāi)機(jī)時(shí)按住Shift進(jìn)入菜單就能看到。降級(jí)后記得把linux-firmware也降回匹配的版本否則固件可能不兼容。5.3 鎖定內(nèi)核版本防止自動(dòng)升級(jí)如果你找到了一個(gè)穩(wěn)定組合不希望系統(tǒng)自動(dòng)升級(jí)內(nèi)核破壞現(xiàn)狀可以鎖定版本sudo apt-mark hold linux-image-generic linux-headers-generic linux-firmware這樣apt upgrade就不會(huì)動(dòng)這三個(gè)包了。等哪天想升級(jí)了sudo apt-mark unhold解除鎖定即可。這個(gè)操作在服務(wù)器或者工作機(jī)上特別實(shí)用避免某次例行更新后網(wǎng)卡突然罷工。6. 那些文檔里不會(huì)寫(xiě)的踩坑經(jīng)驗(yàn)6.1 固件文件權(quán)限和SELinux的坑手動(dòng)復(fù)制固件到/lib/firmware/后權(quán)限必須是644所有者是root:root。我有一次用普通用戶(hù)復(fù)制權(quán)限變成了600結(jié)果內(nèi)核加載固件時(shí)報(bào)Permission denied排查了半天才發(fā)現(xiàn)是權(quán)限問(wèn)題。另外如果你的系統(tǒng)啟用了AppArmor或SELinux可能會(huì)阻止內(nèi)核讀取非標(biāo)準(zhǔn)路徑的固件這時(shí)候要么調(diào)整策略要么把固件放到標(biāo)準(zhǔn)路徑。6.2 雙系統(tǒng)下Windows快速啟動(dòng)導(dǎo)致的硬件狀態(tài)殘留Windows的“快速啟動(dòng)”功能會(huì)讓網(wǎng)卡在關(guān)機(jī)時(shí)處于一種半休眠狀態(tài)切到Ubuntu后AX200可能無(wú)法正常初始化。表現(xiàn)是lspci能看到設(shè)備但dmesg里全是iwlwifi的初始化失敗報(bào)錯(cuò)。解決辦法是在Windows的電源選項(xiàng)里關(guān)閉快速啟動(dòng)然后完全關(guān)機(jī)再進(jìn)Ubuntu。這個(gè)坑我踩過(guò)兩次每次都是折騰半天驅(qū)動(dòng)最后發(fā)現(xiàn)是Windows沒(méi)關(guān)干凈。6.3 虛擬機(jī)里直通AX200的注意事項(xiàng)如果你是在VMware或VirtualBox里用Ubuntu想把AX200直通給虛擬機(jī)需要先在宿主機(jī)上解除網(wǎng)卡綁定。VMware下要在虛擬機(jī)設(shè)置里添加USB控制器并勾選AX200的藍(lán)牙部分WiFi部分則需要在.vmx文件里添加pciHole相關(guān)配置。但說(shuō)實(shí)話虛擬機(jī)里直通無(wú)線網(wǎng)卡的體驗(yàn)很差斷連頻繁建議直接用USB無(wú)線網(wǎng)卡或者橋接有線網(wǎng)絡(luò)省心得多。6.4 檢查rfkill是否軟禁用了無(wú)線設(shè)備有時(shí)候驅(qū)動(dòng)和固件都正常但WiFi就是起不來(lái)罪魁禍?zhǔn)资莚fkill。檢查rfkill list如果看到Soft blocked: yes用sudo rfkill unblock all解除。這個(gè)軟開(kāi)關(guān)可能被飛行模式快捷鍵或者某些電源管理腳本觸發(fā)尤其是筆記本用戶(hù)。我見(jiàn)過(guò)有人按了FnF2之類(lèi)的組合鍵后WiFi消失其實(shí)就是rfkill把無(wú)線關(guān)了。7. 一套可復(fù)用的排查流程總結(jié)把上面的內(nèi)容串起來(lái)遇到AX200在Ubuntu 20.04上不工作按這個(gè)順序走uname -r確認(rèn)內(nèi)核版本低于5.4.0-40先更新系統(tǒng)和固件包lspci和lsusb確認(rèn)硬件被識(shí)別沒(méi)有則檢查BIOS和物理連接ls /lib/firmware/ | grep iwlwifi-cc-a0檢查WiFi固件缺失則更新linux-firmware或手動(dòng)下載dmesg | grep iwlwifi看具體報(bào)錯(cuò)根據(jù)報(bào)錯(cuò)版本號(hào)補(bǔ)齊固件WiFi通了之后lsmod | grep btusb和dmesg | grep blue排查藍(lán)牙rfkill list排除軟禁用雙系統(tǒng)用戶(hù)檢查Windows快速啟動(dòng)是否關(guān)閉最后考慮升級(jí)或降級(jí)內(nèi)核鎖定穩(wěn)定版本這套流程覆蓋了90%以上的AX200驅(qū)動(dòng)問(wèn)題。剩下的10%可能是硬件故障或者主板兼容性問(wèn)題那就只能換網(wǎng)卡或者換主板了。我在一臺(tái)老Z390主板上遇到過(guò)AX200在某個(gè)M.2插槽上死活不認(rèn)換到另一個(gè)插槽就正常這種玄學(xué)問(wèn)題只能靠替換法定位。提示每次改動(dòng)內(nèi)核模塊或固件后最徹底的驗(yàn)證方式是重啟而不是modprobe重載。因?yàn)橛行┮蕾?lài)關(guān)系在運(yùn)行時(shí)不會(huì)完全重建重啟能排除很多干擾因素。最后分享一個(gè)我常用的診斷腳本把關(guān)鍵信息一次性收集出來(lái)方便對(duì)比排查#!/bin/bash echo Kernel uname -r echo PCI WiFi lspci -nn | grep -i network echo USB Bluetooth lsusb | grep -i bluetooth echo WiFi Firmware ls /lib/firmware/ | grep iwlwifi-cc-a0 echo Bluetooth Firmware ls /lib/firmware/intel/ | grep ibt echo dmesg iwlwifi dmesg | grep iwlwifi | tail -20 echo dmesg bluetooth dmesg | grep -i blue | tail -20 echo rfkill rfkill list echo Network Interfaces ip link show把這個(gè)腳本保存成ax200-diag.shchmod x后運(yùn)行輸出結(jié)果貼到論壇或者發(fā)給懂行的朋友對(duì)方一眼就能看出問(wèn)題在哪。我自己維護(hù)了一個(gè)這樣的腳本每次幫人遠(yuǎn)程排查AX200問(wèn)題第一件事就是讓對(duì)方跑一遍省去了大量來(lái)回問(wèn)話的時(shí)間。