本文基于 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. 动态迁移成功三要素
- 源 / 目标宿主机 CPU 架构一致(同代 x86_64)。
- 网络互通,SSH 免密 / 密码认证可用。
- 虚拟机磁盘 cache=none 或 cache=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。
七、常见故障与解决方案
-
迁移报错:Unsafe migration 原因:磁盘 cache 不是 none/directsync解决:
virsh edit 虚拟机添加cache='none' -
迁移失败:无法解析主机名 解决:
/etc/hosts配置双向解析 -
数据块迁移不支持 解决:必须安装
qemu-kvm-ev,并重启 -
KSM 不生效 解决:
echo 1 > /sys/kernel/mm/ksm/run,启动 ksmtuned
八、总结
- 静态迁移:简单可靠,适合停机场景。
- 共享存储动态迁移:速度最快,适合高可用集群。
- 数据块动态迁移:无存储依赖,通用最强。
- KSM:同类型虚拟机必开,显著提升宿主机承载密度。