成功解决联想系列笔记本和ubuntu22.04版本的网卡声卡不兼容问题
开始操作前本人使用USB共享网络适用场景在 Ubuntu 22.04 LTS 上升级主线内核6.x后WiFi 或声卡消失。电脑信息项目 详情型号 Lenovo 小新 Pro 16c IAH10 (XiaoXinPro-16c-IAH10)系统 Ubuntu 22.04.5 LTS (Jammy)内核 6.12.95-061295-generic自行升级的主线内核网卡 Intel Wi-Fi 6 AX201 160MHz (8086:7740)声卡 Intel Arrow Lake Audio (8086:7728)Conexant SN6140 解码器通用根因两个问题本质相同新内核的驱动需要新版固件但 Ubuntu 22.04 的固件包太旧。┌────────────────────────────────────────────────────┐│ Ubuntu 22.04 LTS (2022.04 发布) ││ ├── linux-firmware → 2022.03 版本 ││ ├── firmware-sof-signed → 2.0 (2022 年) ││ └── 内核 6.12 (2024.12) ││ ├── iwlwifi 需要 API v90 固件 → 缺失 ││ └── SOF 需要 Arrow Lake 固件 → 缺失 │└────────────────────────────────────────────────────┘一、WiFi 修复Intel AX201 固件缺失 (bz-b0-hr-b0)故障现象系统只有有线网卡 (enx0a10d7dd5f41)完全没有 WiFi 接口nmcli device status 看不到任何 wlan0 / wlp* 设备ip link show 无无线网卡rfkill list 显示 ideapad_wlan 未被软/硬屏蔽排查过程确认硬件存在$ lspci -nn -s 00:14.300:14.3 Network controller [0280]: Intel Corporation Device [8086:7740]设备存在PCI ID 为 8086:7740。检查驱动状态$ lsmod | grep iwlwifiiwlwifi 647168 0 # ← 0 users驱动没有绑定到设备cfg80211 1413120 1 iwlwifi$ nmcli device statusDEVICE TYPE STATE CONNECTIONenx0a10d7dd5f41 ethernet 已连接 有线连接 1lo loopback 未托管 –没有任何 WiFi 设备iwlwifi 模块已加载但未被任何设备使用 — 驱动识别了设备但固件加载失败后退出了。查看内核日志关键$ cat /var/log/syslog | grep iwl输出关键信息iwlwifi 0000:00:14.3: Detected Intel® Wi-Fi 6 AX201 160MHziwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-bz-b0-hr-b0-93.ucode failed with error -2iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-bz-b0-hr-b0-92.ucode failed with error -2iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-bz-b0-hr-b0-91.ucode failed with error -2iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-bz-b0-hr-b0-90.ucode failed with error -2iwlwifi 0000:00:14.3: no suitable firmware found!iwlwifi 0000:00:14.3: minimum version required: iwlwifi-bz-b0-hr-b0-90iwlwifi 0000:00:14.3: maximum version supported: iwlwifi-bz-b0-hr-b0-93iwlwifi 0000:00:14.3: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git驱动需要 bz-b0-hr-b0 固件 API 版本 v90-v93内核按 93→92→91→90 顺序尝试加载全部失败error -2 文件不存在4. 确认本地固件缺失$ ls /lib/firmware/iwlwifi-bz*iwlwifi-bz-b0-fm-c0-92.ucode iwlwifi-bz-b0-fm-c0.pnvmiwlwifi-bz-b0-fm-c0-94.ucode iwlwifi-bz-b0-gf-a0-92.ucodeiwlwifi-bz-b0-fm-c0-96.ucode iwlwifi-bz-b0-gf-a0-94.ucodeiwlwifi-bz-b0-gf-a0-96.ucodeiwlwifi-bz-b0-gf-a0.pnvm系统只有 fm-c0FM Radio和 gf-a0Gale Force变体固件缺少 hr-b0Harrison Peak变体。$ apt-cache policy linux-firmware已安装20220329.git681281e4-0ubuntu3.42 # 2022 年 3 月版本太旧5. 尝试过的失败方案方案 结果 原因git clone linux-firmware.git ❌ 超时 kernel.org 在国内极慢100s 仅下载 280KB总量 1GBcurl kernel.org /plain/ 端点 ❌ 404 git.kernel.org 的 cgit 不给二进制固件文件返回 200curl GitHub 镜像 ❌ 无法访问 github.com 无响应Symlink gf-a0→hr-b0 ❌ 超时 Failed to start RT ucode: -110 (ETIMEDOUT)RF 模块硬件不兼容6. 成功方案从 Debian testing 下载 firmware-iwlwifi 包仅 23MBTsighua 镜像速度快下载curl -L “https://mirrors.tuna.tsinghua.edu.cn/debian/pool/non-free-firmware/f/firmware-nonfree/firmware-iwlwifi_20260519-1_all.deb”-o /tmp/firmware-iwlwifi.deb提取dpkg-deb -x /tmp/firmware-iwlwifi.deb /tmp/fw-extract/安装正确变体 版本的固件sudo cp /tmp/fw-extract/usr/lib/firmware/intel/iwlwifi/iwlwifi-bz-b0-hr-b0-93.ucode /lib/firmware/sudo cp /tmp/fw-extract/usr/lib/firmware/intel/iwlwifi/iwlwifi-bz-b0-hr-b0.pnvm /lib/firmware/重载驱动sudo modprobe -r iwlwifisudo modprobe iwlwifi修复验证$ dmesg | grep iwl | tail -10iwlwifi: loaded firmware version 93.26a2cb89.0 bz-b0-hr-b0-93.ucode op_mode iwlmvmiwlwifi: Detected RF HR B3, rfid0x10a100iwlwifi: base HW address: f8:cf:52:bc:41:edwlp0s20f3: renamed from wlan0iwlwifi: Registered PHC clock: iwlwifi-PTP, with index: 0$ nmcli device statusDEVICE TYPE STATE CONNECTIONenx0a10d7dd5f41 ethernet 已连接 有线连接 1wlp0s20f3 wifi 已断开 – # ← WiFi 接口出现p2p-dev-wlp0s20f3 wifi-p2p 已断开 –lo loopback 未托管 –WiFi 根因分析┌─────────────────────────────────────────────────────┐│ Intel AX201 网卡有 3 种 RF 模块变体 ││ ││ FM (FM Radio) → iwlwifi-bz-b0-fm-c0-.ucode ││ GF (Gale Force) → iwlwifi-bz-b0-gf-a0-.ucode ││ HR (Harrison Peak) → iwlwifi-bz-b0-hr-b0-.ucode ← 这台机器 ││ ││ 不同 RF 变体固件互不兼容硬件射频前端不同 │└─────────────────────────────────────────────────────┘层级 问题直接原因 硬盘上没有 iwlwifi-bz-b0-hr-b0-.ucode 固件文件为什么其它 AX201 机器没问题 大多数 AX201 使用 FM 或 GF 射频模块Ubuntu 22.04 的 linux-firmware 包含这些变体但没包含 HR 变体根本原因 自行升级的 6.12 主线内核需要新版固件API v90Ubuntu 22.04 官方 linux-firmware 包版本为 2022 年 3 月太旧且缺 HR 变体WiFi 固件命名规则解读以 iwlwifi-bz-b0-hr-b0-93.ucode 为例字段 含义iwlwifi Intel WiFi 固件前缀bz 平台代号Bz (Bazaar)对应 AX201/AX211 系列b0 硅晶片步进版本 B0hr RF 射频模块类型HR Harrison Peakb0 RF 模块步进版本 B093 固件 API 版本号二、声卡修复SOF 固件缺失 (Arrow Lake)故障现象系统设置中无声音输出/输入设备PulseAudio 只有 auto_null伪输出没有真实声卡aplay -l / arecord -l 报 “找不到音效卡”cat /proc/asound/cards 显示 “— no soundcards —”排查过程确认硬件存在$ lspci -nn | grep audio00:1f.3 Multimedia audio controller [0401]: Intel Corporation Device [8086:7728]设备存在PCI ID 为 8086:7728。检查驱动状态$ lsmod | grep sofsnd_sof_pci_intel_mtl 40960 0 # SOF 驱动已加载但 0 用户snd_sof_intel_hda_generic 36864 1…snd_hda_intel 65536 0 # HDA 传统驱动也是 0 用户SOF 和 HDA 驱动都已加载但未绑定到设备。查看内核日志关键$ sudo dmesg | grep -i sof输出关键信息sof-audio-pci-intel-mtl 0000:00:1f.3: DSP detected with PCI class/subclass/prog-if 0x040100sof-audio-pci-intel-mtl 0000:00:1f.3: DMICs detected in NHLT tables: 2sof-audio-pci-intel-mtl 0000:00:1f.3: SOF firmware and/or topology file not found.sof-audio-pci-intel-mtl 0000:00:1f.3: Supported default profilessof-audio-pci-intel-mtl 0000:00:1f.3: - ipc type 1 (Requested):sof-audio-pci-intel-mtl 0000:00:1f.3: Firmware file: intel/sof-ipc4/arl/sof-arl.risof-audio-pci-intel-mtl 0000:00:1f.3: Topology file: intel/sof-ace-tplg/sof-hda-generic-2ch.tplgsof-audio-pci-intel-mtl 0000:00:1f.3: Check if you have ‘sof-firmware’ package installed.sof-audio-pci-intel-mtl 0000:00:1f.3: error: sof_probe_work failed err: -2驱动需要 intel/sof-ipc4/arl/sof-arl.ri — Arrow Lake 固件需要 intel/sof-ace-tplg/sof-hda-generic-2ch.tplg — 拓扑文件error: -2 ENOENT文件不存在4. 确认本地固件缺失$ ls /lib/firmware/intel/sof-ipc4/arl/ls: 无法访问 ‘/lib/firmware/intel/sof-ipc4/arl/’: 没有那个文件或目录系统只有 MTL (Meteor Lake) 固件缺 ARL (Arrow Lake)$ ls /lib/firmware/intel/sof-ipc4/mtl # 只有 Meteor Lake$ apt-cache policy firmware-sof-signed已安装2.0-1ubuntu4.7 # 2022 年版本不包含 Arrow Lake5. 成功方案ARL 固件实际上就是 MTL 固件 — Arrow Lake 和 Meteor Lake 共享相同的 DSP 固件二进制。新版 firmware-sof-signed 包的做法是创建符号链接。创建 ARL 固件目录sudo mkdir -p /lib/firmware/intel/sof-ipc4/arl/{intel-signed,community}创建符号链接到已有 MTL 固件sudo ln -sf intel-signed/sof-arl.ri /lib/firmware/intel/sof-ipc4/arl/sof-arl.risudo ln -sf …/…/mtl/intel-signed/sof-mtl.ri /lib/firmware/intel/sof-ipc4/arl/intel-signed/sof-arl.risudo ln -sf …/…/mtl/community/sof-mtl.ri /lib/firmware/intel/sof-ipc4/arl/community/sof-arl.ri重载 SOF 驱动sudo modprobe -r snd_sof_pci_intel_mtl snd_sof_intel_hda_common snd_sofsudo modprobe snd_sof_pci_intel_mtl修复验证$ cat /proc/asound/cards0 [sofhdadsp ]: sof-hda-dsp - sof-hda-dspLENOVO-83ND-XiaoXinPro16cIAH10-LNVNB161216$ aplay -lcard 0: sofhdadsp [sof-hda-dsp], device 0: HDA Analog () [] # 扬声器card 0: sofhdadsp [sof-hda-dsp], device 3: HDMI1 () [] # HDMIcard 0: sofhdadsp [sof-hda-dsp], device 4: HDMI2 () []card 0: sofhdadsp [sof-hda-dsp], device 5: HDMI3 () []card 0: sofhdadsp [sof-hda-dsp], device 31: Deepbuffer HDA Analog (*) []$ arecord -lcard 0: sofhdadsp [sof-hda-dsp], device 0: HDA Analog () [] # 模拟麦克风card 0: sofhdadsp [sof-hda-dsp], device 6: DMIC Raw () [] # 数字麦克风dmesg 确认sof-audio-pci-intel-mtl: Loaded firmware library: ADSPFW, version: 2.8.1.1sof-audio-pci-intel-mtl: Booted firmware version: 2.8.1.1snd_hda_codec_conexant ehdaudio0D0: SN6140: BIOS auto-probing.snd_hda_codec_conexant ehdaudio0D0: autoconfig for SN6140:line_outs1 (0x17/…) type:speakerhp_outs1 (0x16/…) # 耳机inputs: Mic0x19 # 麦克风声卡根因分析层级 问题直接原因 /lib/firmware/intel/sof-ipc4/arl/ 目录不存在为什么其他 Meteor Lake 机器没问题 MTL 固件存在且 ARL 固件就是 MTL 的符号链接根本原因 内核 6.12 的 SOF 驱动根据 PCI ID (8086:7728) 判定为 Arrow Lake 平台需要 arl/ 路径的固件Ubuntu 22.04 的 firmware-sof-signed (v2.0) 不包含 Arrow Lake 目录SOF 固件目录结构/lib/firmware/intel/sof-ipc4/├── mtl/ # Meteor Lake已有│ ├── sof-mtl.ri → intel-signed/sof-mtl.ri│ ├── intel-signed/│ │ └── sof-mtl.ri # 实际固件二进制 (879KB)│ └── community/│ └── sof-mtl.ri│└── arl/ # Arrow Lake需创建├── sof-arl.ri → intel-signed/sof-arl.ri├── intel-signed/│ └── sof-arl.ri → …/…/mtl/intel-signed/sof-mtl.ri # → MTL 固件└── community/└── sof-arl.ri → …/…/mtl/community/sof-mtl.ri关键经验通用原则升级主线内核后必须同步升级固件新驱动需要新版固件旧发行版的固件包往往不匹配Ubuntu 22.04 的固件包普遍偏旧均为 2022 年版本linux-firmware → 20220329firmware-sof-signed → 2.0对于 2023 的 Intel 硬件平台需要从 Debian testing 获取更新固件Debian 的拆分固件包是更好的下载源firmware-iwlwifi23MBvs 整个 linux-firmware repo1GBfirmware-sof-signed2MB包含完整的 SOF 固件排查固件问题的标准流程1. 确认硬件lspci -nn | grep -iE “network|audio”2. 看内核日志关键sudo dmesg | grep -iE “iwlwifi|sof|firmware”3. 对比固件文件ls /lib/firmware/iwlwifi-* # WiFils /lib/firmware/intel/sof-ipc4/*/ # 声卡4. 检查固件包版本apt-cache policy linux-firmware firmware-sof-signedWiFi 专项RF 变体必须完全匹配fm-c0/gf-a0/hr-b0 是不同射频硬件固件不通用WiFi 固件命名格式iwlwifi-{平台}-{芯片步进}-{RF类型}-{RF步进}-{API版本}.ucode声卡专项SOF 固件跨平台共享Arrow Lake 和 Meteor Lake 使用相同 DSP 固件通过符号链接即可声卡固件路径intel/sof-ipc4/{平台}/sof-{平台}.ri 拓扑文件 intel/sof-ace-tplg/sof-hda-generic-*.tplg一键修复脚本见 fix-firmware.sh可自动诊断并修复常见的固件缺失问题。chmod x fix-firmware.shsudo ./fix-firmware.sh脚本内容#!/bin/bash#fix-firmware.sh — 一键诊断并修复 Intel WiFi / 声卡固件缺失问题适用场景- Ubuntu/Debian 系统自行升级了主线内核- WiFi 消失iwlwifi 固件缺失- 声卡消失SOF 固件缺失用法sudo ./fix-firmware.sh # 自动诊断并修复sudo ./fix-firmware.sh --dry-run # 仅诊断不修复sudo ./fix-firmware.sh --wifi # 仅修复 WiFisudo ./fix-firmware.sh --audio # 仅修复声卡#set -euo pipefail— 颜色定义 —RED‘\033[0;31m’GREEN‘\033[0;32m’YELLOW‘\033[1;33m’BLUE‘\033[0;34m’CYAN‘\033[0;36m’BOLD‘\033[1m’NC‘\033[0m’ # No Color— 配置 —DEBIAN_MIRROR“D E B I A N M I R R O R : − h t t p s : / / m i r r o r s . t u n a . t s i n g h u a . e d u . c n / d e b i a n F I R M W A R E I W L W I F I U R L {DEBIAN_MIRROR:-https://mirrors.tuna.tsinghua.edu.cn/debian} FIRMWARE_IWLWIFI_URLDEBIANMIRROR:−https://mirrors.tuna.tsinghua.edu.cn/debianFIRMWAREIWLWIFIURL{DEBIAN_MIRROR}/pool/non-free-firmware/f/firmware-nonfree/firmware-iwlwifi_20260519-1_all.deb”FIRMWARE_SOF_URLD E B I A N M I R R O R / p o o l / n o n − f r e e − f i r m w a r e / f / f i r m w a r e − s o f / f i r m w a r e − s o f − s i g n e d 2 025.12.2 − 2 a l l . d e b T E M P D I R {DEBIAN_MIRROR}/pool/non-free-firmware/f/firmware-sof/firmware-sof-signed_2025.12.2-2_all.deb TEMP_DIRDEBIANMIRROR/pool/non−free−firmware/f/firmware−sof/firmware−sof−signed2025.12.2−2all.debTEMPDIR(mktemp -d)DRY_RUNfalseFIX_WIFItrueFIX_AUDIOtrueFOUND_ISSUES0FIXED_ISSUES0— 辅助函数 —cleanup() {rm -rf “$TEMP_DIR”}trap cleanup EXITlog_info() { echo -e “B L U E [ I N F O ] {BLUE}[INFO]BLUE[INFO]{NC}KaTeX parse error: Expected EOF, got } at position 5: *; }̲ log_ok() …{GREEN}[OK]${NC}KaTeX parse error: Expected EOF, got } at position 5: *; }̲ log_warn() …{YELLOW}[WARN]${NC}KaTeX parse error: Expected EOF, got } at position 5: *; }̲ log_error() …{RED}[ERROR]${NC}KaTeX parse error: Expected EOF, got } at position 5: *; }̲ log_section() …{BOLD}${CYAN}═══∗ ═══ * ═══∗═══{NC}”; }check_root() {if [ “$(id -u)” -ne 0 ]; thenlog_error “请用 sudo 运行此脚本sudo $0 $*”exit 1fi}need_download() {# 检查系统是否能联网下载if ! command -v curl /dev/null ! command -v wget /dev/null; thenlog_warn “未找到 curl 或 wget将跳过需要下载的操作”return 1fireturn 0}download() {local url“$1” output“KaTeX parse error: Expected EOF, got at position 27: …ommand -v curl ̲/dev/null; the…url” -o “KaTeX parse error: Expected EOF, got at position 34: …ommand -v wget ̲/dev/null; the…url” -O “$output”fi}— WiFi 诊断与修复 —diagnose_wifi() {log_section “WiFi 固件诊断”# 1. 找出所有 Intel WiFi PCI 设备 local wifi_devs wifi_devs$(lspci -nn 2/dev/null | grep -i Network controller.*Intel || true) if [ -z $wifi_devs ]; then log_info 未检测到 Intel WiFi 硬件跳过 WiFi 诊断 return 0 fi echo $wifi_devs | while read -r line; do echo -e ${line} done # 2. 快速检查WiFi 接口是否已存在 # 如果接口已经正常工作就不需要看历史 dmesg旧日志可能误报 if ip link show 2/dev/null | grep -q wl; then local wl_iface wl_iface$(ip link show 2/dev/null | grep -oP wl[^ :] | head -1) log_ok WiFi 接口已存在 ($wl_iface)驱动工作正常跳过 return 0 fi # 3. WiFi 接口不存在 → 检查 iwlwifi 模块 if ! lsmod | grep -q iwlwifi; then log_info iwlwifi 模块未加载尝试加载... modprobe iwlwifi 2/dev/null || true sleep 2 fi # 4. 从 dmesg 提取缺失的固件文件名 # 用本次启动后产生的日志取最后出现的错误避免旧日志干扰 local missing_fw missing_fw$(dmesg 2/dev/null | grep iwlwifi.*Direct firmware load for.*failed \ | grep -oP iwlwifi-[^ ]\.ucode | sort -u || true) if [ -z $missing_fw ]; then # 也检查 /var/log/syslog只取最近的启动日志 missing_fw$(grep iwlwifi.*Direct firmware load for.*failed /var/log/syslog 2/dev/null \ | grep $(uname -r) | grep -oP iwlwifi-[^ ]\.ucode | sort -u || true) fi # 5. 对于找到的 缺失 固件检查是否已经存在且只是 API 版本不同 # 例如 dmesg 说缺 -93但 -96 已存在且驱动支持 if [ -n $missing_fw ]; then local actually_missing for fw in $missing_fw; do # 检查这个文件是否现在已存在 if [ -f /lib/firmware/$fw ]; then log_info 固件 $fw 已存在可能已修复跳过