在我的 CentOS 上,ayum update
显示以下内容:
(6/38): iwl1000-firmware-39.31.5.1-62.el7_39.31.5.1-62.2.el7_5.noarch.drpm
(7/38): iwl105-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm
(8/38): iwl135-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm
(9/38): iwl2000-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm
(10/38): iwl2030-firmware-18.168.6.1-62.el7_18.168.6.1-62.2.el7_5.noarch.drpm
(11/38): iwl3160-firmware-22.0.7.0-62.el7_22.0.7.0-62.2.el7_5.noarch.drpm
等等
这些是所谓的“固件包”。例如,让我们找到其中一些已安装的:
rpm --query --all | grep firmware
然后查询它的信息:
rpm --query --info iwl105-firmware-18.168.6.1-62.2.el7_5.noarch
我们得到:
Summary : Firmware for Intel(R) Centrino Wireless-N 105 Series Adapters
Description :
This package contains the firmware required by the iwlagn driver
for Linux to support the iwl105 hardware. Usage of the firmware
is subject to the terms and conditions contained inside the provided
LICENSE file. Please read it carefully.
好吧好吧。
我什至没有那种硬件,因为这是一个虚拟机。
所以,问题:
固件包的实际作用是什么?
他们是“一次性”安装运行一个不透明的可执行文件(立即?在下次启动时?),它检查硬件是否存在,如果硬件存在,将二进制代码泵入硬件的闪存(可能在询问用户时;在 Windows 上至少,硬件刷新总是充满了弹出的 DOS 窗口、必须单击通过的 EULA 和必须忍受的进度条),然后将包标记为“已安装”。
他们是否修改了 initramfs 以便内核模块加载二进制 blob 或在下次启动时发生某些事情?
正如Anthony Geoghegan 所说,Linux 术语中的“固件”是什么?为什么有些驱动程序仍然需要固件?提供有用的背景。
固件包是包含固件文件的包,即包含旨在在系统中或连接到系统的设备上运行的代码的文件 - 常见示例包括 wifi 芯片组,如您的情况。他们不是一次性安装人员,他们不关心硬件是否可用。如果存在相关硬件,则它们提供的文件由相应的内核驱动程序使用:驱动程序将固件加载到连接到目标硬件的内存中,然后运行固件以进行操作。
这些固件包与您正在考虑的固件安装程序无关,后者将固件更新加载到闪存中(仅在需要更新时才需要完成)。这个过程确实很漫长,通常很复杂,而且似乎充满了危险(至少,如果你的印象是基于制造商的警告的话)。Linux 发行版中包含的固件包包含每次系统启动时都需要的固件,因为它被加载到易失性内存中。
可加载固件通常不是写入设备闪存的“一次性”安装。固件被加载到设备上的易失性存储器中,每次打开主机时都需要执行此操作。在加载固件之前,设备无法运行。固件可以写入设备上的 RAM,在这种情况下,它包含设备上处理器的代码和数据,但它也可以是定义现场可编程逻辑阵列 (FPGA) 逻辑的位流,或一些两者的结合。
另一方面,闪存中的固件通常在设备上进行预编程,并且只有在制造商对固件进行更新时才需要重写。这通常是通过其他机制完成的,例如由用户运行的单独的可执行文件。
制造商想要使用 RAM 而不是闪存的原因有几个。首先,它可以设计单一版本的硬件,但同时提供多个版本的产品(例如,针对不同的市场领域)。如果产品预计会频繁进行现场升级,那么通过这种方式处理固件升级可能比创建用于升级设备闪存的程序的麻烦更容易。这个程序应该有一个很好的用户界面,并且设计得尽可能的用户友好,因为它通常是由产品的最终用户运行的。一些具有闪存存储的设备通常会从 RAM 运行代码,并且它们只是在设备启动时将闪存的内容复制到 RAM,
添加到已经很好的答案。
固件文件,也就是专有的二进制 blob,至少在设备冷(重新)启动时被加载到您的固件中。
该设备的设计目的是在 RAM 中获取固件,而不是使用 ROM+RAM 来降低生产成本。例如,您有一些以这种方式工作的 Broadcom wifi 芯片组和内部交换机芯片组。
解决您在 VM 中使用固件文件的问题的另一点。
在处理 VM 时,您不需要固件文件。它们不会被加载到任何地方;更少的以太网或wifi“固件”文件。
同样,考虑到在 VM 环境中不需要固件,在 Debian 中依赖于 Linux 内核中的通用固件文件包是一个很大的特点。
参考其他人的答案,在线文档
尝试将其与linux用户可能经常看到的相关内容进行比较。
//可能不完全准确,欢迎改进
linux固件
说明:Linux 内核驱动程序固件 该软件包提供Linux 内核驱动程序使用的固件。
// 内核(可能)在每次系统启动时将二进制文件推送到其他 SoC 的 RAM(wifi、显卡..)
// 在其他(可能是外围设备)cpu/mcu (RAM) 中运行
https://wiki.gentoo.org/wiki/Linux_firmware
linux-image-generic
取决于:linux-image-5.4.0-110-generic、linux-modules-extra-5.4.0-110-generic、linux-firmware、intel-microcode、amd64-microcode
描述:通用 Linux 内核映像 此软件包将始终依赖于可用的最新通用内核映像。
// 内核和驱动程序,注意:内核/驱动程序可能与指定的 linux-firmware 版本匹配
// 在cpu中运行
设备固件
// 闪存到外围设备的闪存 (ROM),例如 BIOS 更新。
在用户空间闪现,
fwupdmgr
或者snap-store
(名为“ubuntu 软件”)更新选项卡概括
// 在 CPU: 内核、驱动程序中运行