KVM 高级功能部署实战手册(静态迁移 + 动态迁移 + KSM 内存优化)

本文基于 CentOS 7 环境,完整复现 KVM 静态迁移、基于共享存储的动态迁移、基于数据块的动态迁移、KSM 内存合并 四大核心高级功能,包含可直接复制执行的命令原理精讲故障排查基于kvm的环境下做的


一、实验环境规划(统一版本)

表格

主机角色 操作系统 IP 地址 核心软件
kvm01(源宿主机) CentOS 7.9 x86_64 192.168.10.201 qemu-kvm、libvirt
kvm02(目标宿主机) CentOS 7.9 x86_64 192.168.10.202 qemu-kvm、libvirt、qemu-kvm-ev
kvmnfs(共享存储) CentOS 7.9 x86_64 192.168.10.101 nfs-utils、rpcbind

全局前置配置(所有节点执行)

bash

运行

复制代码
# 关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 配置主机名解析
cat >> /etc/hosts << EOF
192.168.10.201 kvm01
192.168.10.202 kvm02
192.168.10.101 kvmnfs
EOF

二、核心知识点补充(必看)

1. KVM 迁移分类与本质区别

  • 静态迁移(离线迁移):必须关闭虚拟机,拷贝磁盘 + 配置文件,业务中断,适合非核心业务、计划内维护。
  • 动态迁移(在线迁移) :虚拟机不停机、业务不中断,仅短暂丢包,适合高可用、负载均衡、硬件升级。
    • 共享存储动态迁移:只迁内存,不迁磁盘,速度极快。
    • 数据块动态迁移:内存 + 磁盘全量迁移,无需共享存储,通用性最强。

2. 动态迁移成功三要素

  1. 源 / 目标宿主机 CPU 架构一致(同代 x86_64)。
  2. 网络互通,SSH 免密 / 密码认证可用
  3. 虚拟机磁盘 cache=nonecache=directsync,防止数据损坏。

3. KSM 内核同页合并

  • 作用:扫描相同内存页,合并为写时复制(CoW) 共享页,大幅节省内存。
  • 适用:同 OS、同应用的多台虚拟机,内存节省可达 30%~50%。
  • 代价:轻微提升 CPU 占用,需在内存与 CPU 间做平衡。

三、静态迁移(离线迁移)完整实操

适用场景

可停机维护、测试虚拟机、无共享存储环境。

步骤 1:在 kvm01 创建虚拟机 test01

bash

运行

复制代码
# 创建存储目录
mkdir -p /data_kvm/store

# 命令行创建虚拟机(VNC 安装)
virt-install \
-n test01 \
-r 1024 \
--vcpus=1 \
--disk path=/data_kvm/store/test01.qcow2,size=10 \
-w bridge:br0 \
--virt-type=kvm \
--accelerate \
--autostart \
-c /opt/CentOS-7-x86_64-Minimal-2009.iso \
--vnc \
--vncport=5901 \
--vnclisten=0.0.0.0
  • 使用 VNC Viewer 连接 192.168.10.201:5901 完成系统安装。
  • 配置 console 登录(方便后续验证):

bash

运行

复制代码
virsh console test01
grubby --update-kernel=ALL --args="console=ttyS0"
reboot

步骤 2:关闭虚拟机并导出配置

bash

运行

复制代码
# 查看状态
virsh list --all

# 优雅关机
virsh shutdown test01

# 导出 XML 配置
virsh dumpxml test01 > /root/test01.xml

# 查看磁盘路径
virsh domblklist test01

步骤 3:拷贝文件到 kvm02

bash

运行

复制代码
# kvm02 先创建目录
ssh root@192.168.10.202 "mkdir -p /data_kvm/store"

# 拷贝配置
scp /root/test01.xml 192.168.10.202:/etc/libvirt/qemu/

# 拷贝磁盘
scp /data_kvm/store/test01.qcow2 192.168.10.202:/data_kvm/store/

步骤 4:kvm02 定义并启动虚拟机

bash

运行

复制代码
# 重新定义
virsh define /etc/libvirt/qemu/test01.xml

# 启动
virsh start test01

# 验证
virsh console test01
ifconfig

四、基于共享存储的动态迁移(NFS)

核心优势

只迁移内存,不迁移磁盘,秒级切换,业务几乎无感知。

步骤 1:kvmnfs 部署 NFS 共享存储

bash

运行

复制代码
yum install -y nfs-utils rpcbind
mkdir /data
chmod 777 /data

# 配置共享
echo "/data 192.168.10.0/24(rw,sync,no_root_squash)" >> /etc/exports

# 启动服务
systemctl enable --now nfs rpcbind
showmount -e localhost

步骤 2:kvm01/kvm02 挂载 NFS

bash

运行

复制代码
mkdir -p /data_kvm/kgc
mount -t nfs 192.168.10.101:/data /data_kvm/kgc

# 开机自动挂载
echo "192.168.10.101:/data /data_kvm/kgc nfs defaults 0 0" >> /etc/fstab

步骤 3:创建存放在共享存储的虚拟机 test02

bash

运行

复制代码
virt-install \
-n test02 \
-r 1024 \
--vcpus=1 \
--disk path=/data_kvm/kgc/test02.qcow2,size=10 \
-w bridge:br0 \
--virt-type=kvm \
--autostart \
--boot hd \
--vnc --vncport=5902 --vnclisten=0.0.0.0

