KVM虚拟平台——迁移KVM虚拟机
更新:HHH   时间:2023-1-7


博文大纲:
一、KVM虚拟机迁移的方式
二、实现KVM虚拟机静态迁移
三、实现KVM虚拟机动态迁移

一、KVM虚拟机迁移的方式

KVM平台中的KVM虚拟机迁移分为以下两种:

(1)冷迁移(静态迁移)

我们存放虚拟机磁盘的目录都是挂在的一个nfs文件系统的磁盘,进行冷迁移时,只要在目标主机上挂载这个nfs文件系统,就可以看到要迁移的那个虚拟机的磁盘文件,通常以.qcow2或.raw结尾的,然后,只需将虚拟机的.xml配置文件发送到目标服务器上,然后重新定义一下迁移过来的虚拟机即可!

(2)热迁移(动态迁移)

如果源宿主机和目的宿主机共享存储系统,则只需要通过网络发送客户机的 vCPU 执行状态、内存中的内容、虚机设备的状态到目的主机上。否则,还需要将客户机的磁盘存储发到目的主机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。

基于共享存储系统,动态迁移的具体过程:
(1)迁移开始时,客户端依然在宿主机上运行,与此同时,客户机的内存页被传输到目的主机上;
(2)QEMU/KVM 会监控并记录下迁移过程中所有已被传输的内存页的任何修改,并在所有内存页都传输完成后即开始传输在前面过程中内存页的更改内容;
(3)QEMU/KVM 会估计迁移过程中的传输速度,当剩余的内存数据量能够在一个可以设定的时间周期(默认 30 毫秒)内传输完成时,QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输到目的主机上,最后传输过来的内存内容在目的宿主机上恢复客户机的运行状态;
(4)至此,KVM的动态迁移操作完成!迁移后的客户机尽可能与迁移前一致,除非目的主机上缺少一些配置,比如网桥等。注意,当客户机中内存使用率非常大而且修改频繁时,内存中数据不断被修改的速度大于KVM能够传输的内存速度时,动态迁移的过程是完成不了的,这时候只能静态迁移。

(3)注意事项

(1)迁移的服务器CPU品牌最好一致;
(2)64位只能在64位宿主机间迁移,32位可以迁移32位和64位宿主机;
(3)宿主机中的虚拟机名字不能冲突;
(4)目的宿主机和源宿主机软件配置尽可能相同;

(4)总结

静态迁移:
(1)复制镜像文件和虚拟机配置文件;
(2)重新定义虚拟机即可!

动态迁移:
(1)创建共享存储;
(2)两台KVM宿主机挂载共享存储;
(3)启动动态迁移;
(4)创建迁移后的虚拟配置文件;
(5)重新定义虚拟机;

二、实现KVM虚拟机静态迁移

(1)环境要求
  • 一台KVM服务求A:IP地址:192.168.1.7,其中一台为web01的KVM虚拟机;
  • 一台KVM服务器B:IP地址:192.168.1.8;
(2)实现步骤

KVM服务器A的操作:

由于实验环境,简单起见,这里就略过了,有兴趣可以自行创建文件或目录进行测试!

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
//实验环境,简单起见关闭防火墙与SElinux
[root@localhost ~]# lsmod | grep kvm          //确认虚拟机支持kvm环境
kvm_intel             174841  0 
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm
[root@localhost ~]# virsh list --all     //确认虚拟机存在,而且是关机的状态
 Id    名称                         状态
----------------------------------------------------
 -     web01                          关闭

KVM服务器B的操作:

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
//实验环境,简单起见关闭防火墙与SElinux
[root@localhost ~]# lsmod | grep kvm          //确认虚拟机支持kvm环境
kvm_intel             174841  0 
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm
[root@localhost ~]# virsh list --all           //确认没有kvm虚拟机
 Id    名称                         状态
----------------------------------------------------
[root@localhost ~]# scp 192.168.1.7:/etc/libvirt/qemu/web01.xml /etc/libvirt/qemu/web01.xml
//复制KVM宿主机A的虚拟机配置文件
[root@localhost ~]# scp 192.168.1.7:/kvm/disk/web01.raw /kvm/disk/web01.raw
//复制KVM宿主机的虚拟机磁盘文件
[root@localhost ~]#  cd /etc/libvirt/qemu/
[root@localhost qemu]# virsh define web01.xml
定义域 web01(从 web01.xml)
//根据配置文件生成虚拟机
[root@localhost qemu]# virsh start web01     //开启虚拟机进行测试
域 web01 已开始

[root@localhost qemu]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     web01                          running
//可以正常开机表示没有问题,自行进行测试即可!

