虚拟化与容器运行时 可视化实验室

用交互式 SVG 呈现 Hypervisor、CPU/内存虚拟化、namespace/cgroup、容器运行时等虚拟化核心技术。八个模块,纯原生实现,可直接在浏览器中探索虚拟化栈的核心结构。

zero-deps HTML / CSS / JS + SVG requestAnimationFrame prefers-reduced-motion
MODULE 01

Hypervisor 类型:Type-1 vs Type-2

Type-1 裸金属直接运行于硬件之上(ESXi、Xen、Hyper-V);Type-2 寄居式依赖宿主操作系统(VMware Workstation、VirtualBox)。切换视图观察架构差异。

hypervisor-types.svg
硬件 / Hypervisor Guest OS / Host OS 应用 隔离边界

当前架构

选择左侧按钮切换 Type-1 与 Type-2 视图。Type-1 直接管理硬件,性能更高、用于数据中心;Type-2 依赖宿主 OS,适合桌面虚拟化与开发测试。

类型
Type-1
Hypervisor 层级
Ring -1
宿主 OS
无
典型产品
ESXi/Xen
MODULE 02

CPU 虚拟化:VT-x root/non-root

Intel VT-x 引入 VMX root 与 VMX non-root 两种操作模式。VM Entry 进入 guest,VM Exit 回到 host 处理敏感指令。触发 VM Exit 观察上下文切换过程。

vtx-root-nonroot.svg
VMX root (host) VMX non-root (guest) VM Entry / Exit 敏感指令

模式切换说明

点击“触发 VM Exit”模拟 guest 执行敏感指令(如 I/O、HLT、CPUID)。CPU 保存 guest 寄存器到 VMCS,切换到 root 模式由 host 处理后再 VM Entry 返回。

当前模式
non-root
VM Exit 次数
0
VM Entry 次数
0
退出原因
—
MODULE 03

内存虚拟化:EPT 与影子页表

Guest 虚拟地址(GVA)→ Guest 物理地址(GPA)→ Host 物理地址(HPA)。影子页表(SPT)软件合并两层;EPT 硬件完成 GPA→HPA 翻译。切换模式观察查表过程。

ept-shadow-pt.svg
Guest 页表 (GVA→GPA) EPT (GPA→HPA) 影子页表 (GVA→HPA) 地址翻译步

翻译机制

影子页表(SPT)由 VMM 维护,直接映射 GVA→HPA,guest 透明但 shadow fault 开销大;EPT 是硬件页表,GPA→HPA 由 MMU 走 EPT,结合 VPID 减少 TLB 冲刷,性能更优。

当前模式
EPT
翻译步数
5
内存访问次数
5
TLB 冲刷
少 (VPID)
MODULE 04

容器 vs 虚拟机

VM 通过 Hypervisor 提供完整硬件级隔离,每个 guest 自带内核;容器共享宿主内核,通过 namespace/cgroup 实现轻量隔离。切换指标对比启动时间、资源开销与隔离强度。

container-vs-vm.svg
VM 栈 容器栈 共享内核 Guest 内核

对比维度

VM 启动需引导整个 guest 内核(秒级),内存开销大但隔离强;容器复用宿主内核(毫秒级启动),密度高但共享内核带来逃逸风险。强隔离场景选 VM,高密度场景选容器。

VM 启动
~20s
容器启动
~0.5s
VM 内存开销
高
隔离强度
VM > 容器
MODULE 05

namespace 隔离

Linux namespace 为进程提供独立的系统视图。PID/NET/MNT/UTS/IPC/USER 六类 namespace 隔离不同资源。勾选某类观察容器内进程看到的隔离视图。

namespaces.svg
PID NET MNT UTS IPC USER

namespace 说明

PID namespace 使容器内进程从 1 号开始重新编号;NET namespace 提供独立网卡/路由表;MNT 隔离挂载点;UTS 隔离 hostname;USER 实现 UID 映射;USER 实现 UID 映射;IPC 隔离消息队列。

已启用
6 / 6
容器内 PID
1
网卡数
1 (eth0)
hostname
isolated
MODULE 06

cgroup 资源限制

cgroup 以层级树组织进程并施加资源限制。CPU/Memory/IO 控制器分配配额。调整滑块改变 cgroup-A 的 CPU 与内存上限,观察子组抢占与 OOM 行为。

cgroups.svg
cgroup 节点 进程 CPU 配额 内存上限

cgroup v2 说明

cgroup v2 统一层级,进程只能附属于单一 cgroup。CPU 通过 cpu.max 限制配额;内存通过 memory.max 触发 OOM 或回收;IO 通过 io.max 限制带宽。子组配额不能超过父组。

CPU 上限
2.0 核
内存上限
512M
实际 CPU
1.4 核
状态
正常
MODULE 07

containerd 运行时

镜像由只读层叠加,运行时叠加可写层。containerd 按 OCI 规范调用低层 runtime(runc)创建容器。逐步观察 pull → unpack → create → start 流程。

containerd-runtime.svg
镜像层 (只读) 可写层 OCI runtime 容器进程

运行时调用

containerd 管理镜像、快照与容器生命周期。高层 runtime 调用 runc(低层 OCI runtime)创建 namespace/cgroup 并 exec 容器 init 进程。OCI Image Spec 与 Runtime Spec 共同定义可移植标准。

当前阶段
pull
镜像层数
4
OCI runtime
runc
容器状态
creating
MODULE 08

安全沙箱:gVisor vs Kata

普通容器直接 syscall 到宿主内核;gVisor 在用户态实现 Sentry 拦截 syscall;Kata 为每个容器起轻量 VM + 独立内核。切换方案观察隔离边界与性能权衡。

sandbox-gvisor-kata.svg
应用 Sentry / Guest 内核 Host 内核 攻击面

沙箱方案对比

普通容器攻击面=宿主内核全部 syscall;gVisor 仅暴露 ~60% 安全实现的 syscall,性能损失约 10-30%;Kata 用 QEMU/Firecracker 起 VM,隔离最强但启动慢、内存开销大。多租户场景优先 Kata/gVisor。

当前方案
runc
内核暴露
~330 syscall
相对性能
100%
隔离级别
弱