前言

云厂商把物理机"切"成一台台云主机卖给你,用的核心武器就是 KVM 虚拟化。理解它,就理解了 IaaS 的地基,也理解了容器的宿主环境。

一、虚拟化要解决什么

一台物理机上跑多个"完整电脑",核心需求:

  1. CPU 虚拟化:让多个客户机(Guest)安全地共享物理 CPU
  2. 内存虚拟化:每个 Guest 拥有连续的"假物理内存"
  3. 设备虚拟化:网卡、磁盘都是模拟出来的
  4. 隔离与调度:Hypervisor(VMM)负责资源分配

二、KVM 与 QEMU 的分工

这对搭档经常一起出现,但职责完全不同:

组件 形态 职责
KVM Linux 内核模块(kvm.ko, kvm_intel.ko) 提供 CPU/内存虚拟化(依赖硬件 VT-x/AMD-V),只管"核心"
QEMU 用户态程序 模拟整套硬件(BIOS、网卡、显卡、磁盘控制器),提供设备 IO
libvirt 守护进程 + 工具集 管理 API(定义/启动/迁移虚拟机),virsh 是它的 CLI

一句话:KVM 是发动机,QEMU 是车身和方向盘,libvirt 是仪表台。

# 检查 CPU 是否支持虚拟化
grep -cE "(vmx|svm)" /proc/cpuinfo     # >0 即支持
lsmod | grep kvm                       # 模块是否加载

# 安装全家桶(RHEL 系)
dnf install -y qemu-kvm libvirt virt-install virt-top
systemctl enable --now libvirtd

三、CPU 虚拟化怎么工作(概念级)

  • 全虚拟化:Guest 不知道自己被虚拟化,敏感指令陷入 KVM 由内核处理(硬件辅助,VT-x 的 root/non-root 模式)
  • 半虚拟化(PV):Guest 装了特殊驱动(virtio),知道自己在虚拟机里,IO 走高效通道
  • 直通(passthrough):把物理设备直接分配给 Guest(VFIO/SR-IOV),性能接近裸机

四、virtio:性能的关键

模拟真实硬件(e1000 网卡、IDE 磁盘)兼容性好但慢;virtio 是"为虚拟化而生"的设备族,Guest 装上 virtio 驱动后走前后端共享内存通道:

设备 模拟设备(慢) virtio(快)
网卡 e1000 virtio-net
磁盘 IDE/SATA virtio-blk / virtio-scsi
队列 — virtio-queue(多队列)

云主机的网卡之所以叫 eth0 而性能还不错,就是 virtio-net 在工作。

五、动手:命令行创建一台 KVM 虚拟机

# 1. 准备磁盘镜像(qcow2: 支持精简置备+快照)
qemu-img create -f qcow2 /var/lib/libvirt/images/test.qcow2 20G

# 2. 安装系统(文本/串口方式, 适合无图形界面服务器)
virt-install \
  --name test-vm \
  --vcpus 2 --memory 2048 \
  --disk path=/var/lib/libvirt/images/test.qcow2,format=qcow2,bus=virtio \
  --network network=default,model=virtio \
  --os-variant centos-stream9 \
  --location /opt/CentOS-Stream-9-latest-x86_64-dvd1.iso \
  --graphics none --console pty,target_type=serial \
  --extra-args "console=ttyS0"

virsh 日常管理:

virsh list --all                  # 所有虚拟机
virsh start test-vm               # 开机
virsh shutdown test-vm            # 优雅关机
virsh destroy test-vm             # 拔电源(强制)
virsh console test-vm             # 串口控制台(退出: Ctrl+])
virsh dominfo test-vm             # 详细信息
virsh autostart test-vm           # 宿主机开机自启
virsh snapshot-create-as test-vm snap1    # 快照
virsh dumpxml test-vm > vm.xml    # 导出定义

六、镜像格式:qcow2 vs raw

特性 qcow2 raw
空间占用 精简(用多少占多少) 预分配全量
快照 ✅ 内置支持 需要外部方案(LVM)
性能 略有开销 最优
压缩/加密 ✅ ❌
qemu-img info test.qcow2              # 查看实际占用 vs 虚拟大小
qemu-img convert -O raw a.qcow2 a.raw # 格式转换
qemu-img snapshot -l test.qcow2       # 列出快照

云主机启动的秘密:云厂商的系统镜像 + 你的数据盘,本质就是一套 qcow2/raw 镜像加一层调度系统(OpenStack/自研),底层还是这套 KVM 技术。

七、嵌套虚拟化与常见问题

# 在虚拟机里再跑虚拟机(测试 K8s 集群常用)
modprobe kvm_intel nested=1
cat /sys/module/kvm_intel/parameters/nested    # Y 即开启

# 虚拟机网络不通排查
virsh net-list                          # default 网络是否 active
virsh domifaddr test-vm                 # 拿到虚拟机 IP

小结

  • KVM(内核)+ QEMU(设备模拟)+ libvirt(管理) 三层架构是 IaaS 地基
  • 硬件辅助虚拟化(VT-x)让全虚拟化性能可用,virtio 让 IO 高效
  • qcow2 精简+快照适合日常,raw 性能极致
  • virt-install + virsh 就能在命令行管理完整虚拟机生命周期

下一篇回到代码:Git 版本控制。


本文是「云计算」系列第 2 篇。