缺少amdgpu的固件

在执行了sudo apt-get dist-upgrade命令之后,我在终端中看到了以下输出内容:
Setting up linux-modules-extra-4.18.0-16-generic (4.18.0-16.17) ...
Setting up linux-image-generic (4.18.0.16.17) ...
Setting up linux-headers-generic (4.18.0.16.17) ...
Setting up linux-generic (4.18.0.16.17) ...
Processing triggers for linux-image-4.18.0-16-generic (4.18.0-16.17) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.18.0-16-generic
W: Possible missing firmware /lib/firmware/amdgpu/vega12_gpu_info.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_asd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sos.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_asd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sos.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_mec2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_ce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_mec2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_ce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sdma1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_sdma.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sdma1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_sdma.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_uvd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_uvd.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_vce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_vce.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega20_smc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega12_smc.bin for module amdgpu
I: The initramfs will attempt to resume from /dev/dm-2
I: (/dev/mapper/ubuntu--vg-swap_1)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.0-16-generic
Found initrd image: /boot/initrd.img-4.18.0-16-generic
Found linux image: /boot/vmlinuz-4.18.0-15-generic
Found initrd image: /boot/initrd.img-4.18.0-15-generic
Found linux image: /boot/vmlinuz-4.18.0-10-generic
Found initrd image: /boot/initrd.img-4.18.0-10-generic
Adding boot menu entry for EFI firmware configuration
done

有人可以告诉我在哪里找到并如何安装丢失的固件吗?
我的显卡是RADEON RX VEGA M。

2你有AMD的显卡吗? - Pilot6
我怎么知道呢?我编辑了我的显卡,现在正在使用。 - rm -rf
我遇到了一个类似的问题... 我收到了一个可能缺少固件的 W: 列表... 然后,当我试图再现以便发布我的问题时,我没有收到这样的警告... 并且,由于我的屏幕已经清空并且我未能捕获警告输出,我不知道被识别出的是哪些文件。 我推测这种不一致可能与我安装的哪组软件包有关... - TheGeeko61
5个回答

你可以在linux-firmware git找到固件。
看起来缺失的固件文件已经存在。
你可以使用git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git命令克隆并将缺失的文件复制到/lib/firmware/amdgpu目录下。

22+1。然而,未来的读者,请注意,如果您在您的MESA驱动程序尚不支持的卡上放置固件文件,可能会损坏您的系统。我在使用MESA 19.1时为我的RX 5700卡放置了navi10_*固件文件时就发生了这种情况。它破坏了我的系统,我不得不通过live-usb恢复它。解决方案:除了添加固件文件外,还要升级MESA,然后一切都能正常工作。我通过从live环境中的chroot成功实现了这一点 :) - MariusSiuram
1你不能用这种方式破坏你的系统。如果出现任何问题,你总可以进入恢复模式并还原系统。但在我看来,这种情况似乎非常不太可能发生。 - Pilot6
2不管是不是不太可能,这件事发生在我身上了。所以我想也许把这个信息作为评论提供出来会有用;而且我还加上了我的个人解决方案,因为恢复模式对我来说没有起作用——也许是我做错了什么,我真的记不清楚了。 - MariusSiuram
非常感谢你,你在我撞墙了三天之后救了我。 - FrontierPsycho
2如果我的AMD显卡上缺少的固件不在那个git仓库中,那么只是等待的问题吗?例如,navi10_mes.bin和arcturus_****.bin(共10个文件)- 我有一张Radeon 550。 - Scott Hather
2找不到arcturus文件! - Khaled AbuShqear
同意这个解决方案可能可行,但它是不安全的做法,可能会对UEFI安全启动造成问题,因为添加的固件可能没有被正确签名。我提供了一个稍微更安全/经过更好测试的答案如下。 - JPvRiel
不需要使用live_usb!只需在启动时在grub中编辑内核参数即可。(在选择操作系统/内核的地方,我记得只需按e进行编辑。)在grub 1中绝对有效。但是,在Ubuntu上,Grub 2可能配置得很愚蠢。 - anon

