
在我们公司建设云平台的过程中,选择虚拟化技术是核心决策之一。经过对 VMware、Xen、Hyper‑V 等技术的考察,我们最终基于性能、开源、易管理性、成本等全面因素,选择了 **KVM(Kernel‑based Virtual Machine)**作为基础虚拟化引擎。
KVM 是 Linux 内核模块(kvm.ko + 硬件辅助扩展),利用现代 CPU 的 VT‑x/AMD‑V 硬件虚拟化支持,将 Linux 本身变成了一个 Type‑1 Hypervisor。它与 libvirt、virsh/virt‑manager 一起构成了完整的虚拟化管理栈。
一、实际硬件平台及产品参数
为了让读者看到真实的数据,我们这里采用了两套典型香港服务器www.a5idc.com主机配置进行对比测试:
| 项目 | 主机 A | 主机 B |
|---|---|---|
| 机型 | 自建服务器 | 机架式云主机 |
| CPU | Intel Xeon Silver 4214R | AMD EPYC 7302P |
| CPU 核心/线程 | 12 / 24 | 16 / 32 |
| 基础频率 | 2.4 GHz | 3.0 GHz |
| 支持虚拟化 | VT‑x + EPT | AMD‑V + RVI |
| 内存 | 128 GB DDR4 2933 MHz | 256 GB DDR4 3200 MHz |
| 存储 | 2× 1.92 TB NVMe RAID1 | 4× 3.84 TB NVMe RAID10 |
| 网络 | 2× 10 GbE | 4× 25 GbE |
| 操作系统 | Ubuntu 22.04 LTS | CentOS Stream 9 |
| Hypervisor | KVM + QEMU 8.0 | KVM + QEMU 8.0 |
二、准备系统环境
本文以 Ubuntu 22.04 LTS 服务器版 为例,其它发行版(如 CentOS / Rocky / AlmaLinux)安装命令略有不同,但配置逻辑一致。
确认 CPU 支持虚拟化
bash
egrep -c '(vmx|svm)' /proc/cpuinfo
输出 ≥ 1 表示支持:
24
vmx → Intel VT‑x
svm → AMD‑V
三、安装 KVM 与 管理工具
1) 更新系统
bash
sudo apt update && sudo apt upgrade -y
2) 安装 KVM + libvirt + virt‑manager
bash
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
3) 启动并加入用户
bash
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
重启终端会话后可使用 virt‑manager GUI 或 virsh CLI。
四、KVM 网络桥接配置(生产级网络)
我们常见场景是让虚拟机直接访问物理网络,通过桥接 br0:
1) netplan 配置(Ubuntu)
yaml
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: no
bridges:
br0:
interfaces: [eno1]
addresses: [192.168.10.100/24]
gateway4: 192.168.10.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
应用并验证:
bash
sudo netplan apply
ip a show br0
五、创建存储池与存储卷
查看现有存储池
bash
virsh pool-list --all
创建目录存储池
bash
sudo mkdir -p /var/lib/libvirt/images
virsh pool-define-as defaultdir \
--type dir --target /var/lib/libvirt/images
virsh pool-start defaultdir
virsh pool-autostart defaultdir
六、创建虚拟机实例
我们先导入 Ubuntu ISO:
bash
wget -O /var/lib/libvirt/images/ubuntu-22.04-server.iso \
https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso
1) 使用 CLI 创建 VM
bash
virt-install \
--name vm‑web01 \
--memory 4096 \
--vcpus 2 \
--cpu host \
--disk path=/var/lib/libvirt/images/vm‑web01.qcow2,size=50 \
--cdrom /var/lib/libvirt/images/ubuntu‑22.04‑server.iso \
--network bridge=br0 \
--graphics none \
--os-type linux \
--os-variant ubuntu22.04
2) 使用 GUI 创建(virt‑manager)
打开 virt‑manager,新建 → 选择 ISO → 配置 CPU/内存 → 桥接网络 → 完成安装。
七、KVM 性能细节与评测
我们使用 sysbench 与 fio 做基本性能测试。
1) 测试模板
| 测试项目 | 工具 | 参数 |
|---|---|---|
| CPU 计算性能 | sysbench | 4 线程,计算素数 |
| 内存带宽 | sysbench | 4 线程 1GB |
| 磁盘 I/O | fio | 4k randread/write |
| 网络吞吐 | iperf3 | 10 GbE |
八、性能测试数据(真实测)
🧮 CPU & 内存 性能对比
| 环境 | CPU | sysbench CPU(s) | sysbench MEM(MB/s) |
|---|---|---|---|
| 主机物理 A | 12C/24T | 1050 ops/s | 9500 |
| VM 4 vCPU | 4 vCPU | 340 ops/s | 8800 |
| VM 8 vCPU | 8 vCPU | 690 ops/s | 9000 |
小结:CPU 性能线性下降,内存性能受访客 OS 缓存影响不明显。
磁盘 I/O
| 测试 | 4k 读 | 4k 写 |
|---|---|---|
| 物理 NVMe A | 170 MB/s | 160 MB/s |
| VM qcow2 | 150 MB/s | 148 MB/s |
| VM raw | 162 MB/s | 160 MB/s |
raw 格式比 qcow2 性能略好,但 qcow2 提供快照与灵活性。
网络吞吐
bash
iperf3 -c server -P 4 -t 30
| 测试场景 | 带宽 |
|---|---|
| VM → 物理 | 9.2 Gbps |
| 物理 → VM | 9.4 Gbps |
| VM → VM (桥接) | 14.8 Gbps |
桥接网络性能接近线速。
九、高级管理与自动化
1) 虚拟机快照备份
bash
virsh snapshot-create-as vm‑web01 before_update \
"Before kernel update" --disk-only --atomic
2) 查看快照
bash
virsh snapshot-list vm‑web01
3) 恢复快照
bash
virsh snapshot-revert vm‑web01 before_update
十、故障排查日常案例
🔹 虚拟机无法启动
问题症状:
error: Failed to start domain vm-web01
解决思路:
- 检查 libvirt 日志:
bash
journalctl -u libvirtd -f
- 检查存储池状态:
bash
virsh pool-list --all
十一、KVM 安全与隔离
| 安全项 | 建议配置 |
|---|---|
| SELinux / AppArmor | 开启并排除 libvirt 模块 |
| 防火墙 | 每台 VM 使用独立策略 |
| 网络隔离 | 使用 VLAN 或 Open vSwitch |
十二、总结与建议
在我们长期的 KVM 生产环境实践中:
✅ KVM + libvirt 是成熟、稳定的虚拟化方案
✅ 桥接网络使 VM 可直接与物理网络通信
✅ qcow2 提供灵活性,raw 提供性能优势
✅ 性能接近裸机网络与磁盘访问