步骤 4:修改磁盘缓存(必做)

bash

运行

复制代码
virsh edit test02
# 找到 disk 配置,添加 cache='none'
<driver name='qemu' type='qcow2' cache='none'/>

virsh shutdown test02
virsh start test02

步骤 5:执行动态迁移

bash

运行

复制代码
# 迁移命令(源主机 kvm01 执行)
virsh migrate --live --verbose test02 \
qemu+ssh://192.168.10.202/system \
tcp://192.168.10.202

# 迁移后 kvm02 生成持久化配置
virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml
virsh define /etc/libvirt/qemu/test02.xml

验证

  • Windows 执行 ping 192.168.10.xxx -t,迁移期间仅丢 1~2 个包。
  • 源主机 test02 关闭,目标主机 test02 running。

五、基于数据块的动态迁移(无共享存储)

核心优势

不需要共享存储,直接迁移本地磁盘虚拟机,通用性最强。

步骤 1:安装增强版 qemu-kvm-ev(必须)

bash

运行

复制代码
# kvm01、kvm02 都安装
yum install -y centos-release-qemu-ev
yum install -y qemu-kvm-ev
reboot

步骤 2:kvm01 准备虚拟机 test03

bash

运行

复制代码
# 克隆或新建本地磁盘虚拟机
virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
virsh start test03

步骤 3:kvm02 创建同名空磁盘

bash

运行

复制代码
qemu-img create -f qcow2 /data_kvm/store/test03.qcow2 10G

步骤 4:执行全量热迁移

bash

运行

复制代码
# kvm01 执行
virsh migrate test03 \
qemu+ssh://192.168.10.202/system \
--live \
--persistent \
--undefinesource \
--copy-storage-all \
--verbose

关键参数说明

  • --live:在线迁移
  • --copy-storage-all:全量拷贝磁盘数据块
  • --undefinesource:迁移完成后删除源主机配置
  • --persistent:目标主机生成持久化配置

六、KSM 内存合并优化实战

步骤 1:检查内核是否支持 KSM

bash

运行

复制代码
grep -i ksm /boot/config-$(uname -r)
# 输出 CONFIG_KSM=y 表示支持

步骤 2:启动 KSM 服务

bash

运行

复制代码
systemctl start ksm ksmtuned
systemctl enable ksm ksmtuned

# 激活扫描(必须)
echo 1 > /sys/kernel/mm/ksm/run

步骤 3:KSM 核心参数调优

bash

运行

复制代码
# 每次扫描页数(默认100,调大加速合并)
echo 200 > /sys/kernel/mm/ksm/pages_to_scan

# 扫描间隔毫秒(默认20,调大降低CPU)
echo 50 > /sys/kernel/mm/ksm/sleep_millisecs

# 禁止跨 NUMA 节点合并(降低延迟)
echo 0 > /sys/kernel/mm/ksm/merge_across_nodes

步骤 4:验证内存节省效果

bash

运行

复制代码
# 开启前
free -m

# 开启后等待5分钟
free -m
  • 多台相同虚拟机场景,used 内存可下降数百 MB~ 数 GB。

七、常见故障与解决方案

  1. 迁移报错:Unsafe migration 原因:磁盘 cache 不是 none/directsync解决:virsh edit 虚拟机 添加 cache='none'

  2. 迁移失败:无法解析主机名 解决:/etc/hosts 配置双向解析

  3. 数据块迁移不支持 解决:必须安装 qemu-kvm-ev,并重启

  4. KSM 不生效 解决:echo 1 > /sys/kernel/mm/ksm/run,启动 ksmtuned


八、总结

  1. 静态迁移:简单可靠,适合停机场景。
  2. 共享存储动态迁移:速度最快,适合高可用集群。
  3. 数据块动态迁移:无存储依赖,通用最强。
  4. KSM:同类型虚拟机必开,显著提升宿主机承载密度。
相关推荐
炸炸鱼.1 天前
KVM 虚拟化平台部署实战手册
kvm
云达闲人3 天前
搭建DevOps企业级仿真实验环境:002Proxmox 系统安装流程详解
运维·虚拟化·devops·kvm·proxmox·实验环境搭建·web管理
黑蛋同志12 天前
KVM虚拟化热迁移
运维·虚拟化·kvm
白毛大侠14 天前
Docker vs 虚拟机 vs Go 用户态/内核态:这三组概念
运维·docker·golang·kvm
养乐多q.♡1 个月前
AIMaLinux系统上通过KVM创建了windows10系统,在windows10系统中通过NFS分享文件夹到内网上可以挂载
虚拟机·kvm·nfs挂载·aimalinux
real向往1 个月前
物理机磁盘损坏无法克隆虚拟机
kvm·物理机·磁盘损坏
real向往1 个月前
KVM虚拟机管理(X86/ARM)
arm·kvm·x86·虚拟机管理
tianyuanwo3 个月前
KVM 虚拟化启动失败深度解析:从硬件到软件的系统性故障排除
kvm·virsh create
人间打气筒(Ada)3 个月前
GlusterFS实现KVM高可用及热迁移
分布式·虚拟化·kvm·高可用·glusterfs·热迁移