虚拟化 —— KVM、Xen、Hyper-V 与 SR-IOV

虚拟化把一台物理机变成多台虚拟机,是云计算的根本基础。本文讲清虚拟化的演进、KVM / Xen / Hyper-V 三大方案、以及 SR-IOV / vGPU 等”硬件辅助”技术。

虚拟化的两种类型

graph TB
  T1[Type 1 Hypervisor
裸金属] T1 --> T1A[VMware ESXi] T1 --> T1B[Microsoft Hyper-V] T1 --> T1C[Xen] T1 --> T1D[KVM 也算
跑在 Linux 内核里] T2[Type 2 Hypervisor
宿主机型] T2 --> T2A[VMware Workstation] T2 --> T2B[VirtualBox] T2 --> T2C[QEMU 用户态] T2 --> T2D[Parallels]

数据中心只用 Type 1——直接跑在硬件上,性能最优。Type 2 是开发 / 桌面用。

CPU 虚拟化的硬件支持

CPU 虚拟化经历两个阶段:

1
2
3
4
5
6
7
8
9
2005 之前:纯软件虚拟化(VMware 早期、Xen para-virt)
- 二进制翻译 / 修改客户机 OS
- 性能损失 30-50%

2005+:硬件辅助虚拟化
- Intel VT-x(2005)
- AMD-V(2006)
- 性能损失 < 5%
- 客户机 OS 可不修改

后续硬件持续增强:

1
2
3
4
5
EPT / NPT:     第二级页表(地址翻译加速)
VPID: TLB 标签(避免 vmexit 刷 TLB)
APICv: 中断虚拟化加速
VT-d / IOMMU: IO 设备虚拟化(设备直通)
SR-IOV: 网卡 / GPU 单设备多虚机

ARM 也有等价:

1
2
ARM VHE(Virtualization Host Extensions):     v8.1
ARM SMMU(System MMU): IOMMU 等价

KVM:Linux 内核里的虚拟化

KVM(Kernel-based Virtual Machine)是 Linux 2.6.20(2007)合入的内核虚拟化模块:

graph TB
  HW[硬件 CPU + VT-x/EPT]
  KVM[KVM 内核模块]
  HW --> KVM
  
  QEMU[QEMU 用户态]
  KVM --- QEMU
  
  GUEST1[VM 1 GuestOS]
  GUEST2[VM 2 GuestOS]
  
  QEMU --> GUEST1
  QEMU --> GUEST2

KVM 架构特点:

1
2
3
4
5
- KVM 模块负责 CPU/内存虚拟化
- QEMU 负责设备模拟(磁盘 / 网卡 / 显卡)
- 每个 VM 是一个 QEMU 进程
- VM 内 vCPU 是一个 Linux 线程
- Linux 调度器调度 vCPU

KVM + QEMU 的实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 装包(Ubuntu / RHEL)
apt install qemu-kvm libvirt-daemon-system virt-manager
dnf install qemu-kvm libvirt virt-manager

# 启动 libvirtd
systemctl enable --now libvirtd

# virsh 命令
virsh list # 看运行中 VM
virsh list --all # 看所有 VM
virsh start <vm> # 启动
virsh shutdown <vm> # 优雅关机
virsh destroy <vm> # 强制关闭
virsh dominfo <vm> # VM 信息

# virt-install 创建 VM
virt-install --name=vm1 \
--vcpus=4 --memory=8192 \
--disk size=50 \
--cdrom=ubuntu.iso \
--os-variant=ubuntu24.04 \
--network bridge=br0 \
--graphics vnc

# 直接 QEMU 命令行(不通过 libvirt)
qemu-system-x86_64 -enable-kvm \
-smp 4 -m 8G \
-hda disk.qcow2 \
-netdev user,id=net0 -device virtio-net,netdev=net0

KVM 的性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# CPU pinning(绑核)
virsh vcpupin vm1 0 4-7 # vCPU 0 绑到物理 4-7

# NUMA 配置
virsh edit vm1
# <cpu mode='host-passthrough'>
# <numa>...</numa>
# </cpu>

# 大页内存
echo 8192 > /proc/sys/vm/nr_hugepages # 16 GB 大页

# 关闭 KSM(多 VM 共享内存对延迟敏感场景关)
echo 0 > /sys/kernel/mm/ksm/run

virtio:半虚拟化设备

KVM 默认用 virtio——一组半虚拟化设备规范:

1
2
3
4
5
6
7
virtio-net:     网卡
virtio-blk: 块设备
virtio-scsi: SCSI 控制器
virtio-balloon: 内存膨胀(VM 间动态分配)
virtio-fs: 文件系统共享
virtio-gpu: GPU
virtio-rng: 随机数生成器

