KVM虚拟机热迁移

  • KVM虚拟机冷迁移过程
  • KVM虚拟机热迁移原理
  • 热迁移前提条件
  • 配置`NFS服务器`
  • 重启NFS服务端
  • NFS客户端上测试是否可以连通NFS服务器
  • 2台KVM服务器挂载NFS
  • 最少需要`2`台`KVM服务器`,且环境要一致
  • `KVM1`上创建一台VM,指定磁盘文件为`NFS共享存储路径`
  • 开始热迁移
  • KVM1上创建虚拟机(将磁盘文件放在NFS中)
  • 启动热迁移
  • 查看VM实例是否已经在KVM2上运行
  • 常见问题
  • 不加--usafe参数将无法完成热迁移
  • 两台KVM服务器不加host将无法完成迁移


KVM虚拟机冷迁移过程

冷迁移就是把虚拟机磁盘文件传到KVM2机器上,然后生成该虚拟机的配置文件,启动这个虚拟机
冷迁移到缺点:

  • VM要关机
  • 传磁盘文件慢
  • 总耗时长


KVM虚拟机热迁移原理

KVM虚拟机迁移过程中,迁移VM磁盘文件,这个过程是耗时最长的。
热迁移就是将VM的磁盘文件放在共享存储服务器中,这样就省略了传虚拟机实例磁盘文件的过程,不需要VM关机即可完成热迁移



热迁移前提条件

热迁移前提条件

  • 共享存储、
  • 目的和源端物理机时间一致、
  • 网络配置一致、
  • 源和目的物理机的CPU flags、
  • CPU model一致、
  • Qemu版本一致


最少一台共享存储服务器



配置NFS服务器


虚拟化热迁移流程 kvm虚拟机热迁移_服务器

## /data 共享的目录
## 允许访问的网段10.0.0.0/24
## rw 允许读写
## async 数据延迟落盘,async相比sync性能要高一些
## no_root_squash 客户端使用root用户连接NFS时,依然映射为root用户
/data 10.0.0.0/24(rw,async,no_root_squash)



重启NFS服务端
# 重启NFS服务端以使配置生效

# 重启rpcbind服务
systemctl restart rpcbind

# 重启nfs服务
systemctl restart nfs

虚拟化热迁移流程 kvm虚拟机热迁移_KVM热迁移_02



NFS客户端上测试是否可以连通NFS服务器
# KVM服务器上安装NFS客户端
yum install -y nfs-utils

# 验证NFS是否可被export和挂载
## -d:仅显示已被NFS客户端加载的目录;
## -e:显示NFS服务器上所有的共享目录。
showmount -e 10.0.0.31

虚拟化热迁移流程 kvm虚拟机热迁移_服务器_03



2台KVM服务器挂载NFS
# 将nfs挂载写入/etc/fstab中持久挂载
## _netdev,防止客户端在网络就绪之前开始挂载文件系统
echo "10.0.0.31:/data /opt defaults,_netdev	0 0" >> /etc/fstab

# 自动挂载/etc/fstab
mount -a



最少需要2KVM服务器,且环境要一致

虚拟化热迁移流程 kvm虚拟机热迁移_NFS_04

  • 互相添加hostsssh免密
  • 启动libvirt服务
  • 桥接网卡
  • 安装NFS客户端,KVM服务器挂载共享存储
  • VM磁盘文件存放在共享存储
# 在KVM1上在NFS创建一个测试文件
echo "test1" > /opt/test.txt

# 在KVM2确认是否能查看到这个文件
ls /opt/test.txt
cat /opt/test.txt



KVM1上创建一台VM,指定磁盘文件为NFS共享存储路径

