英特尔-ucode 没有更新?固件错误:TSC_DEADLINE 由于勘误而被禁用;请将微码更新到版本(或更高版本)

英特尔-ucode 没有更新?固件错误:TSC_DEADLINE 由于勘误而被禁用;请将微码更新到版本(或更高版本)

我在启动时收到此错误:

[Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version (or later)

我发现 /boot/intel-ucode.img 中的固件版本与 dmesg 报告的版本之间可能不匹配。但是,我不知道如何解决这个问题。

内核/发行版:

# uname -a
Linux workstation 4.13.9-1-ARCH #1 SMP PREEMPT Sun Oct 22 09:07:32 CEST 2017 x86_64 GNU/Linux

CPU信息(机器是双Xeon,每个CPU有10个核心,仅列出1个)

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
model name      : Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz
stepping        : 1
microcode       : 0xb00001c
cpu MHz         : 2200.126
cache size      : 25600 KB
physical id     : 0
siblings        : 20
core id         : 0
cpu cores       : 10
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 20
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
bugs            :
bogomips        : 4402.59
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

此条目显示我正在使用所需的两行 initrd 行,其中 intel-ucode.img 首先列出:

# cat /boot/loader/entries/arch.conf 
title          Arch Linux
linux          /vmlinuz-linux
initrd         /intel-ucode.img
initrd         /initramfs-linux.img
options  ...

确认我正在使用上面的条目:

# cat /boot/loader/loader.conf 
default arch

确认我的 intel-ucode.img 文件具有正确的日期并且位于正确的位置:

# ls -la /boot/
total 137324
drwxr-xr-x 5 root root     4096 Nov  7 02:18 .
drwxr-xr-x 1 root root      224 Oct 29 02:38 ..
drwxr-xr-x 4 root root     4096 May 16  2016 EFI
-rwxr-xr-x 1 root root 35074017 Nov  2 05:58 initramfs-linux-fallback.img
-rwxr-xr-x 1 root root 19212497 Nov  2 05:58 initramfs-linux.img
-rwxr-xr-x 1 root root 27503970 May 19  2016 initramfs-linux-lts-fallback.img
-rwxr-xr-x 1 root root 19029219 Nov  2 05:58 initramfs-linux-lts.img
-rwxr-xr-x 1 root root 21556194 May 29  2016 initramfs-linux-simple-fallback.img
-rwxr-xr-x 1 root root  6569920 May 29  2016 initramfs-linux-simple.img
-rwxr-xr-x 1 root root  1303040 Jul  9 08:15 intel-ucode.img
drwxr-xr-x 3 root root     4096 Jun 24  2016 loader
-rwxr-xr-x 1 root root  5502736 Oct 22 03:09 vmlinuz-linux
-rwxr-xr-x 1 root root  4827424 Oct 30 04:20 vmlinuz-linux-lts

dmesg 表示需要微码版本 0xb000020(或更高版本),而我的版本是 0xb00001c

# dmesg | grep microcode
[    0.000000] microcode: microcode updated early to revision 0xb00001c, date = 2016-05-20
[    0.000000] [Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0xb000020 (or later)
[   22.175583] microcode: sig=0x406f1, pf=0x1, revision=0xb00001c
[   22.177119] microcode: Microcode Update Driver: v2.2.

似乎确认我的微码版本是0xb00001c

$ grep microcode /proc/cpuinfo
microcode       : 0xb00001c

但是,iucode_tool似乎表明我的文件 /boot/intel-ucode.img 包含微码 rev 0xb000021。

bsdtar -Oxf /boot/intel-ucode.img | iucode_tool -tb -lS - 
iucode_tool: system has processor(s) with signature 0x000406f1
microcode bundle 1: (stdin)
selected microcodes:
001/139: sig 0x000406f1, pf_mask 0xef, 2017-03-01, rev 0xb000021, size 26624

问题是,为什么不使用微码 rev 0xb000021 以及如何正确“加载”它?

更新 - 根据 jasonwryan 的要求提供更多信息。然而,在最初提出这个问题和提供此更新之间,我运行pacman -Syu并获得了一个新内核。所以这是请求的信息加上当前的输出uname -a

# pacman -Q linux intel-ucode
linux 4.13.11-1
intel-ucode 20170707-1

# uname -a
Linux workstation 4.13.11-1-ARCH #1 SMP PREEMPT Thu Nov 2 10:25:56 CET 2017 x86_64 GNU/Linux

答案1

uname您安装的内核和 initramfs 未加载(请参阅和 的输出之间的差异pacman -Q linux。这意味着您可能运行了/boot未安装的更新。

chroot 进入,确保/boot已安装并重新运行升级并重新生成 initramfs。您可能需要清理将要安装在/boot应该安装的位置的文件。

答案2

发生此问题的原因可能是intel-ucode.img引导期间未加载该文件。这微码ArchWiki 上的页面解释道:

微代码必须由引导加载程序加载。由于用户的早期启动配置存在很大差异,Arch 的默认配置可能不会自动触发微代码更新。许多 AUR 内核在这方面都遵循了官方 Arch 内核的道路。

必须通过添加 /boot/amd-ucode.img 或 /boot/intel-ucode.img 作为引导加载程序配置文件中的第一个 initrd 来启用这些更新。这是对正常 initrd 文件的补充。有关常见引导加载程序的说明,请参阅下文。

请参阅该页面以获取更多说明。就我而言,由于我使用的是 systemd-boot,我只需将文件更改 /boot/loader/entries/arch.conf为:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=/dev/sda6 rw ipv6.disable=1

title   Arch Linux 2
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root=/dev/sda6 rw ipv6.disable=1

相关内容