更新:这只是我业余的方法来“让事情运转起来” - 这里有更好的答案,而且这可能不是最稳定的方法。在家庭用户空间中使用Linux基本上是关于学习。如果你弄坏了什么东西,你需要学会修复它,或者重新开始!这对于计算机系统来说都是如此。你越早学会处理这个问题,你就越早找到一种“自己钓鱼”的方式,而不是依赖于别人提供的解决方案 - 这些解决方案可能是不完美的。 请勿使用此解决方案来解决商业环境中的问题。 你已经被警告了。 ——— 为了节省新用户和对终端不熟悉的人的时间,以下命令可以直接复制和粘贴以便使用。请确保已安装git,如果没有,请打开终端(大多数情况下是ctrl + alt + t)并输入以下命令: sudo apt install git -y 如果apt在更新时出现问题,请使用以下命令进行更新和升级: sudo apt update && sudo apt upgrade -y 然后再用第一个命令安装git。

需要的固件文件可以在以下链接找到: https://kernel.googlesource.com/pub/scm/linux/kernel/git/firmware/linux-firmware.git

如果你已经安装了Git,可以通过输入以下命令完成: cd ~/Documents && git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/firmware/linux-firmware.git

在使用上述命令克隆存储库后,将文件放置在正确的位置非常重要,以便程序 "update-initramfs" 可以找到并使用它们。

为此,请在终端中输入以下命令(适用于 Ubuntu 18.04)

