虚拟化

什么是Nested virtualisation?

定义

Nested virtualisation lets a virtual machine itself run virtual machines, by exposing the processor virtualisation extensions to the guest. It is required for Proxmox VE, VM-based CI jobs and some Docker configurations. Many providers disable it, which is the usual reason those workloads fail elsewhere.

为什么Nested virtualisation很重要

Proxmox VE、基于虚拟机的CI任务以及某些Docker配置需要它。许多提供商禁用它,这通常是这些工作负载在其他地方失败的常见原因。

Nested virtualisation的实际应用

当你运行嵌套虚拟化时,你在KVM客户机内部启动一个虚拟机监控程序,并传递主机CPU的虚拟化扩展。你将在客户机中检查/proc/cpuinfo中的svm或vmx标志。如果不存在,你的内部虚拟机监控程序会回退到软件仿真,这可能使性能下降一个数量级。你可能还需要启用 “host” CPU类型而不是通用型号,才能获得这些标志。出错的话,你的Proxmox或CI工作负载会缓慢运行。

人们对Nested virtualisation常见的误解

人们以为嵌套虚拟化只对运行Windows等完整操作系统在虚拟机中有意义。纠正:它也会破坏Docker默认的overlay网络和某些内核模块,因为这些依赖客户机内部的虚拟化特性。因此,即使你从未打算运行虚拟机,容器工作负载也可能在禁用了嵌套的供应商处失败。

Nested virtualisation —— 常见问题

我能在嵌套虚拟机中运行Docker吗?

可以,这也是人们需要嵌套虚拟化的最常见原因。Docker的默认桥接网络使用iptables和内核模块,如果未暴露CPU虚拟化扩展,这些可能会表现不同。我们的KVM计划包含嵌套虚拟化,因此你的Docker容器会按预期运行。

如何检查是否启用了嵌套虚拟化?

在你的虚拟机内,运行 grep -E '(svm|vmx)' /proc/cpuinfo。如果你看到这些标志,则说明嵌套可用。如果没有,说明虚拟机监控程序未暴露它们,这通常意味着提供商禁用了它。

更多来自虚拟化

KVM
KVM 是内置于 Linux 内核的完全硬件虚拟化技术,每个客户机都有自己的内核,并通过硬件强制与其他租户隔离。
OpenVZ
OpenVZ 是基于容器的虚拟化技术,每个实例共享主机内核,因此客户机无法加载内核模块或运行不同的操作系统。
LXC
LXC 是 Linux 原生的容器化技术,通过命名空间和 cgroups 隔离进程,同时共享主机内核。
虚拟机监控程序
虚拟机监控程序是创建和运行虚拟机的软件层,在它们之间分配物理 CPU、内存和 I/O。
vCPU
vCPU是呈现给客户机的虚拟处理器,由物理核心或线程上的调度时间提供支持。
cloud-init
cloud-init是使用平台提供的元数据在首次启动时配置虚拟机的标准机制。