virtio 性能比模拟硬件(e1000、IDE)快 10-100 倍。

Xen

Xen 是 2003 年剑桥大学的研究项目,2007 年 Citrix 商业化:

graph TB
  HW[硬件]
  XEN[Xen Hypervisor
裸金属] HW --> XEN DOM0[Dom0
特权 Linux
控制 + 设备驱动] DOMU1[DomU 1
客户 OS] DOMU2[DomU 2] XEN --- DOM0 XEN --- DOMU1 XEN --- DOMU2

Xen 的核心概念:

1
2
3
4
5
Dom0:     特权域,跑 Linux,提供设备驱动给其他 VM
DomU: 非特权域,普通 VM
PV: Para-virtualization(半虚拟化),客户 OS 修改过
HVM: Hardware Virtual Machine(全虚拟化)
PVH: 混合,HVM + PV 优点

Xen 的兴衰

1
2
3
4
5
6
7
8
9
10
11
12
13
2007-2015:Xen 是云鼻祖
- AWS EC2 早期全 Xen
- Citrix XenServer 企业市场
- 阿里云 / 腾讯云早期也用 Xen

2015+:KVM 全面崛起
- AWS Nitro 弃 Xen 转 KVM 衍生
- 开源社区聚焦 KVM
- Xen 主要剩 Citrix 商业产品

2023+:基本边缘化
- 仍有少数嵌入式 / 安全场景
- Xen 项目改名 Xen Hypervisor,Linux Foundation 下

Xen 已不是数据中心主流——除非有历史包袱,新建系统不上 Xen。

VMware ESXi

VMware 是 1998 年成立的虚拟化老厂,ESXi 是其裸金属 Hypervisor:

1
2
3
4
5
6
7
8
9
10
11
ESXi:     裸金属 Hypervisor
vSphere: ESXi + vCenter(管理面)
NSX: 网络虚拟化
vSAN: 存储虚拟化

商业模式:高端商业,单 socket 订阅 license

2023:Broadcom 收购 VMware($610 亿)
- 大幅涨价 + 转订阅制
- 中小客户大量逃离
- 国产 / 开源替代加速

VMware 当前问题:

1
2
3
4
1. Broadcom 收购后涨价 200-300%
2. 永久 license 取消,全转订阅
3. 中小企业开始迁出(Proxmox / OpenStack / 国产)
4. 国产虚拟化(深信服、新华三 H3C UIS、华为 FusionCompute)替代加速

待补充:VMware 客户流失数据 / 国产替代迁移规模。

Microsoft Hyper-V

Microsoft 自家 Hypervisor:

1
2
3
4
5
6
7
8
9
10
Windows Server Hyper-V:     企业级
Azure Hypervisor: 云上变体
Hyper-V Server: 免费独立版(已停)

特点:
- Windows / Linux VM 都支持
- 与 Windows Server 集成
- Azure 云的基础

市场: 主要是 Microsoft 客户和 Azure 云

OpenStack:开源云的”操作系统”

OpenStack 不是 Hypervisor 而是云管理平台:

graph TB
  CLI[CLI / Web UI]
  CLI --> NOVA[Nova
计算 / VM 管理] CLI --> NEUTRON[Neutron
网络] CLI --> CINDER[Cinder
块存储] CLI --> SWIFT[Swift
对象存储] CLI --> KEYSTONE[Keystone
身份] CLI --> GLANCE[Glance
镜像] CLI --> HEAT[Heat
编排] NOVA --> KVM[KVM / Xen / Hyper-V] NEUTRON --> OVS[Open vSwitch / OVN]

OpenStack 在中国被广泛使用:

1
2
3
4
5
6
华为 FusionCloud / 华为云:    OpenStack 衍生
H3C UIS: OpenStack 衍生
深信服超融合: OpenStack 衍生
ZStack: 国产 OpenStack 替代

公有云 / 私有云的"标准"开源平台

SR-IOV:硬件虚拟化的”作弊”

SR-IOV(Single Root I/O Virtualization)让一个 PCIe 设备自己变成”多个虚拟设备”

graph TB
  PHY[物理网卡
PF Physical Function] PHY --> V1[VF 1
Virtual Function] PHY --> V2[VF 2] PHY --> V3[VF 3] PHY --> VN[VF N
最多 256] V1 -.- VM1[VM 1] V2 -.- VM2[VM 2] V3 -.- VM3[VM 3]

每个 VF 在 VM 看来就是独立网卡——绕过 Hypervisor 的软件交换机,直接 DMA

性能对比:

1
2
virtio-net:                 几 GB/s
SR-IOV VF 直通: ~95% 物理性能

应用:

1
2
3
4
- 云裸金属:    每个 VM 一个 VF
- 5G 网元: 极致延迟
- HPC: 类似裸金属
- AI 训练 VM: GPU 也要 SR-IOV

VFIO 与设备直通

VFIO(Virtual Function I/O)是 Linux 把 PCIe 设备暴露给用户态的框架:

1
2
3
4
5
6
7
8
9
应用:     
- GPU 直通:把整张 H100 给一个 VM
- 网卡直通:SR-IOV VF 直通
- 加密卡 / FPGA 直通

要求:
- IOMMU 启用(intel_iommu=on / amd_iommu=on)
- vfio-pci 驱动绑定
- PCIe ACS 支持(避免 DMA 攻击)
1
2
3
4
5
6
7
8
9
10
11
# 启用 IOMMU(GRUB 启动参数)
intel_iommu=on iommu=pt

# 看 IOMMU group
ls /sys/kernel/iommu_groups/

# 绑定 vfio-pci
echo 10de 2330 > /sys/bus/pci/drivers/vfio-pci/new_id

# QEMU 命令行直通
qemu-system-x86_64 -device vfio-pci,host=01:00.0

vGPU:GPU 虚拟化

NVIDIA vGPU 让一颗 GPU 多 VM 共享:

graph TB
  GPU[NVIDIA GPU
例如 A100] GPU --> M1[MIG 实例 1] GPU --> M2[MIG 实例 2] GPU --> M3[MIG 实例 3] GPU --> M7[MIG 实例 7] M1 -.- V1[VM 1] M2 -.- V2[VM 2]

NVIDIA vGPU 两种模式:

1
2
3
4
5
6
7
8
9
10
Time-slicing(vGPU 软件):
- 多 VM 时间片轮转用 GPU
- 软件许可(需要 NVIDIA Grid 订阅)
- 适合显卡虚拟化(VDI)

MIG(Multi-Instance GPU,A100/H100):
- 硬件分割
- 每个 MIG 实例独立 SM、L2、显存
- QoS 严格隔离
- 适合 AI 推理 / 多租户

A100 / H100 MIG 配置:

1
2
3
4
5
6
7
A100 80GB 可分:
7× 1g.10gb(最小)
3× 2g.20gb
2× 3g.40gb
1× 7g.80gb(不分)

H100 80GB 类似 A100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启用 MIG
nvidia-smi -i 0 -mig 1

# 看 MIG 实例
nvidia-smi mig -lgi
nvidia-smi mig -lci

# 创建 MIG
nvidia-smi mig -cgi 9,9,9,9,9,9,9 # 7 个 1g.10gb
nvidia-smi mig -cci

# 删除
nvidia-smi mig -dci
nvidia-smi mig -dgi

容器 vs 虚拟机

graph TB
  subgraph VM["虚拟机栈"]
    direction TB
    V1[App]
    V2[Guest OS]
    V3[Hypervisor]
    V4[Host OS]
    V5[硬件]
    V1 --> V2 --> V3 --> V4 --> V5
  end
  
  subgraph CN["容器栈"]
    direction TB
    C1[App]
    C2[容器运行时]
    C3[Host OS]
    C4[硬件]
    C1 --> C2 --> C3 --> C4
  end
维度 VM 容器
隔离 强(硬件级) 弱(namespace + cgroup)
启动 30s-1min 秒级
内存占用 GB 级 / VM MB 级 / 容器
性能 <5% loss <1% loss
安全 内核漏洞不易跨 内核共享,漏洞共担
用途 多租户 / 强隔离 微服务 / DevOps

容器后续单独一篇展开。

微虚拟化 / Firecracker / Kata Containers

容器的安全性弱——业界发明了”轻量虚拟化”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Firecracker(AWS):
- 微 VM,启动 125 ms,内存 5 MB
- AWS Lambda / Fargate 用
- Rust 实现,攻击面小

Kata Containers:
- "VM 包容器"
- 看起来是容器,实际是 VM
- 安全 + 兼容容器生态
- QEMU / Cloud Hypervisor 后端

Cloud Hypervisor(Intel/AMD/Microsoft):
- Rust 实现的轻量 Hypervisor
- 替代 QEMU 在某些场景

这些”微虚拟化”是 serverless / 多租户 K8s 的关键。

嵌套虚拟化

VM 里跑 VM:

1
2
3
4
5
6
7
8
9
10
启用嵌套:
modprobe kvm_intel nested=1
或 GRUB: kvm-intel.nested=1

应用:
- 云上跑 K8s 节点 + VM 测试
- CI 跑虚拟化测试
- 套娃训练环境

性能: 损失 5-10% / 层

Live Migration(在线迁移)

VM 迁移到另一台物理机不停机:

