【嵌套虚拟化 01】VPS 嵌套虚拟化完全指南:KVM-in-KVM 原理、检测与开启(2026)

详解 VPS 嵌套虚拟化(KVM-in-KVM):检测 CPU 虚拟化标志、开启 /sys/module/kvm_intel/parameters/nested、性能损耗与硬件限制,以及 RackNerd / 搬瓦工 / DMIT / Hetzner 对嵌套的支持实情。动手装 Proxmox 请看本系列第 02 篇。

VPS 嵌套虚拟化系列 · 共 2 篇

想在一台 VPS 里再开虚拟机,靠的就是「嵌套虚拟化」(Nested Virtualization)。本系列第 01 篇先把原理、检测和开启讲透;真正动手装 Proxmox、调优和开内层 VM 的操作,请移步本系列第 02 篇。两篇配合看,既不重复也能少踩坑。下面统一用 L1 / L2 指代层次:你租到的 VPS 是 L1(第一层虚拟机),在它里面再开的虚拟机叫 L2(第二层虚拟机);文中命令里的 "L1" 指你这台 VPS,"L2" 指里面那台,照着对号入座即可。

延伸阅读

更多相关攻略推荐:VPS ping 很低但下载很慢?缓冲膨胀与 TCP 窗口的排障指南【年付性价比 01】年付 VPS 性价比排行 2026:同配置谁最值【API 中转 02】ChatGPT/Claude API 中转 VDMCA-ignore 海外 VPS 厂商红黑榜:哪些真抗投诉、哪些【美西VPS 01】美国洛杉矶 VPS 推荐 2026:CN2 GI

什么是嵌套虚拟化(KVM-in-KVM)

嵌套虚拟化指的是在已经是一台虚拟机的 VPS 里,再启动一层虚拟机管理程序(hypervisor),让里面继续跑第二层 Guest。最典型就是 KVM-in-KVM:你在商家给的 KVM VPS(L1)上加载 KVM 模块,再用 QEMU/KVM 开一台新虚拟机(L2)。为什么需要它?因为很多 VPS 本身就是云厂商用 KVM 切出来的,如果你想像在自家物理机上一样装 Proxmox、跑多租户隔离实验,就必须让外层 VPS 把 CPU 的硬件虚拟化指令(Intel 的 VT-x / VMX、AMD 的 AMD-V / SVM)透传给你,否则内层 KVM 只能退化成纯软件模拟(QEMU TCG),慢到没法用。

硬件前提:Intel 需要 vCPU 支持 EPT(扩展页表),AMD 需要 NPT(嵌套页表),且物理 BIOS 要开虚拟化。有些廉价 VPS 宿主机虽然开了 VT-x,却没把 EPT 透传下来,照样跑不了内层 KVM。可用 grep -E 'ept|vpid' /proc/cpuinfo 看 EPT 是否可用。

第一步:检测 VPS 到底有没有开启嵌套

动手前先确认现状,绝大多数 KVM VPS 默认没开嵌套。看 CPU 硬件虚拟化标志:

lscpu | grep -i virtualization
grep -E '(vmx|svm)' /proc/cpuinfo | sort | uniq

Intel 平台直接读内核参数:cat /sys/module/kvm_intel/parameters/nested;AMD 平台读 cat /sys/module/kvm_amd/parameters/nested。输出 Y(Intel)或 1(AMD)表示已开;N/0 表示关闭。也可用 sudo virt-host-validatels -l /dev/kvm 辅助确认。

第二步:在 VPS 里开启嵌套虚拟化

如果你有宿主机权限(裸金属,或商家在 grub 层开了透传),可用以下方式开启。

方式一:临时开启(重启失效,Intel)

sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
cat /sys/module/kvm_intel/parameters/nested

方式二:写入配置永久生效(推荐,Intel)

echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-nested.conf
sudo update-initramfs -u -k all
sudo reboot

方式三:GRUB 内核参数(KVM 编译进内核时)

sudo sed -i 's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="kvm-intel.nested=1"/' /etc/default/grub
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

AMD 把上面 kvm_intel 换成 kvm_amd 即可。注意:在商家共享 KVM VPS 里,方式一到四大概率做不了——内层模块能否加载取决于最底层物理机有没有把 VMX 透传给你,这是商家在宿主机层面控制的。遇到这种情况看下文「哪些商家支持」。

第三步:确认 L2 套娃成功的验证

在 L1 用 virsh 编辑虚拟机时,CPU 模式设成 host-passthrough:

sudo virsh edit nested-vm
# 在 <cpu> 段写入:<cpu mode='host-passthrough' check='none'/>

进到 L2 再验证一次,能看到 vmx 即成功:egrep -c '(vmx|svm)' /proc/cpuinfo 输出大于 0。只想跑轻量服务,LXC 容器比完整 KVM 更合适——它不需要 VMX,在绝大多数 VPS 上都能直接跑几十个容器,开销极小。套娃层数不是越多越好,实操到 L2 就到头,再往里套 L3 基本只剩教学意义。

嵌套虚拟化的典型用途

