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状态:开启
你尝试的固件更新流程
- 移出默认固件文件:
/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
- 替换为新版固件文件
- 执行
sudo update-initramfs -u重新生成initrd - 重启系统
异常表现
- dmesg中mt7921e模块的固件编译时间仍为2022年12月,完全没变化
modinfo mt7921e的srcversion未改变(这点你判断的没错,它确实和固件无关)- 硬件行为没有任何改善,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包确实是个可行方向,步骤如下:
- 备份当前固件包配置(可选但推荐):
sudo dpkg --get-selections | grep linux-firmware > firmware-backup.txt - 配置APT优先级,仅优先安装Noble版本的linux-firmware:
创建/etc/apt/preferences.d/linux-firmware-noble文件,内容如下:Package: linux-firmware Pin: release n=noble Pin-Priority: 500 - 添加Noble的软件源:
echo "deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list - 更新缓存并安装新版固件:
sudo apt update sudo apt install linux-firmware - 重新生成initrd并重启:
sudo update-initramfs -u sudo reboot
⚠️ 注意:跨版本安装包可能存在兼容性风险,建议先备份重要数据。如果遇到问题,可以用备份恢复降级:
sudo dpkg --set-selections < firmware-backup.txt sudo apt-get dselect-upgrade
备注:内容来源于stack exchange,提问作者Vectornaut