1
2
3
4
5
6
7
8
9
10
11
12
13
原理:
1. 标记内存脏页
2. 在线复制内存到目标
3. 反复迭代脏页
4. 暂停 source,复制最后脏页 + 寄存器
5. 启动 destination

停机时间: 50-500 ms(看内存大小和带宽)

要求:
- 网络共享存储或镜像迁移
- 网络带宽足够(10G+)
- CPU 能力相近(或开 host-passthrough 关)
1
2
# KVM Live Migration
virsh migrate --live vm1 qemu+ssh://target-host/system

VM Live Migration 在云上是常态——升级宿主机时,把 VM 平滑迁走,租户感知微小。

虚拟化的几个老坑

坑 1:忘记开 VT-x / VT-d

1
2
3
4
5
6
7
8
9
# 看 CPU 是否支持
egrep "vmx|svm" /proc/cpuinfo

# 看 KVM 是否启用
ls /dev/kvm # 应该存在
lsmod | grep kvm

# IOMMU 状态
dmesg | grep -E "DMAR|IOMMU"

很多服务器 BIOS 默认不开 VT-d——必须 BIOS 启用。

坑 2:CPU “host” vs “host-model”

1
2
3
host-passthrough:  完全暴露物理 CPU 特性,性能最好但 Live Migration 受限
host-model: 暴露相近 CPU 模型,可迁移
custom: 指定通用模型("qemu64"),性能损失但兼容性最好

云厂家一般用 host-model 折中。

坑 3:内存 ballooning 调过头

1
2
3
4
5
balloon 让 Hypervisor 在 VM 间动态调内存
但调过头:VM 突然 OOM
建议:
- 业务 VM 关闭 balloon
- 给定固定内存

坑 4:KSM 误用

1
2
3
4
5
6
KSM(Kernel Same-page Merging):
- 多 VM 共享相同内存页
- 节省内存
- 但增加 CPU 开销 + 侧信道风险

延迟敏感场景关: echo 0 > /sys/kernel/mm/ksm/run

坑 5:Live Migration 失败

1
2
3
4
5
常见原因:
1. CPU 模型不匹配 → host-model 不一致
2. 网络配置不一致 → bridge 名不同
3. 共享存储不可达 → 镜像不在 NFS / Ceph 上
4. 安全策略阻断 → SELinux / AppArmor

虚拟化的国产化

1
2
3
4
5
6
7
8
华为 FusionCompute:    KVM 衍生 + 自家管理
深信服 aSV: KVM 衍生
新华三 H3C CAS / UIS: KVM 衍生 + OpenStack
浪潮 InCloud: KVM 衍生
ZStack: 国产 OpenStack 替代
青云 QingCloud: 自研

VMware 替代浪潮: Broadcom 收购后加速

待补充:国产虚拟化产品 2025-2026 在政企的实际部署比例。

虚拟化与云

graph TB
  PUB[公有云
AWS/Azure/GCP/阿里/腾讯] PUB --> NITRO[AWS Nitro
KVM 衍生 + DPU 卸载] PUB --> AZURE_HV[Azure Hypervisor
Hyper-V 衍生] PUB --> ALI[阿里神龙
KVM + DPU] PRIV[私有云] PRIV --> VMW[VMware vSphere
已被 Broadcom] PRIV --> OS[OpenStack 系] PRIV --> CN_OS[国产虚拟化]

公有云 Hypervisor 都是 “KVM 深度定制 + DPU 卸载” 的路线。

一些数字直觉

1
2
3
4
5
6
7
8
9
10
11
12
13
KVM VM 启动:              30s - 1min
Firecracker μVM 启动: 125 ms
Kata Container 启动: ~1 sec

KVM CPU 性能损失: <2%
KVM IO 性能损失(virtio):5-15%
SR-IOV 网卡: ~95% 性能
GPU 直通: 100% 性能
NVIDIA MIG: 资源严格隔离

VMware vSphere license: $5K-15K / socket(Broadcom 后)
KVM + libvirt: 免费
华为 FusionCompute: ¥几万 / 节点

小结

  • 虚拟化分 Type 1(裸金属)和 Type 2(宿主机),数据中心只用 Type 1
  • KVM 是 Linux 内核虚拟化,QEMU 提供设备模拟
  • Xen 已边缘化,VMware 被 Broadcom 收购后涨价加速国产化
  • SR-IOV 让一个网卡变多 VF,VFIO 让设备直通到 VM
  • NVIDIA MIG 是 A100/H100 硬件级 GPU 虚拟化
  • Firecracker / Kata 是”轻量虚拟化”,serverless 主流
  • Live Migration 是云的核心能力

下一篇讲容器与 K8s——比 VM 更轻、规模更大的”OS 层抽象”。