Linux 系统服务器的 KVM 虚拟化实战:搭建、配置与管理

在我们公司建设云平台的过程中,选择虚拟化技术是核心决策之一。经过对 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 性能细节与评测

我们使用 sysbenchfio 做基本性能测试。

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

解决思路

  1. 检查 libvirt 日志:
bash 复制代码
journalctl -u libvirtd -f
  1. 检查存储池状态:
bash 复制代码
virsh pool-list --all

十一、KVM 安全与隔离

安全项 建议配置
SELinux / AppArmor 开启并排除 libvirt 模块
防火墙 每台 VM 使用独立策略
网络隔离 使用 VLAN 或 Open vSwitch

十二、总结与建议

在我们长期的 KVM 生产环境实践中:

✅ KVM + libvirt 是成熟、稳定的虚拟化方案

✅ 桥接网络使 VM 可直接与物理网络通信

✅ qcow2 提供灵活性,raw 提供性能优势

✅ 性能接近裸机网络与磁盘访问

相关推荐
___波子 Pro Max.2 小时前
Linux下的posix_spawn接口使用场景及与fork区别
linux
Jtti2 小时前
服务器拒绝执行用户请求怎么办?
运维·服务器
秋4272 小时前
tomcat与web服务器
服务器·前端·tomcat
吉普赛的歌2 小时前
【服务器】Windows Server如何配置一个账号多个用户可以远程登录
运维·服务器·windows
飞Link2 小时前
【Hive】Linux(CentOS7)下安装Hive教程
大数据·linux·数据仓库·hive·hadoop
invicinble2 小时前
对于docker在项目中的完整实战
运维·docker·容器
庸子2 小时前
告别手动运维:Kustomize 与 ArgoCD 构建的 GitOps 体系
运维·kubernetes·argocd
TPBoreas2 小时前
清理服务器日志空间
linux·运维·服务器
Howrun7772 小时前
Linux进程通信---1---匿名管道
linux