虚拟化
什么是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。如果你看到这些标志,则说明嵌套可用。如果没有,说明虚拟机监控程序未暴露它们,这通常意味着提供商禁用了它。
Nested virtualisation在哪些地方出现
- 我能在 VPS 上运行嵌套虚拟化吗? 可以。每个 OnionVPS 实例都启用了嵌套虚拟化,因此您可以在实例内运行 KVM 客户机、安装 Proxmox VE,或运行 Docker-in-Docker 以及基于虚拟机的 CI 作业。许多提供商禁用了此功能,这通常是 Proxmox 和某些 CI 配置在其他地方失败的原因。…
- 最便宜但实际可用的 VPS 是什么? 约 4 美元/月即可获得基于真实 KVM 虚拟化的 1 vCPU、1 GB 内存和 20 GB NVMe。这足以运行 WireGuard VPN、DNS 解析器、Tor 中继、小型机器人或静态网站。低于此价格,你几乎肯定买到的是一个超售的容器,而非虚拟机。…
- 什么是KVM虚拟化? KVM(基于内核的虚拟机)是Linux内核中内置的完整硬件虚拟化,使用处理器扩展来运行每个虚拟机,使其拥有自己的内核和基于硬件的隔离。与共享主机内核的OpenVZ或LXC不同,KVM客户机可以加载内核模块、运行任何操作系统并使用真正的交换分区。…
- KVM 与 OpenVZ:虚拟化类型为何重要 KVM 是完全硬件虚拟化:你的实例运行自己的内核,且无法看到宿主机。OpenVZ 和 LXC 是共享宿主内核的容器技术,这意味着无法使用自定义内核模块、在旧宿主机上无法使用 WireGuard、Docker 不可靠,并且内存记账允许提供商超卖。如果 VPS 异常便宜,通常是 OpenVZ。…
更多来自虚拟化
- KVM
- KVM 是内置于 Linux 内核的完全硬件虚拟化技术,每个客户机都有自己的内核,并通过硬件强制与其他租户隔离。
- OpenVZ
- OpenVZ 是基于容器的虚拟化技术,每个实例共享主机内核,因此客户机无法加载内核模块或运行不同的操作系统。
- LXC
- LXC 是 Linux 原生的容器化技术,通过命名空间和 cgroups 隔离进程,同时共享主机内核。
- 虚拟机监控程序
- 虚拟机监控程序是创建和运行虚拟机的软件层,在它们之间分配物理 CPU、内存和 I/O。
- vCPU
- vCPU是呈现给客户机的虚拟处理器,由物理核心或线程上的调度时间提供支持。
- cloud-init
- cloud-init是使用平台提供的元数据在首次启动时配置虚拟机的标准机制。