Libvirt 没有列出所有支持的 CPU 特性

Libvirt does not list all supported CPU features

我在 Ubuntu 服务器 16.04 上安装了 libvirt-bin。但是我发现奇怪的是 libvirt 没有列出 host.

的所有支持的 CPU 特性。

当我打开文件 /proc/cpuinfo 时,我可以看到 'aes' 在标记列表中。

然而,当我 运行 'virsh capabilities' 时,我得到以下结果,显示 host cpu 没有特征 'aes'。

<capabilities>

  <host>
    <uuid>30373237-3132-4d32-3236-30383034485a</uuid>
    <cpu>
      <arch>x86_64</arch>
      <model>SandyBridge</model>
      <vendor>Intel</vendor>
      <topology sockets='1' cores='10' threads='2'/>
      <feature name='invpcid'/>
      <feature name='erms'/>
      <feature name='bmi2'/>
      <feature name='smep'/>
      <feature name='avx2'/>
      <feature name='bmi1'/>
      <feature name='fsgsbase'/>
      <feature name='abm'/>
      <feature name='pdpe1gb'/>
      <feature name='rdrand'/>
      <feature name='f16c'/>
      <feature name='osxsave'/>
      <feature name='movbe'/>
      <feature name='dca'/>
      <feature name='pcid'/>
      <feature name='pdcm'/>
      <feature name='xtpr'/>
      <feature name='fma'/>
      <feature name='tm2'/>
      <feature name='est'/>
      <feature name='smx'/>
      <feature name='vmx'/>
      <feature name='ds_cpl'/>
      <feature name='monitor'/>
      <feature name='dtes64'/>
      <feature name='pbe'/>
      <feature name='tm'/>
      <feature name='ht'/>
      <feature name='ss'/>
      <feature name='acpi'/>
      <feature name='ds'/>
      <feature name='vme'/>
    </cpu>
...

然后我打开文件/usr/share/libvirt/cpu_map.xml,可以看到下面CPU个模型,这意味着Sandbridge继承自Westmere,它应该具有'aes'的特征。

<model name='Westmere'>
  <model name='Nehalem'/>
  <feature name='aes'/>
</model>

<model name='SandyBridge'>
  <model name='Westmere'/>
  <feature name='pclmuldq'/>
  <feature name='x2apic'/>
  <feature name='tsc-deadline'/>
  <feature name='xsave'/>
  <feature name='avx'/>
  <feature name='rdtscp'/>
</model>

我认为 /proc/cpuinfo 中的标志列表应该是正确的,因为它是由 linux 内核调用 cpuid 生成的。这是 libvirt 中的错误,还是 'aes' 只是 'virsh capabilities' 输出中列出的某些功能的子集?

更有意思的是,我开启guest,登录后,发现在guest os中,'aes'在/proc/cpuinfo中。

有什么想法吗?

谢谢, 托比

在 libvirt CPU 设计中,CPU 模型名称被视为一组 CPU 功能的 short-cut/alias。因此,当您在功能 XML 中查询主机 CPU 模型时,您会看到一些表达核心特征集的 CPU 模型,然后是零个或多个特征的列表尚未列出基本 CPU 模型的一部分。您的示例在功能中将 "SandyBridge" 显示为 CPU 模型。这继承自 "Westmere",并且 "Westmere" 被声明为包含 "aes" 功能。因此 libvirt 不需要在功能中列出 "aes" 功能 - 它只需要列出 已经属于 "SandyBridge" 模型的功能。

如果您想查看 CPU 功能的完整扩展列表,您可以将 .... XML 保存到文件 CPUMODEL.xml,然后调用 "virsh cpu-baseline --features CPUMODEL.xml".