虚拟化技术学习路线——从原理到云原生

本文目标:给你一条从零到能独立设计/运维虚拟化平台的清晰路径。覆盖 CPU/内存/IO 虚拟化、QEMU/KVM、容器与 namesapce/cgroup、网络与存储虚拟化、云编排,最后落到大模型训练/推理场景下的 GPU 虚拟化与云原生调度。

学习哲学:先吃透"一个虚拟机是怎么被造出来的",再学"容器是怎么隔离的",最后学"云平台怎么把它们编排起来"。原理是地基,工程是楼层,地基不稳楼越高越晃。


学习路线总览(六个阶段)

1
2
3
4
5
6
7
8
9
10
11
12
13
阶段0  打地基:操作系统与硬件基础

阶段1 虚拟化原理:CPU / 内存 / IO 三大虚拟化

阶段2 Type-1 / Type-2 与 QEMU-KVM 全栈

阶段3 容器虚拟化:namespace + cgroup + rootfs

阶段4 网络与存储虚拟化:virtio / SDN / 分布式存储

阶段5 云编排:OpenStack / Kubernetes / 调度

阶段6 进阶专题:GPU 虚拟化 / 安全 / 性能调优 / 边缘

每个阶段我都标注了:学什么 → 怎么学(动手)→ 验收标准 → 推荐资料


阶段 0:打地基(1~2 周)

虚拟化的本质是"在操作系统和硬件之间加一层抽象",看不懂操作系统就理解不了虚拟化在抽象什么。

必学

  • x86 体系结构:特权级 ring0~ring3、用户态/内核态、中断/异常、MMU/页表、DMA、PCIe 总线、IOMMU。
  • Linux 内核机制:进程调度、内存管理(buddy/slab/缺页)、VFS、设备驱动模型、系统调用入口。
  • 操作系统接口fork/exec/waitmmapioctlepollmmap 与共享内存。

动手

  • strace 跟一个程序的系统调用;用 perf 看上下文切换;读 /proc/sys
  • 写一个最简字符设备驱动模块(hello world ko),体会内核态。

验收

  • 能说清"ring0 和 ring3 的区别、为什么需要这种隔离、syscall 怎么穿越特权级"。
  • 能解释 MMU 页表、TLB、缺页流程。

资料

  • 《深入理解计算机系统》(CSAPP)
  • 《Linux 内核设计与实现》Robert Love
  • 《奔跑吧 Linux 内核》

阶段 1:虚拟化三大原理(2~3 周,核心)

这是整条路线的灵魂。虚拟化要解决"如何让一个 OS 以为自己在独占硬件",由 Popek-Goldberg 定理给出必要条件:敏感指令必须可被 hypervisor 截获且行为可模拟。三大虚拟化:

1.1 CPU 虚拟化

  • 问题:Guest OS 想执行特权指令(如 hltcli、修改 CR3),如果直接跑在 ring0 会真的控制物理 CPU。
  • 历史方案—— trap-and-emulate(陷入再模拟):让 Guest 跑在 ring1/3,特权指令自动触发 trap 陷入 hypervisor,hypervisor 模拟其语义。但 x86 早期有"敏感非特权指令"(如 popf)不 trap,破坏了这个模型。
  • 硬件辅助—— Intel VT-x / AMD-V(重点)
    • 引入 root mode(VMX root)non-root mode(VMX non-root) 两套特权级,hypervisor 跑 root,Guest 跑 non-root。
    • 关键数据结构:VMCS(Virtual Machine Control Structure),保存 Guest/Host 寄存器状态、控制位、exit 原因。
    • 关键指令:VMLAUNCH/VMRESUME 进入 Guest,发生 sensitive event 触发 VM-Exit 回 Host 处理,VMWRITE/VMREAD 操作 VMCS 字段。
  • 学法:读 Intel SDM Vol.3 第 23~34 章(VMX 架构);理解一次 VM-Exit 的开销来源(上下文切换 + VMCS 读写)。

