KVM 开启嵌套虚拟化

问题

在 CentOS KVM 上启动虚拟机来部署 OpenStack 测试环境,在启动具备 CPU 绑定、NUMA 亲和的虚拟机时触发错误:web

libvirtError: Requested operation is not valid: cpu affinity is not supported

这是由于 Nova 使用了 qemu virt_type,而 Qemu 是经过模拟来实现 CPU、内存虚拟化的,因此天然也就不支持 cpu affinity 了。要使用 KVM 硬件虚拟化才能够支持 CPU 绑定,因而修改 nova.conf:api

[libvirt]
...
virt_type=kvm

重试,又出现错误:dom

libvirtError: invalid argument: could not find capabilities for domaintype=kvm

这是由于个人 HostOS 没有开启 KVM Nested 嵌套虚拟化,即 KVM 虚拟机里面不支持 KVM 虚拟机,由于第一次 KVM 虚拟机没能具备与 HostOS 相同的 CPU 环境。svg

解决

KVM 嵌套式虚拟 Nested 是一个可经过修改内核参数来启用的功能,它可以使一台虚拟机具相同的有物理机 CPU 特性,支持 vmx|svm(AMD) 硬件虚拟化,该特性须要 Linux 内核版本大于 Linux 3.x。测试

查看是否启动了 Nested:flex

[root@virtualbmc ~]# cat /sys/module/kvm_intel/parameters/nested
Y

启用 Nested:ui

echo 'options kvm_intel nested=1' >/etc/modprobe.d/kvm-nested.conf

# 卸载内核模块
modprobe -r kvm_intel

# 从新加载内核模块
modprobe kvm_intel

NOTE:若是没法重载内核模块,能够考虑直接重启code

若是但愿已经存在的虚拟机支持嵌套虚拟化,还须要从新编辑虚拟机的 XML 文件,修改其 cpu mode。xml

# 关机
$ virsh shutdown domain-xxx

# 编辑
$ virsh edit domain-xxx

<cpu mode='host-passthrough'>

# 开机
$ virsh start domain-xxx

登陆入虚拟机检查是否有 CPU 穿透:内存

[root@overcloud-ovscompute-0 ~]# egrep '(vmx|svm)' /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms xsaveopt
相关文章
相关标签/搜索