固件更新

这一章节的固件更新应当在在裸机服务器上运行{pve}时应用。至于在客户机内配置固件更新是否合适,例如在使用设备透传时,这在很大程度上取决于你的设置,并因此超出了讨论范围。

除了常规软件更新外,固件更新对于可靠和安全的运行也很重要。

在获取和应用固件更新时,建议组合使用多种可用选项,以尽早或者根本获得更新。

术语固件通常在语言上分为微代码(用于CPU)和固件(用于其他设备)。

持久固件

这一部分适用于所有设备。更新的微码,通常包含在BIOS/UEFI更新中,存储在主板上,而其他固件则存储在各自的设备上。这种持久化方法对CPU尤其重要,因为它使得在启动时尽早常规加载更新的微码成为可能。

Caution
在进行一些更新,比如BIOS/UEFI或储存控制器时,设备配置可能会被重置。请仔细遵循供应商的指示,并备份当前配置。

请检查您的供应商提供哪些更新方法。

Tip
如果更新指令需要重启主机,请确保这能够安全完成。另请参见节点维护

运行时固件文件

这种方法将固件存储在{pve}操作系统上,如果设备的持久化固件较旧,它将把固件传递给设备。它支持诸如网络和图形卡的设备,但不支持依赖持久化固件的设备,如主板和硬盘。

在{pve}中,`pve-firmware`软件包已经是默认安装的。因此,通过正常的系统更新(APT),常用硬件的固件会自动保持最新。

还有一个额外的Debian固件仓库存在,但默认情况下并没有配置。

如果您尝试安装额外的固件包但发生冲突,APT将中止安装。或许可以通过其他方式获取特定的固件。

CPU 微码更新

微码更新旨在修复发现的安全漏洞和其他严重的CPU错误。虽然CPU性能可能会受到影响,但打了补丁的微码通常仍然比未打补丁的微码更高效,因为在未打补丁的情况下核心自身必须进行缓解措施。根据CPU类型的不同,可能无法在不知情地运行CPU于不安全状态的情况下,再次达到有缺陷的工厂状态时的性能结果。

为了获取当前CPU漏洞及其缓解措施的概览,请运行 lscpu。如果{pve}主机是最新的,它的版本不是已过维护生命周期,并且至少在最后一次内核更新之后已经重启过,那么当前已知的实际漏洞才会显示出来。

除了通过persistent BIOS/UEFI更新推荐的微码更新外,还有一种独立的方法,即通过*早期操作系统微码更新*。这种方法使用方便,当主板供应商不再提供BIOS/UEFI更新时也非常有帮助。无论使用哪种方法,应用微码更新始终需要重新启动。

设置早期操作系统微码更新

要设置在Linux内核启动早期应用的微代码更新,你需要:

  1. 启用Debian固件仓库

  2. 获取最新可用的包 apt update(或使用网页界面,在节点 → 更新下)

  3. 安装特定于CPU厂商的微码包:

    • For Intel CPUs: `apt install intel-microcode

    • 对于AMD CPU:`apt install amd64-microcode

  4. 重启 {pve} 主机

任何将来的微码更新也将需要重启才能加载。

微码版本

为了比较或调试目的获取当前运行的微代码版本:

# grep microcode /proc/cpuinfo | uniq
microcode	: 0xf0

一个微代码包含了对许多不同CPU的更新。但是专门针对您的CPU的更新可能不会经常出现。因此,仅仅查看包的日期并不能告诉您公司实际上何时为您特定的CPU发布了更新。

如果您安装了新的微代码包并重启了 {pve} 主机,而这个新的微代码版本比CPU内置的版本和主板固件中的版本都要新,您会在系统日志中看到一条信息,提示“微代码提前更新”。

# dmesg | grep microcode
[    0.000000] microcode: microcode updated early to revision 0xf0, date = 2021-11-12
[    0.896580] microcode: Microcode Update Driver: v2.2.

故障排除

为了调试目的,可以通过以下方式临时禁用在系统启动时定期应用的早期操作系统微代码更新:

  1. 确保主机可以安全地重新启动 safely

  2. 重启主机以进入GRUB菜单(如果它被隐藏了,则按住`SHIFT`键)

  3. 在所需的 {pve} 启动项上按下 E

  4. 转到以 linux 开头的那一行,并以一个空格分隔,附加上 dis_ucode_ldr

  5. 按下 CTRL-X 可以在不更新早期操作系统微码的情况下启动此次操作

如果怀疑问题与最近的微码更新相关联,应该考虑对包进行降级,而不是移除包(apt purge <intel-microcode|amd64-microcode>)。否则,即便更新的微码可以无问题运行,也可能加载了过时的微码。

如果Debian仓库中有较早版本的微码包可用,如本示例所示,则可能进行降级。

# apt list -a intel-microcode
Listing... Done
intel-microcode/stable-security,now 3.20230808.1~deb12u1 amd64 [installed]
intel-microcode/stable 3.20230512.1 amd64
# apt install intel-microcode=3.202305*
...
选定的版本 '3.20230512.1' (Debian:12.1/stable [amd64]) 对应 'intel-microcode'
...
dpkg: 警告: 从 3.20230808.1~deb12u1 降级到 3.20230512.1
...
intel-microcode: 下一次启动时将更新微码
...

请再次确保主机可以安全地重启,具体方法请参考ha_manager_node_maintenance[safely]。为了应用可能包含在CPU类型对应的微码包中的较旧微码,请现在重启。

Tip

保留降级的包一段时间,并在以后尝试更多的新版本是有道理的。即使将来包的版本是相同的,系统更新可能已经在此期间解决了所遇到的问题。

# apt-mark hold intel-microcode
intel-microcode set on hold.
# apt-mark unhold intel-microcode
# apt update
# apt upgrade