静态迁移迁移完成!

静态迁移其实没什么好说的,说白了,跟克隆其实差不多!

三、实现KVM虚拟机动态迁移

(1)环境要求
  • 一台NFS服务器:IP地址:192.168.1.6;
  • 一台KVM服务器A:IP地址:192.168.1.7;
  • 一台KVM服务器B:IP地址:192.168.1.8;

注意:KVM宿主机不需要KVM虚拟机!

(2)实现步骤

NFS服务器的操作:

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
//实验环境,简单起见关闭防火墙与SElinux
[root@localhost ~]# yum -y install nfs-utils rpcbind
//安装NFS所需软件
[root@localhost ~]# mkdir /kvmshare          //创建共享目录
[root@localhost ~]# echo "/kvmshare  *(rw,sync,no_root_squash)" >> /etc/exports
//配置共享目录的权限,共享的用户
//no_root_squash:使其获取NFS服务器的root权限
[root@localhost ~]# systemctl start rpcbind           //启动远程传输控制服务
[root@localhost ~]# systemctl start nfs       //启动NFS共享服务

两台KVM进行验证:

[root@localhost ~]# showmount -e 192.168.1.6
Export list for 192.168.1.6:
/kvmshare *

KVM服务器A的操作:

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
//实验环境,简单起见关闭防火墙与SElinux
[root@localhost ~]# lsmod | grep kvm          //确认虚拟机支持kvm环境
kvm_intel             174841  0 
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm
[root@localhost ~]# virsh list --all           //确认没有kvm虚拟机
 Id    名称                         状态
----------------------------------------------------
[root@localhost ~]# virt-manager          //打开图像化界面管理KVM

首选创建存储池,如图:




接下来基于存储池创建存储卷,如图:


接下来创建虚拟机,如图:







接下来根据自己实际情况创建适合的虚拟机!

虚拟机重启完成之后,将其关机,配置其为桥接网络,方法如下:

[root@localhost ~]# virsh destroy centos7.0             //实验环境,就采取强制关机了,但不建议使用
域 centos7.0 被删除

[root@localhost ~]# systemctl stop NetworkManager       //关闭网络管理工具
[root@localhost ~]# virsh iface-bridge ens33 br0       //通过ens33生成br0
使用附加设备 br0 生成桥接 ens33 失败            //提示失败没有关系
已启动桥接接口 br0

[root@localhost ~]# virsh edit centos7.0      //使用“edit”命令编辑虚拟机的配置文件
定位到interface,修改一下内容:
    <interface type='bridge'>          修改为bridge
      <mac address='52:54:00:ef:a3:93'/>
      <source bridge='br0'/>     修改为 bridge='br0'
[root@localhost ~]# virsh start centos7.0         //启动centos7虚拟机



KVM服务器B的操作:

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
//实验环境,简单起见关闭防火墙与SElinux
[root@localhost ~]# lsmod | grep kvm          //确认虚拟机支持kvm环境
kvm_intel             174841  0 
kvm                   578518  1 kvm_intel
irqbypass              13503  1 kvm
[root@localhost ~]# virsh list --all           //确认没有kvm虚拟机
 Id    名称                         状态
----------------------------------------------------
[root@localhost ~]# virt-manager          //打开图像化界面管理KVM

创建存储池,跟KVM服务器A的操作一模一样,如图:





生成桥接网卡br0,便于一会进行热迁移操作,操作如下:

[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]#  virsh iface-bridge ens33 br0 
使用附加设备 br0 生成桥接 ens33 失败
已启动桥接接口 br0
//因为本地现在并没有虚拟机,所以只需生成桥接网卡即可!
[root@localhost ~]# hostname kvmB
[root@localhost ~]# su -
上一次登录:三 12月  4 20:05:59 CST 2019从 192.168.1.253pts/1 上
[root@kvmB ~]#                        //修改主机名,否则一会可能会出现错误

KVM服务器A进行以下操作:


如果出现以下错误,如图:

那是因为没有安装使用SSH协议连接所需的询问密码的软件包!

接下来的操作需要在两台KVM都进行操作:

[root@localhost ~]# yum -y install openssh-askpass
[root@kvmB ~]#  yum -y install openssh-askpass 
//安装询问密码的依赖包,注意两台KVM服务器都需安装

安装完成之后,在KVM服务器A上再次进行连接:


打开KVM虚拟机,使其一直访问百度,如图:

接下来进行热迁移操作,如图:



查看KVM虚拟机的访问是否存在终端现象,如图:

根据显示结果,发现访问并没有中断,至此,动态迁移成功!

———————— 本文至此结束,感谢阅读 ————————

返回云计算教程...