sudo cp ~/Documents/linux-firmware/amdgpu/* /lib/firmware/amdgpu && sudo update-initramfs -k all -u -v

上述命令假设您正在更新 initramfs 映像,并将在系统上当前可用的所有内核版本上使用它们。

完成所有这些步骤后,APT 不应再发出投诉。 :D


一个新手需要很多指导,他们在获取固件并将其复制到正确的目录后,如何更新他们的initramfs镜像? - user25406
1@user25406 我不打算更新这个答案,但你可以使用以下命令进行更新:sudo update-initramfs -u -k $(uname -r) 或者 sudo update-initramfs -u -k all - Terrance
1找不到arcturus文件 - Khaled AbuShqear
2为什么我们必须手动做这个呢?Ubuntu应该自动拥有或获取这些文件。 - Atif Ali
对于那些需要绕过发行版/Ubuntu未能在其“linux-firmware”软件包中包含最新固件的人来说,这仍然是一种有效的方法。对于那些需要尚未与Ubuntu捆绑打包的“最新固件修复程序”的人来说,这也是有效的选择。 - JPvRiel

2022年1月更新,根据Ubuntu中linux-firmware 1.187.24源代码包的变更日志如下:

amdgpu:为SI芯片添加UVD固件(LP:#1953249)

因此,现在只需更新到最新的linux-firmware包,可能会解决与AMD Southern Islands缺失固件相关的问题。
以往的答案/备用解决方案仍保留在下面,以供后人参考,因为如果/当Ubuntu维护者在更新内核和AMD驱动模块时忘记更新相关固件包,其他AMD型号和固件可能会遇到相同的问题。
之前的答案建议直接从linux-firmware git下载固件。本回答提供了一种替代方法,试图更紧密地复制Ubuntu发布测试周期的工作方式,并且可以代表官方发布的内核与相关发布固件的“更广泛测试”的组合。
直接从git仓库下载具有微妙影响: - 可能会将可能较新的固件与可能稍旧的内核模块混合在一起,这可能会导致较少经过测试的固件与内核驱动程序模块的组合。 - 当固件未经适当签名并被包含到initramfs中时,UEFI安全启动可能无法正常工作。
作为替代方案,假设使用HWE堆栈,请尝试匹配内核和固件版本之间假设发生的发布测试周期。
获取当前版本(`cat /etc/lsb-release`)。例如:“Ubuntu 20.04.3 LTS”。 获取内核版本(`uname -a`)。例如:5.11。 如果好奇,了解当前仓库中可用的固件包版本(`apt show linux-firmware | grep Version`)。 通过https://ubuntu.com/about/release-cycle#ubuntu-kernel-release-cycle找出与HWE内核/堆栈匹配的临时版本。例如,5.11从Ubuntu 21.04(hirsute)回溯到20.04.3 LTS。 使用Ubuntu软件包搜索(https://packages.ubuntu.com/search?keywords=linux-firmware&searchon=names)并找到与特定临时版本和内核组合相匹配的`linux-firmware`软件包版本。例如,https://packages.ubuntu.com/hirsute-updates/linux-firmware与带有hirsute(21.04)的Kernel 5.11一起发布。 从hirsute(21.04)版本下载并手动安装.deb文件。 通过使用来自Ubuntu的.deb软件包,希望固件正确签名以与安全启动一起工作(对于那些不受限于传统BIOS且关心这些针对rootkit和引导程序恶意软件的缓解措施的用户)。
例如,一个适用于20.04.3 LTS版本的内核5.11的匹配项,与来自hirsute(21.04)的linux-firmware相对应,其版本为1.197.3,而focal(20.04)仓库中的linux-firmware版本已过时,为v 1.187.20。
curl -OL http://archive.ubuntu.com/ubuntu/pool/main/l/linux-firmware/linux-firmware_1.197.3_all.deb
sudo dpkg -i linux-firmware_1.197.3_all.deb

额外提示:从最近的镜像下载deb包,因为这个软件包几乎有200MB大,主要存档可能会很慢。
进一步解释一下,Ubuntu HWE堆栈维护者更新了内核(和amdgpu驱动程序),但不幸的是没有及时更新linux-firmware软件包。因此,amdgpu驱动程序显然是在Ubuntu与较新的非LTS版本一起提供的固件上进行测试/开发的,但随后未能将其与之前的LTS版本的HWE内核刷新一起包含/回溯。
所有遇到此类错误的人,请注册一个launchpad帐户,并使用“This bug affects me”投票,以帮助Ubuntu引起一些关注,并使HWE内核和linux-firmware软件包保持更好的同步:https://bugs.launchpad.net/ubuntu/+source/linux-firmware/+bug/1953249 这种方法的一个缺点是固件将不再自动更新,但手动安装.deb文件比尝试混合使用临时发布存储库(这将需要apt首选项软件包名称固定和优先级)更简单。
相关内容:

哇,伙计!如果用户在玩弄固件方面,他们要么知道自己在做什么,要么愿意在出问题时修复。与任何非关键应用程序(如此)一样,可以使用各种解决方案,其成功程度各不相同。我建议的方法是有效的,并值得应用。这不是一个生产环境。如果它,从这样的地方获得建议将是一个错误。如果你要写傲慢的评论,那就去为苹果工作吧。态度绝对可以省略掉。 - Crux161
1@Crux161,不好意思,我并不是有意傲慢 - 我应该改进语气。当安全引导未启用时,只需简单地下载固件文件的方法在大多数情况下应该是有效的。我只是提供一种替代方法来弥补Ubuntu遗漏的部分,并对Ubuntu未能将固件包与它们在测试中使用的内核版本保持同步表示赔偿。我们中的一些人在生产环境中使用Ubuntu,不幸的是,堆栈溢出网站的建议最终会被复制到生产环境中,无论我们喜欢与否(尽管我同意这是不适当的);-) - JPvRiel
1升级Linux固件还可以修复与"drm:si_dpm_set_power_state amdgpu"相关的错误。 - haytham-med haytham

我在升级到最新的Linux内核时遇到了同样的问题。为了解决这个问题,我遵循了@Pilot6的建议,从git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git更新了Linux固件,但不幸的是问题仍然存在。
然后我怀疑图形驱动程序需要升级,所以我尝试通过从oibaf/graphics-drivers PPA升级图形驱动程序来修复它:
  1. 添加oibaf/graphics-drivers PPA:
sudo add-apt-repository ppa:oibaf/graphics-drivers

更新软件包列表:
sudo apt update

升级图形驱动程序:
sudo apt upgrade

安装最新的Linux内核。
按照这些步骤操作后,问题得到解决,一切运行顺利。

这是一个很简单的修复。谢谢。 - leetwanker

从这个存储库下载文件并将它们放在你的电脑上。

1这个“解决方案”的目标是什么?是要移除警告吗? - Pilot6
有一天你会需要这个文件,而你的系统却不知道它只是一个虚拟文件。 - Quora Feans
https://github.com/M-Bab/linux-kernel-amdgpu-binaries/issues/82 在页面上的评论中,“代码状态和二进制文件支持并不总是匹配的。通常情况下,代码已经领先,并且已经准备好包含一些尚未发布的固件二进制文件。这就是Raven或Vega的情况。我经常从最新的二进制文件中进行grep操作...”等等。更好的解决方案是等待更新。但我的系统运行得很好。 - netwazimu
@netwazimu,我猜你在经过漫长思索后不想继续自欺欺人地认为没有任何丢失的固件了吧...然后,你会更明智地处理它。 - Aaron John Sabu
如果我有时间和人力,我可以亲自创建图书馆并修复缺失的固件。 - netwazimu
固件文件是出于某些原因而放置的,因此添加虚假固件并仅抑制警告是没有意义的。相反,获取原始固件文件并部署它。 - Vaibhav Panmand