1.2 内存虚拟化

  • 影子页表(Shadow Page Table,SPT)—— 软件方案:hypervisor 为每个 Guest 维护一张 GVA→HPA 的表,给 Guest 看的是它的 GVA→GPA 表,给硬件 MMU 看的是 SPT。缺点:影子表建立/同步开销大。
  • EPT(Extended Page Table)/ NPT —— 硬件方案(重点)
    • 两级页表:GVA→GPA(Guest 页表)→ HPA(EPT),由 MMU 硬件自动走,无需软件影子表。
    • 缺页:Guest 缺页(GVA→GPA)走 Guest 自己的 page fault;EPT 缺页(GPA→HPA)触发 EPT Violation 陷入 hypervisor。
  • 学法:手画 GVA→GPA→HPA 三级地址翻译图;理解 EPT Violation 与 Guest Page Fault 的区别。

1.3 IO 虚拟化(最复杂、最值钱)

  • 全虚拟化(Full Virt,模拟):QEMU 纯软件模拟硬件(如 e1000 网卡、IDE 磁盘),Guest 不用改驱动,但每次 IO 都陷入 hypervisor 模拟,慢。
  • 半虚拟化(Para-Virt,PV):Guest 改驱动(virtio),知道自己活在虚拟机里,通过 virtqueue 与 hypervisor 高效通信,减少陷入。这是工程主流。
  • 硬件直通(VFIO / SR-IOV)
    • VFIO(Virtual Function I/O):把物理设备直接分配给 Guest,靠 IOMMU 做地址翻译和隔离,Guest 驱动直接操作真硬件,性能近裸机。GPU 直通就是这个。
    • SR-IOV:一块物理网卡切成多个 Virtual Function(VF),每个 VF 独立分配给一个 VM,硬件级隔离,性能极高、云网络常用。
  • 学法:一定要读 virtio 规范(vring、avail ring、used ring、split/packed virtqueue),这是云网络与容器网络共享的底层。

动手

  • 用 KVM API(/dev/kvm)手写一个最小 hypervisor,跑一段 guest 代码(推荐 kvm-hello-world / 裸机汇编)。这是理解 VMCS、VM-Exit 最快的路。
  • 编译一个带 virtio 驱动的内核,在 QEMU 里对比 e1000 vs virtio-net 的 iperf 带宽。

验收

  • 能画出 CPU/内存/IO 虚拟化的三层抽象图,说清"trap-and-emulate 为什么对 x86 不够 → VT-x 怎么补 → EPT 怎么省软件开销 → virtio 怎么省陷入 → VFIO 怎么近裸机"。
  • 能解释一次网络包从 Guest 发出到物理网线的完整路径(virtio → vring → KVM exit → tap → host 内核 → 网卡)。

资料

  • Intel SDM Vol.3C(VMX/EPT 章节,硬核但权威)
  • 《系统虚拟化:原理与实现》—— 国内经典
  • KVM API 文档:Documentation/virt/kvm/(内核源码内)
  • virtio spec:https://docs.oasis-open.org/virtio/virtio/v1.2/

阶段 2:QEMU-KVM 全栈(2~3 周)

原理落地到工程就是 QEMU+KVM 这套事实标准。

必学

  • 架构分工:KVM 是内核模块,提供 CPU 与内存虚拟化(用 VT-x/EPT);QEMU 是用户态进程,提供 设备模拟 + IO 路径 + VCPU 线程调度。一个 VM = 一个 QEMU 进程,每个 vCPU = 一个 QEMU 线程。
  • QEMU 线程模型:main loop(事件驱动)、vCPU 线程、IO 线程(-object iothread)、worker。
  • 关键数据流:Guest IO → virtio → ioeventfd 唤醒 IOThread → 处理 vring → tap/socket → host 网络。
  • 镜像格式:raw、qcow2(快照、薄置备、copy-on-write)、分层镜像 backing file。
  • 热迁移(Live Migration):pre-copy(迭代同步脏页)→ stop-and-copy → resume;理解脏页追踪(KVM dirty log)、停机时间(downtime)与收敛。
  • QMP/HMP:QEMU 管理协议,libvirt 在它之上。

