我有一台配备 Core-i5 5200U 的机器。它是第五代处理器,因此它具有 AESNI、RDRAND 和 RDSEED。这就是我购买这台机器的原因。
该机器运行的是 Ubuntu Server 14.04.03。Ubuntu 提供 KVM 和 libvirt。其中一个客户机是 Debian 8.2,Debian 提供X32 支持。X32 与 X86 和 X64 不同;另请参阅Debian x32 移植在 Debian wiki 上。
当我 grepdmesg
在 Debian 客户机上,我看到架构已启用:
$ dmesg | grep -i x32
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=69773d98-b9fa-4695-8392-92759d8e6094 ro syscall.x32=y syscall.x32=y quiet
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=69773d98-b9fa-4695-8392-92759d8e6094 ro syscall.x32=y syscall.x32=y quiet
[ 0.328179] Enabled x32 syscalls
Ubuntu 主机的功能中列出了三个本机 CPU 功能中的两个,这有点令人惊讶,因为我希望在其他功能之前先看到 AES:
$ virsh capabilities | egrep "(aes|rdrand|rdseed)"
<feature name='rdseed'/>
<feature name='rdrand'/>
然而,当我猫/proc/cpuinfo
在 Debian 客户机下,它缺少我想在 X32 下测试的三个 CPU 功能:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 6
model name : QEMU Virtual CPU version 2.0.0
...
flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx
fxsr sse sse2 syscall nx lm rep_good nopl pni vmx cx16 x2apic popcnt
hypervisor lahf_lm abm tpr_shadow vnmi flexpriority ept
...
我已经审查过Libvirt 将主机处理器识别为与硬件文档不同的型号,但我不清楚我应该做什么来启用我试图在该架构下测试的指令。
如何在 Debian VM 的 CPU 上启用 AESNI、RDRAND 和 RDSEED?
这是我用来创建虚拟机的脚本:
$ cat mk-vm.sh
#!/bin/bash
NAME=Debian_8_x64
ISO_PATH=/opt/libvirt/images/debian-8.2.0-amd64-netinst.iso
DISK_PATH="/opt/libvirt/machines/$NAME/$NAME.img"
mkdir -p "/opt/libvirt/machines/$NAME"
virt-install \
--connect qemu:///system \
--virt-type kvm \
--name "$NAME" \
--ram 2048 \
--disk path=$DISK_PATH,size=8 \
--vnc \
--cdrom $ISO_PATH \
--livecd \
--network network=host-bridge \
--os-type linux
答案1
您必须指定 libvirt/qemu 用于 VM 的 CPU“模型”。
最简单的方法是使用“主机”模型,它将把主机支持的所有 libvirt/qemu 标志公开到虚拟机。
在 libvirt XML 节中:
<cpu mode='host-model'/>