既然套娃要付出不低的性能代价,谁还在用?归纳起来主要是这几类需求:

  • 学习与实验:在云上花几十块就能复刻一套接近生产的虚拟化环境,练 Proxmox、Kubernetes 多节点、Ceph 集群,省下买一堆物理机的钱。
  • 隔离沙盒:开发测试、跑不可信代码、安卓模拟、CI 构建机,彼此隔离互不干扰,崩了直接回快照,不污染宿主机。
  • 演示与教学:给客户或学员演示一套完整系统,又不想暴露真实底层拓扑;培训时每人发一个嵌套小集群,成本极低。
  • 受限环境自建:在已经是一台 VM 的受限机器上,再切出一块自己完全可控的小环境,绕过外部限制。

需要反复强调:这些用途都建立在「能接受性能损耗与不完美特性」的前提下。如果你的目标是稳定、高性能、可热迁移的独立环境,嵌套是下策,裸金属或厂商原生虚拟化才是正解。把「试错」和「生产」分开想,就不会用错地方。

和容器(LXC / Docker)怎么取舍

很多人一上来就想要 KVM 套娃,其实多数隔离需求容器就够:LXC 共享宿主内核、启动秒级、镜像几十 MB,且绝大多数 VPS 上都能直接跑,不需要任何 VMX 透传;Docker 更轻,单机起几十个服务是常态。只有当你确实需要独立内核、不同操作系统(如 Windows 内层)、或要原汁原味学 Proxmox 集群时,才值得承担嵌套 KVM 的额外开销。判断口诀:先问「一个容器够不够」,多数时候答案是够。

怎么判断你的 VPS 适不适合嵌套

动手前先用三个信号快速判断:① /proc/cpuinfo 里能看到 vmx / svm,说明 CPU 标志透传到了你的 L1;② cat /sys/module/kvm_intel/parameters/nested 输出 Y(或 AMD 的 1),说明嵌套开关已开;③ /dev/kvm 设备存在且能正常创建内层虚拟机。三条全中,恭喜可以直接玩;只中第一条但第二条是 N,说明宿主机没透传,得开工单或换商家;三条都不中,基本只能上裸金属。把这个判断放在下单前、退款窗口内做,最省心。

性能损耗与硬限制(说实话)

嵌套不是免费午餐。每一层 VM Exit 都比裸金属多一次陷入/返回,L2 相比 L1 有可感知的延迟和吞吐下降:

  • CPU 计算型负载损耗约 5%–15%,取决于 vCPU 拓扑与是否开 EPT/NPT 大页。
  • 磁盘随机 IO、网络小包场景损耗更明显,建议 L1 用 NVMe 并给 L2 足够 vCPU。
  • 内存翻倍占用:L1 的 KVM 进程 + L2 的 Guest 各占一份,4 GB 内存的 VPS 实际只能给 L2 分 2 GB 左右。
  • 不支持 PCI 直通(VFIO/IOMMU)到 L2,GPU 透传在嵌套里基本不可行。

结论:嵌套虚拟化只适合测试、开发、训练、Homelab,绝不适合生产负载。

还有个容易被忽略的点是 Steal Time。嵌套下 L2 的 vCPU 实际跑在 L1 的 vCPU 上,而 L1 的 vCPU 又和宿主机其他租户共享物理核。一旦物理机超卖严重,你看到的 CPU 使用率很低,实际算力却被「偷走」。挑商家时优先选明码标价「独享 vCPU」的套餐,或干脆上裸金属。

哪些商家默认支持嵌套(2026 实情)

结论:主流共享 KVM VPS 默认都不开嵌套。逐个看本系列关注的商家:

  • RackNerd:真 KVM,黑五特价 1GB 年付低至 $10.18,多美国机房。嵌套默认关闭,需工单申请,预算商家会评估资源后决定是否开启。
  • Bandwagon(搬瓦工:KVM + CN2 GIA(洛杉矶 DC6),年付约 $49.99 起。稳定老牌,但嵌套同样默认关闭,多数用于建站而非内层 VM。
  • DMIT:高端 KVM、AMD EPYC、CN2 GIA 优化。机型大带宽大内存,做嵌套实验很爽,但共享 KVM 上嵌套默认关闭,可开工单申请。
  • Hetzner:KVM 云 VPS,CX22 仅 €4.35/月。关键限制:共享云 VPS 默认不向 guest 透传 VT-x,云 VPS 上无法直接 KVM-in-KVM;要跑真正嵌套请买 Dedicated Root Server(裸金属)

通用建议:下单前用「检测」命令在退款窗口先跑一遍;Hetzner 这类云 VPS 跑不出 vmx 就直接上裸金属。预算有限又想玩嵌套,优先选允许工单开启嵌套的 KVM 商家,并挑 4 GB 内存以上、NVMe 套餐。

排障:开了 nested=1 但 L2 看不到 vmx?

最常见坑,原因几乎都是CPU 没透传给 L1 或 L2。按顺序排查:

# 1. 物理/外层 CPU 标志
egrep -c '(vmx|svm)' /proc/cpuinfo
# 2. 嵌套开关
cat /sys/module/kvm_intel/parameters/nested
# 3. KVM 设备
ls -l /dev/kvm
# 4. 模块是否加载
ls /sys/module | grep kvm
# 5. QEMU 能否用 KVM
qemu-system-x86_64 -accel help
  • 若第 1 步输出 0:最底层物理机没开 VT-x,只能换商家/裸金属。
  • 若 nested=N:回到第二步用 modprobe 或 grub 开启并重启。
  • 若 L1 能看到 vmx 但 L2 看不到:检查 L2 的 CPU 模式是否为 host-passthrough,没透传 vmx 就会丢。