动手

  • 用裸 qemu-system-x86_64 命令行起一个 VM,加 virtio-net + virtio-blk + qcow2。
  • 实现一次热迁移:起两台 host,qemu ... -incoming tcp:0 端口接收,观察迁移日志。
  • 写一个 qcow2 backing file 的链:基础镜像 + 增量层。

验收

  • 能说清"QEMU 和 KVM 各自负责什么、为什么这样分工"。
  • 能讲清热迁移的 pre-copy 迭代、何时切换 stop-and-copy、脏页率如何影响迁移成功。

资料

  • QEMU 文档与 wiki
  • libvirt 文档(virsh / XML domain)
  • 《Deep Dive into QEMU/KVM》系列博客

阶段 3:容器虚拟化——操作系统级(2 周)

容器不是新东西,是"轻量虚拟化":不虚拟硬件,而是用内核特性隔离进程。理解它对云原生和 ML 平台都至关重要。

必学

  • namespace(隔离视图)pid / net / mnt / uts / ipc / user / cgroup,每个 ns 隔离一类资源。unshare/setns 系统调用。
  • cgroup(限制资源):v1 vs v2、cpu/cpu/memory/blkio/io 设备控制器;限制 CPU/内存/IO 带宽。
  • rootfs 与镜像分层:OverlayFS / AUFS 联合挂载,写时复制,这就是 Docker 镜像的本质。
  • 容器运行时:runc(OCI runtime,低级)、containerd(高级,管理镜像和生命周期)、Docker daemon、CRI-O(K8s 原生)。
  • 容器 vs 虚拟机:隔离强度(容器共享内核,逃逸即宿主沦陷)vs 启动速度/密度。安全敏感场景用 Kata Containers / gVisor(容器接口+VM 隔离)。

动手

  • 不用 Docker,手工拼一个容器unshare --pid --net --mount --uts --ipc -r + chroot + cgroup 限制,亲手体验隔离。这是理解容器最快的路。
  • runc 跑一个 OCI bundle。
  • 搭 OverlayFS 多层 rootfs。

验收

  • 能说清"namespace 管隔离、cgroup 管限制、rootfs 管文件系统,三者拼成容器"。
  • 能讲清容器为什么比 VM 轻、但隔离弱,Kata 怎么补这个差距。

资料

  • 《自己动手写 Docker》—— 极推荐,逐章实现
  • Linux man: namespaces(7), cgroups(7)
  • OCI spec:https://opencontainers.org/

阶段 4:网络与存储虚拟化(2~3 周,工程深水区)

云平台的核心交付物就是"虚拟网络"和"虚拟存储"。

4.1 网络虚拟化

  • tap/tun:宿主机上的虚拟网卡一端,另一端接到 QEMU,Guest 的包从 tap 进 host 内核网络栈。
  • bridge / macvlan / ipvlan:宿主机二层交换。
  • veth pair:容器网络标配,连两个 netns。
  • OVS(Open vSwitch):软件交换机,支持 OpenFlow 流表、VLAN、GRE/VXLAN 隧道。
  • Overlay 网络:VXLAN / Geneve,在三层之上打二层隧道,是云多租户网络隔离的基础。
  • SR-IOV + DPDK:硬件加速,把包处理从内核搬到用户态 polling,性能逼近裸机。云网络性能调优必学。
  • CNI:K8s 容器网络接口,Calico(BGP+eBPF)/ Flannel(VXLAN)/ Cilium(eBPF)。

