前言
云厂商把物理机"切"成一台台云主机卖给你,用的核心武器就是 KVM 虚拟化。理解它,就理解了 IaaS 的地基,也理解了容器的宿主环境。
一、虚拟化要解决什么
一台物理机上跑多个"完整电脑",核心需求:
- CPU 虚拟化:让多个客户机(Guest)安全地共享物理 CPU
- 内存虚拟化:每个 Guest 拥有连续的"假物理内存"
- 设备虚拟化:网卡、磁盘都是模拟出来的
- 隔离与调度: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 篇。