在我的 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
ETC。
这些就是所谓的“固件包”。例如,让我们找到其中一些已安装的:
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 或者在下次启动时发生某些情况?
答案1
作为安东尼·盖根 提及,Linux 术语中的“固件”是什么?和为什么有些驱动程序仍然需要固件?提供有用的背景。
固件包是包含固件文件的包,IE包含旨在在系统中或连接到系统的设备上运行的代码的文件 - 常见示例包括 WiFi 芯片组,如您的情况。他们不是一次性安装者,也不关心硬件是否可用。它们提供的文件由相应的内核驱动程序使用,如果相关硬件存在:驱动程序将固件加载到连接到目标硬件的内存中,然后运行固件进行操作。
这些固件包与您正在考虑的固件安装程序无关,后者将固件更新加载到闪存中(仅在需要更新时才需要执行)。这个过程确实很漫长,通常很复杂,而且似乎充满危险(至少,如果你的印象是基于制造商的警告的话)。 Linux 发行版中包含的固件包包含每次系统启动时都需要的固件,因为它被加载到易失性内存中。
答案2
可加载固件通常不是写入设备闪存的“一次性”安装。固件被加载到设备上的易失性存储器中,并且需要在每次打开主机时完成。在加载固件之前,设备无法运行。固件可以写入设备上的 RAM,在这种情况下,它包含设备上处理器的代码和数据,但它也可以是定义现场可编程逻辑阵列 (FPGA) 或某些逻辑的位流。两者的结合。
另一方面,闪存中的固件通常是在设备上预编程的,并且只有在制造商对固件进行更新时才需要重写。这通常是通过其他机制完成的,例如由用户运行的单独的可执行文件。
制造商想要使用 RAM 而不是闪存有几个原因。首先,它使得设计单一版本的硬件成为可能,但同时交付产品的多个版本(例如,针对不同的市场领域)。如果产品需要经常进行现场升级,那么以这种方式处理固件升级可能比费力地创建一个程序来升级设备上的闪存更容易。该程序应该有一个漂亮的用户界面,并且设计得尽可能用户友好,因为它通常是由产品的最终用户运行的。一些具有闪存存储的设备通常会从 RAM 运行代码,并且它们只是在设备启动时将闪存的内容复制到 RAM,在这种情况下,闪存芯片大部分时间都处于闲置状态,这是一项额外的费用。
答案3
添加到已经很好的答案中。
固件文件(也称为专有二进制 blob)至少在设备冷(重新)启动时加载到固件中。
该设备的设计目的是在 RAM 中获取固件,而不是使用 ROM+RAM,以降低生产成本。例如,您有一些以这种方式工作的 Broadcom WiFi 芯片组和内部交换机芯片组。
解决在虚拟机中使用固件文件的问题的另一点。
当您处理虚拟机时,您不需要固件文件。它们不会被装载到任何地方;更不用说以太网或 WiFi“固件”文件了。
同样,考虑到 VM 环境中不需要固件,Debian 中的一个很大的特性是依赖于 Linux 内核中的通用固件文件包。
答案4
参考其他人的回答,并
尝试将在线文档与Linux用户经常看到的相关内容进行比较。
//可能不完全准确,欢迎改进
linux-固件
说明:Linux 内核驱动程序的固件 此软件包提供 Linux 内核驱动程序使用的固件。
// 内核(也许)在每次系统启动时将二进制文件推送到其他 SoC 的 RAM(wifi、显卡...)
// 在其他(可能是外设)cpu/mcu (RAM) 中运行
https://wiki.gentoo.org/wiki/Linux_firmware
linux-图像-通用
取决于:linux-image-5.4.0-110-generic、linux-modules-extra-5.4.0-110-generic、linux-firmware、intel-microcode、amd64-microcode
描述:通用 Linux 内核映像 该软件包将始终依赖于可用的最新通用内核映像。
// 内核和驱动程序,注意:内核/驱动程序可能与指定的 linux 固件版本匹配
// 在CPU中运行
设备固件
$ fwupdmgr get-devices
...
├─Prometheus:
│ │ Device ID: d432baa2162a...
│ │ Summary: Fingerprint reader
│ │ Current version: 10.01.3273255
│ │ Vendor: Synaptics (USB:0x06CB)
│ │ Install Duration: 2 seconds
│ │ Device Flags: • Updatable
│ │ • Supported on remote server
│ │ • Cryptographic hash verification is available
...
// 闪存到外设闪存 (ROM),例如 BIOS 更新。
用户空间中的闪存,
fwupdmgr
或者snap-store
(名为“ubuntu 软件”)更新选项卡
概括
- CPU:
// 运行在CPU中:内核、驱动程序 - 片上系统
- 加载到 RAM:linux-firmware 二进制文件
- 闪存至 ROM:设备固件