4.2 存储虚拟化

  • 块设备虚拟化:virtio-blk、virtio-scsi、aio/io_uring 后端。
  • 分布式存储:Ceph(RBD 块、CephFS 文件、RGW 对象)、GlusterFS、LVM + iSCSI。
  • 云原生存储:CSI 接口、本地盘(Local PV)/ 网络 PV,训练场景下本地 NVMe + 分布式 checkpoint 存储的取舍。
  • 存储性能:IOPS/吞吐/延迟,io_uring 替代 aio 提升排队性能。

动手

  • ip / bridge 命令手工建一个 VXLAN 隧道连两台 host。
  • 起一个 OVS,加流表实现简单转发。
  • virtio-blk vs virtio-scsi vs VFIO 直通 NVMefio,对比 IOPS。
  • 搭一个最小 Ceph 集群(3 节点)跑 RBD,挂给 QEMU 当盘。

验收

  • 能画出"一个 VM 的网络包从 Guest 应用到物理网卡经过的所有组件"和"容器跨主机通信的 overlay 路径"。
  • 能讲清 SR-IOV/DPDK 为什么快(bypass kernel + 硬件 VF)。

资料

  • 《Linux 网络内核技术与实战》
  • OVS 文档;Cilium 文档与 eBPF 介绍
  • Ceph 架构文档

阶段 5:云编排——OpenStack / Kubernetes(3 周)

会造单机,还要会管集群。

5.1 OpenStack(IaaS,VM 编排)

  • 核心组件:Nova(计算,对接 libvirt/QEMU/KVM)、Neutron(网络,OVS/OVN)、Cinder(块存储)、Glance(镜像)、Keystone(认证)、Swift(对象存储)。
  • 重点:Nova 调度与 libvirt 驱动、Neutron 的 L2/L3 agent、OVN 替代传统 L3、Cinder 多后端。

5.2 Kubernetes(PaaS/容器编排)

  • 架构:apiserver / etcd / scheduler / controller-manager / kubelet / CRI / CNI / CSI。
  • 调度:调度器扩展(filter/score)、 Gang scheduling(Volcano,训练任务靠它保证 all-or-nothing)、bin-packing vs spread。
  • 设备插件:Device Plugin 框架(GPU/HugePage/RDMA),nvidia.com/gpurdma/hca 资源上报。
  • Operator/CRD:自定义控制器,大模型训练平台(如 Kubeflow/Ray Operator)的基础。

5.3 VM + 容器融合

  • KubeVirt:在 K8s 里跑 VM(用 CRD 描述 VM,kubevirt 控制器调 virt-launcher pod)。
  • Kata Containers:容器接口 + hypervisor 隔离,强隔离容器。

动手

  • kind/kubeadm 搭一个多节点 K8s,部署一个 Device Plugin 上报 GPU,调度一个 pod 用 GPU。
  • devstack 起一个 all-in-one OpenStack,创建网络/卷/实例。
  • 跑通 Volcano 的 gang scheduling 一个训练任务。

验收

  • 能讲清 K8s 调度流程、Device Plugin 如何把 GPU/RDMA 报上来给调度器。
  • 能对比 OpenStack vs K8s 在"管 VM" vs "管容器"上的定位。

资料

  • Kubernetes 官方文档
  • OpenStack 官方文档
  • Volcano 文档;KubeVirt 文档

阶段 6:进阶专题(按方向选)

6.1 GPU 虚拟化(ML 系统方向必学)

  • GPU 直通(VFIO-PCI):一整张 GPU 给一个 VM,性能最好但无法分片。
  • vGPU / SR-IOV GPU(NVIDIA MIG / vGPU、AMD SR-IOV):一张物理 GPU 切多份给多 VM/容器,MIG 是硬件级隔离(A100/H100),vGPU 是时间片复用。
  • MPS(Multi-Process Service):多进程共享单 GPU 上下文,减少上下文切换开销,做推理 serving 分时复用。
  • GPU 显存虚拟化/切分:Unified Memory、cudaMallocManaged、显存超额订阅(oversubscription)。
  • 与 K8s 集成:NVIDIA GPU Operator、MIG 管理、time-slicing vs MIG 的取舍。

