虚拟化与容器运行时 可视化实验室
用交互式 SVG 呈现 Hypervisor、CPU/内存虚拟化、namespace/cgroup、容器运行时等虚拟化核心技术。八个模块,纯原生实现,可直接在浏览器中探索虚拟化栈的核心结构。
Hypervisor 类型:Type-1 vs Type-2
Type-1 裸金属直接运行于硬件之上(ESXi、Xen、Hyper-V);Type-2 寄居式依赖宿主操作系统(VMware Workstation、VirtualBox)。切换视图观察架构差异。
当前架构
选择左侧按钮切换 Type-1 与 Type-2 视图。Type-1 直接管理硬件,性能更高、用于数据中心;Type-2 依赖宿主 OS,适合桌面虚拟化与开发测试。
CPU 虚拟化:VT-x root/non-root
Intel VT-x 引入 VMX root 与 VMX non-root 两种操作模式。VM Entry 进入 guest,VM Exit 回到 host 处理敏感指令。触发 VM Exit 观察上下文切换过程。
模式切换说明
点击“触发 VM Exit”模拟 guest 执行敏感指令(如 I/O、HLT、CPUID)。CPU 保存 guest 寄存器到 VMCS,切换到 root 模式由 host 处理后再 VM Entry 返回。
内存虚拟化:EPT 与影子页表
Guest 虚拟地址(GVA)→ Guest 物理地址(GPA)→ Host 物理地址(HPA)。影子页表(SPT)软件合并两层;EPT 硬件完成 GPA→HPA 翻译。切换模式观察查表过程。
翻译机制
影子页表(SPT)由 VMM 维护,直接映射 GVA→HPA,guest 透明但 shadow fault 开销大;EPT 是硬件页表,GPA→HPA 由 MMU 走 EPT,结合 VPID 减少 TLB 冲刷,性能更优。
容器 vs 虚拟机
VM 通过 Hypervisor 提供完整硬件级隔离,每个 guest 自带内核;容器共享宿主内核,通过 namespace/cgroup 实现轻量隔离。切换指标对比启动时间、资源开销与隔离强度。
对比维度
VM 启动需引导整个 guest 内核(秒级),内存开销大但隔离强;容器复用宿主内核(毫秒级启动),密度高但共享内核带来逃逸风险。强隔离场景选 VM,高密度场景选容器。
namespace 隔离
Linux namespace 为进程提供独立的系统视图。PID/NET/MNT/UTS/IPC/USER 六类 namespace 隔离不同资源。勾选某类观察容器内进程看到的隔离视图。
namespace 说明
PID namespace 使容器内进程从 1 号开始重新编号;NET namespace 提供独立网卡/路由表;MNT 隔离挂载点;UTS 隔离 hostname;USER 实现 UID 映射;USER 实现 UID 映射;IPC 隔离消息队列。
cgroup 资源限制
cgroup 以层级树组织进程并施加资源限制。CPU/Memory/IO 控制器分配配额。调整滑块改变 cgroup-A 的 CPU 与内存上限,观察子组抢占与 OOM 行为。
cgroup v2 说明
cgroup v2 统一层级,进程只能附属于单一 cgroup。CPU 通过 cpu.max 限制配额;内存通过 memory.max 触发 OOM 或回收;IO 通过 io.max 限制带宽。子组配额不能超过父组。
containerd 运行时
镜像由只读层叠加,运行时叠加可写层。containerd 按 OCI 规范调用低层 runtime(runc)创建容器。逐步观察 pull → unpack → create → start 流程。
运行时调用
containerd 管理镜像、快照与容器生命周期。高层 runtime 调用 runc(低层 OCI runtime)创建 namespace/cgroup 并 exec 容器 init 进程。OCI Image Spec 与 Runtime Spec 共同定义可移植标准。
安全沙箱:gVisor vs Kata
普通容器直接 syscall 到宿主内核;gVisor 在用户态实现 Sentry 拦截 syscall;Kata 为每个容器起轻量 VM + 独立内核。切换方案观察隔离边界与性能权衡。
沙箱方案对比
普通容器攻击面=宿主内核全部 syscall;gVisor 仅暴露 ~60% 安全实现的 syscall,性能损失约 10-30%;Kata 用 QEMU/Firecracker 起 VM,隔离最强但启动慢、内存开销大。多租户场景优先 Kata/gVisor。