虚拟化技术学习路线——从原理到云原生
虚拟化技术学习路线——从原理到云原生
本文目标:给你一条从零到能独立设计/运维虚拟化平台的清晰路径。覆盖 CPU/内存/IO 虚拟化、QEMU/KVM、容器与 namesapce/cgroup、网络与存储虚拟化、云编排,最后落到大模型训练/推理场景下的 GPU 虚拟化与云原生调度。
学习哲学:先吃透"一个虚拟机是怎么被造出来的",再学"容器是怎么隔离的",最后学"云平台怎么把它们编排起来"。原理是地基,工程是楼层,地基不稳楼越高越晃。
学习路线总览(六个阶段)
1 | 阶段0 打地基:操作系统与硬件基础 |
每个阶段我都标注了:学什么 → 怎么学(动手)→ 验收标准 → 推荐资料。
阶段 0:打地基(1~2 周)
虚拟化的本质是"在操作系统和硬件之间加一层抽象",看不懂操作系统就理解不了虚拟化在抽象什么。
必学
- x86 体系结构:特权级 ring0~ring3、用户态/内核态、中断/异常、MMU/页表、DMA、PCIe 总线、IOMMU。
- Linux 内核机制:进程调度、内存管理(buddy/slab/缺页)、VFS、设备驱动模型、系统调用入口。
- 操作系统接口:
fork/exec/wait、mmap、ioctl、epoll、mmap与共享内存。
动手
- 用
strace跟一个程序的系统调用;用perf看上下文切换;读/proc、/sys。 - 写一个最简字符设备驱动模块(
hello worldko),体会内核态。
验收
- 能说清"ring0 和 ring3 的区别、为什么需要这种隔离、syscall 怎么穿越特权级"。
- 能解释 MMU 页表、TLB、缺页流程。
资料
- 《深入理解计算机系统》(CSAPP)
- 《Linux 内核设计与实现》Robert Love
- 《奔跑吧 Linux 内核》
阶段 1:虚拟化三大原理(2~3 周,核心)
这是整条路线的灵魂。虚拟化要解决"如何让一个 OS 以为自己在独占硬件",由 Popek-Goldberg 定理给出必要条件:敏感指令必须可被 hypervisor 截获且行为可模拟。三大虚拟化:
1.1 CPU 虚拟化
- 问题:Guest OS 想执行特权指令(如
hlt、cli、修改 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-blkvsvirtio-scsivsVFIO 直通 NVMe跑fio,对比 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/gpu、rdma/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 系统工程师的"虚拟化到训练平台"串讲
把虚拟化知识与你的主业(大模型训练/推理平台)打通:
- 训练集群为什么常用裸金属 + 容器而不是 VM:训练对 RDMA/GPU Direct RDMA、NVLink 拓扑、NUMA 亲和极敏感,虚拟化层(即使 VFIO)会引入 PCIe 拓扑变化和 P2P 隔离问题,所以训练节点常用裸金属 + K8s Device Plugin 暴露 RDMA/GPU,而非 VM。
- 推理 serving 为什么适合容器/microVM:推理要高密度、快启动、多租户隔离,容器 + GPU time-slicing/MIG + Firecracker 强隔离是主流。理解 virtio/SR-IOV 能帮你调 serving 网络性能。
- 机密计算 + 推理:客户对模型权重保密时,用 TDX/SEV-SNP 跑加密 VM,权重在加密内存里解密,宿主和 hypervisor 看不到——这是云上私有模型部署的新趋势。
- 存储虚拟化与 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 造系统假象、云用编排器造无限资源假象。把这五层"造假术"从硬件到云原生逐层吃透,你就是合格的虚拟化/云平台工程师。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Roger-Lv's space!
评论