6.2 安全虚拟化

  • 可信计算:TPM 虚拟化(vTPM)、机密计算(Intel TDX / AMD SEV-SNP / ARM CCA)——内存加密隔离 VM,防 hypervisor/宿主窥视。云厂商重投入方向。
  • 沙箱:gVisor(用户态内核拦截 syscall)、Firecracker(Rust 写的极简 microVM,AWS Lambda/Fargate 用)。

6.3 性能与可观测性

  • 性能调优:CPU pinning(绑核,taskset/virsh vcpupin)、NUMA 亲和、HugePages、io_uring、virtio 多队列、vhost 内核态加速、ioeventfd
  • 可观测perf/bpftrace/bcc 追踪 VM-Exit 原因、kvm_stat、virtio 队列深度。

6.4 边缘与无服务器

  • Firecracker microVM、Kata on edge、Serverless 冷启动优化。

动手

  • 给一张 GPU 做 MIG 切分,在 K8s 里把 7 个 MIG 实例当成 7 个 nvidia.com/mig 资源调度 7 个推理 pod。
  • kvm_stat 看一个 VM 跑负载时的 VM-Exit 分布,调 vCPU 绑核前后对比。
  • 起一个 Firecracker microVM,对比它与 QEMU 的启动时间和内存占用。

给 ML 系统工程师的"虚拟化到训练平台"串讲

把虚拟化知识与你的主业(大模型训练/推理平台)打通:

  1. 训练集群为什么常用裸金属 + 容器而不是 VM:训练对 RDMA/GPU Direct RDMA、NVLink 拓扑、NUMA 亲和极敏感,虚拟化层(即使 VFIO)会引入 PCIe 拓扑变化和 P2P 隔离问题,所以训练节点常用裸金属 + K8s Device Plugin 暴露 RDMA/GPU,而非 VM。
  2. 推理 serving 为什么适合容器/microVM:推理要高密度、快启动、多租户隔离,容器 + GPU time-slicing/MIG + Firecracker 强隔离是主流。理解 virtio/SR-IOV 能帮你调 serving 网络性能。
  3. 机密计算 + 推理:客户对模型权重保密时,用 TDX/SEV-SNP 跑加密 VM,权重在加密内存里解密,宿主和 hypervisor 看不到——这是云上私有模型部署的新趋势。
  4. 存储虚拟化与 checkpoint:训练 checkpoint 动辄上百 GB,走 Ceph 太慢,工程上常用本地 NVMe + 分布式对象存储分层,CSI/Operator 编排。理解 qcow2 backing file、Ceph RBD 帮你设计 checkpoint 管线。

推荐时间表(3~4 个月业余时间)

阶段 产出
1~2 阶段0 地基 能讲 ring/页表/系统调用
3~5 阶段1 三大原理 手写最小 KVM hypervisor
6~8 阶段2 QEMU-KVM 跑通热迁移、qcow2 分层
9~10 阶段3 容器 手写容器、runc bundle
11~13 阶段4 网络存储 OVS+VXLAN、Ceph RBD
14~16 阶段5 编排 K8s+Device Plugin、OpenStack all-in-one
17+ 阶段6 专题 GPU MIG on K8s、kvm_stat 调优

一句话总结

虚拟化的本质是"用一层软件造一个看起来独占的硬件假象"——CPU 用 VT-x 造处理器假象、内存用 EPT 造地址空间假象、IO 用 virtio/VFIO 造设备假象、容器用 namespace/cgroup 造系统假象、云用编排器造无限资源假象。把这五层"造假术"从硬件到云原生逐层吃透,你就是合格的虚拟化/云平台工程师。