You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 22.04手动加载自定义固件失败,如何成功加载新版固件或升级linux-firmware包?

Ubuntu 22.04手动加载自定义固件失败,如何成功加载新版固件或升级linux-firmware包?

嘿,看起来你在手动替换MT7961系列固件时碰到了加载失败的难题,我来帮你梳理下可能的原因和可行的解决办法:

先明确你的当前场景

系统信息

  • 系统版本:Ubuntu 22.04 (Jammy Jellyfish)
  • 内核版本:6.5.0-15-generic #15~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC
  • Secure Boot状态:开启

你尝试的固件更新流程

  1. 移出默认固件文件:
    • /lib/firmware/mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin
    • /lib/firmware/mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin
    • /lib/firmware/mediatek/WIFI_RAM_CODE_MT7961_1.bin
  2. 替换为新版固件文件
  3. 执行sudo update-initramfs -u重新生成initrd
  4. 重启系统

异常表现

  • dmesg中mt7921e模块的固件编译时间仍为2022年12月,完全没变化
  • modinfo mt7921esrcversion未改变(这点你判断的没错,它确实和固件无关)
  • 硬件行为没有任何改善,bug依旧存在
  • 即使故意移除部分固件文件,dmesg和硬件表现也没受影响(仅modprobe输出有变化)

一、先解决手动加载固件的问题

1. 排查Secure Boot的影响

因为你开启了Secure Boot,内核会严格验证固件的签名。如果你的自定义固件没有Ubuntu认可的密钥签名,内核会直接拒绝加载,转而使用内置的 fallback 固件或者之前缓存的版本。

你可以临时关闭Secure Boot测试:进入BIOS/UEFI设置,找到Secure Boot选项禁用,重启后看dmesg里的固件编译时间是否更新。如果成功,说明就是签名问题,后续可以根据安全需求选择给固件签名,或者保持Secure Boot关闭。

2. 确认新固件是否真的被打包进initrd

虽然你执行了update-initramfs -u,但可以手动检查initrd里的固件是否是新的:

# 挂载initrd到临时目录
mkdir -p /tmp/initrd
cd /tmp/initrd
gunzip -c /boot/initrd.img-6.5.0-15-generic | cpio -idmv
# 检查固件的修改时间或对比内容
ls -l lib/firmware/mediatek/WIFI_RAM_CODE_MT7961_1.bin
diff lib/firmware/mediatek/WIFI_RAM_CODE_MT7961_1.bin /path/to/your/new/firmware.bin

如果initrd里还是旧固件,尝试强制重新生成:

sudo update-initramfs -c -k 6.5.0-15-generic

3. 查看内核实际加载固件的路径

内核有时会从其他路径加载固件,比如/usr/lib/firmware或者缓存目录。你可以用以下命令查看完整的固件加载日志:

dmesg | grep -i firmware

日志里会显示“loaded firmware from...”或者“failed to load...”的信息,能帮你定位内核到底在尝试加载哪个路径的文件。

4. 无需重启,直接重载模块测试

不用每次都重启系统,你可以手动卸载再加载mt7921e模块,快速测试新固件是否被加载:

# 先断开WiFi连接,再卸载模块
sudo rmmod mt7921e
# 重新加载模块
sudo modprobe mt7921e
# 查看最新的dmesg输出
dmesg | tail -20

二、升级到24.04开发版的linux-firmware包(可行方案)

如果手动替换固件太折腾,升级到Noble Numbat版本的linux-firmware包确实是个可行方向,步骤如下:

  1. 备份当前固件包配置(可选但推荐):
    sudo dpkg --get-selections | grep linux-firmware > firmware-backup.txt
    
  2. 配置APT优先级,仅优先安装Noble版本的linux-firmware:
    创建/etc/apt/preferences.d/linux-firmware-noble文件,内容如下:
    Package: linux-firmware
    Pin: release n=noble
    Pin-Priority: 500
    
  3. 添加Noble的软件源:
    echo "deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list
    
  4. 更新缓存并安装新版固件:
    sudo apt update
    sudo apt install linux-firmware
    
  5. 重新生成initrd并重启:
    sudo update-initramfs -u
    sudo reboot
    

⚠️ 注意:跨版本安装包可能存在兼容性风险,建议先备份重要数据。如果遇到问题,可以用备份恢复降级:

sudo dpkg --set-selections < firmware-backup.txt
sudo apt-get dselect-upgrade

备注:内容来源于stack exchange,提问作者Vectornaut

火山引擎 最新活动