## --virt-type 指定虚拟化类型
## --os-type=linux  指定操作系统类型
## --os-variant   指定操作系统版本
## --name     指定vm实例名称
## --memory   指定内存大小单位MB
### maxmemory=2048 最大可用内存,扩容时不能超过这个数值
## --vcpus    指定cpu核数
### maxvcpus=10  最大使用CPU核数,扩容时不能超过这个数值
## --disk     指定vm实例的磁盘路径
### format=raw,size=10 指定磁盘格式为raw,磁盘大小10GB
## --cdrom    系统安装光盘文件的路径
## network    指定网络类型,默认是NAT模式
## graphics vnc  把图形画面交给vnc的服务端来输出
### listen=0.0.0.0 vnc服务器监听的IP地址
virt-install \
--virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name vm名称 \
--memory 512,maxmemory=2048 \
--vcpus 1,maxvcpus=10 \
--disk /opt/centos3.qcow2 \
--boot hd
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial' \
--noautoconsole



开始热迁移

https://www.qstack.com.cn/archives/368.html



KVM1上创建虚拟机(将磁盘文件放在NFS中)

注意,参数指定的路径kvm用户有读写权限才可以正常创建。

## --virt-type 指定虚拟化类型
## --os-type=linux  指定操作系统类型
## --os-variant   指定操作系统版本
## --name     指定vm实例名称
## --memory   指定内存大小单位MB
### maxmemory=2048 最大可用内存,为共享资源
## --vcpus    指定cpu核数
### maxvcpus=10  最大使用CPU核数,为共享资源
## --disk     指定vm实例的磁盘路径
### format=raw,size=10 指定磁盘格式为raw,磁盘大小10GB
## --cdrom    系统安装光盘文件的路径
## network    指定网络类型,默认是NAT模式
## graphics vnc  把图形画面交给vnc的服务端来输出
### listen=0.0.0.0 vnc服务器监听的IP地址
virt-install \
--virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name vm名称 \
--memory 512,maxmemory=2048 \
--vcpus 1,maxvcpus=10 \
--disk /opt/centos3.qcow2 \
--boot hd
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial' \
--noautoconsole

kvm上查看这台虚拟机是否已创建

# KVM1上查看虚拟机列表
virsh list --all

# KVM2上查看虚拟机列表
virsh list --all
## kvm2的VM列表应该为空

虚拟化热迁移流程 kvm虚拟机热迁移_虚拟化热迁移流程_05



启动热迁移

# 执行热迁移
## --live VM活动时迁移(热迁移)
## --verbose 详细信息
## qemu+ssh 调用libvirt协议(固定写法)
## --unsafe 热迁移默认要求VM实例不能设置缓存,不加该参数无法迁移
virsh migrate --live --verbose 虚拟机名称 qemu+ssh://10.0.0.12/system --unsafe

# 或
virsh migrate --live --verbose 虚拟机名称 qemu+ssh://kvm2/system --unsafe

虚拟化热迁移流程 kvm虚拟机热迁移_共享存储_06


VM热迁移过程中,会有短暂的丢包

虚拟化热迁移流程 kvm虚拟机热迁移_KVM热迁移_07



查看VM实例是否已经在KVM2上运行

# KVM1上查看VM列表
virsh list

虚拟化热迁移流程 kvm虚拟机热迁移_共享存储_08

# KVM2上查看VM列表
virsh list

虚拟化热迁移流程 kvm虚拟机热迁移_KVM热迁移_09



常见问题



不加–usafe参数将无法完成热迁移

# 执行热迁移
## --live VM活动时迁移(热迁移)
## --verbose 详细信息
## qemu+ssh 调用libvirt协议(固定写法)
## --unsafe 热迁移默认要求VM实例不能设置缓存,不加该参数无法迁移
virsh migrate --live --verbose 虚拟机名称 qemu+ssh://10.0.0.12/system

虚拟化热迁移流程 kvm虚拟机热迁移_虚拟化热迁移流程_10



两台KVM服务器不加host将无法完成迁移

# 执行热迁移
## --live VM活动时迁移(热迁移)
## --verbose 详细信息
## qemu+ssh 调用libvirt协议(固定写法)
## --unsafe 热迁移默认要求VM实例不能设置缓存,不加该参数无法迁移
virsh migrate --live --verbose 虚拟机名称 qemu+ssh://10.0.0.12/system --unsafe

虚拟化热迁移流程 kvm虚拟机热迁移_虚拟化热迁移流程_11