KVM 实现虚拟机在线热迁移

丶灬走出姿态 提交于 2020-08-11 11:48:27

一、KVM 虚拟机的迁移方式

KVM虚拟机的迁移有两种方法:
1、静态迁移(冷迁移):对于冷迁移,就是在虚拟机关闭状态下,将虚拟机的磁盘文件及.xml配置文件(这两个文件组成了一个虚拟机)复制到要迁移到的目标主机上,然后在目标主机上使用“virsh define *.xml”命令重新定义虚拟机即可。

2、动态迁移(热迁移):对于热迁移,比较常用,通常是这台服务器上正在跑着一些业务,而这些业务又不允许中断,那么就需要使用热迁移了,这篇博文将详细写出热迁移的步骤。

1、冷迁移
通常我们存放虚拟机磁盘的目录都是挂在的一个nfs文件系统的磁盘,而这个磁盘通常是LVM文件系统。所以需要进行冷迁移时,只要在目标主机上挂载这个nfs文件系统,就可以看到要迁移的那个虚拟机的磁盘文件,通常以.qcow2或.raw结尾的,然后,只需将虚拟机的.xml配置文件发送到目标服务器上,然后重新定义一下即可通过“virsh list --all”命令查看到迁移过来的虚拟机。
2、热迁移
如果源宿主机和目的宿主机共享存储系统,则只需要通过网络发送客户机的 vCPU 执行状
态、内存中的内容、虚机设备的状态到目的主机上。否则,还需要将客户机的磁盘存储发到目的主
机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。
在基于 共享存储系统 时,KVM 动态迁移的具体过程为:
1、迁移开始时,客户机依然在宿主机上运行,与此同时,客户机的内存页被传输到目的主机上。
2、QEMU/KVM 会监控并记录下迁移过程中所有已被传输的内页的任何修改,并在所有内存页都传输完成后即开始传输在前面过程中内存页的更改内容。
3、QEMU/KVM 会估计迁移过程中的传输速度,当剩余的内存数据量能够在一个可以设定的时间周期(默认 30 毫秒)内传输完成时,QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输到目的主机上,最后传输过来的内存内容在目的宿主机上恢复客户机的运行状态。
4、至此,KVM 的动态迁移操作就完成了。迁移后的客户机尽可能与迁移前一致,除非目的主机上缺少一些配置,比如网桥等。注意,当客户机中内存使用率非常大而且修改频繁时,内存中数据不断被修改的速度大于KVM能够传输的内存速度时,动态迁移的过程是完成不了的,这时候只能静态迁移。
3、迁移的注意事项
无论是冷迁移还是热迁移,注意事项大都差不多











迁移前目标服务器的要求如下:

  • 最好迁移的服务器cpu品牌一样;
  • 64位只能在64位宿主机间迁移,32位可以迁移32位和64位宿主机;
  • 宿主机中的虚拟机名字不能冲突;
  • 目的宿主机和源宿主机软件配置尽可能的相同,如 有相同的桥接网卡,资源池等;
  • 两台迁移的主机 cat /proc/cpuinfo |grep nx 的设置是相同的NX,全名为“No eXecute”,即“禁止运行”,是应用在CPU的一种技术,用作把存储器区域分隔为只供存储处理器指令集,或只供数据使用。任何使用NX技术的存储器,代表仅供数据使用,因此处理器的指令集并不能在这些区域存储。这种技术可防止大多数的缓冲溢出,即一些恶意程序,把自身的恶意指令集放在其他程序的数据存储区并运行,从而把整台计算机控制。

.

1、静态迁移

拷贝镜像文件和虚拟机配置文件;
重新定义此虚拟机。
2、动态迁移

创建共享存储;
两台机器挂载共享存储(手工挂载;使用资源池);
启动动态迁移;
创建迁移后的虚拟机配置文件;
重新定义虚拟机。



冷迁移呢,比较简单,可以理解为就是在一台电脑上将虚拟机的配置文件复制到另一台电脑上

#将虚拟机磁盘文件和配置文件都复制到一台新设备上
[root@kvm-test ~]# scp /kvm/disk/test1.raw root@192.168.171.10:/kvm/disk/              
[root@kvm-test ~]# scp /etc/libvirt/qemu/test1.xml root@192.168.171.10:/etc/libvirt/qemu/
#在新设备上可以将配置文件中的UUID上删除掉
#然后直接在新设备上定义配置文件
[root@kvm2 ~]# virsh define test1.xml
#之后就可以启动了

二、kvm虚拟机热迁移配置实例

环境如下:

hostname IP service
kvm1 192.168.171.151 kvm
kvm2 192.168.171.10 kvm
nfs 192.168.171.152 nfs

如果没有kvm环境可参考:KVM虚拟化 进行搭建

1、配置NFS共享存储

[root@nfs ~]# yum -y install nfs-utils rpcbind          # 安装nfs
[root@nfs ~]# systemctl enable nfs             # 设置为开机自启
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# mkdir -p /nfs-share           # 创建需要共享的目录
[root@nfs ~]# vim /etc/exports
/nfs-share       *(rw,sync,no_root_squash)
#第一列代表共享的目录
#第二列的星号代表允许所有网络访问;
#rw代表读写权限;sync代表同步写入磁盘;
#no_root_squash表示当前客户机以root身份访问时赋予本地root权限
#(默认是root_squash,将作为nfsnobody用户对待),若不加no_root_squash,
#可能会导致被降权,而无法进行读写(wr)
[root@nfs ~]# systemctl restart rpcbind          # 重启服务
[root@nfs ~]# systemctl restart nfs       # 重启服务
[root@nfs ~]# netstat -anput | grep rpc      # 确定已经启动
[root@nfs ~]# showmount -e           # 查看本机共享的目录
Export list for nfs:
/nfs-share *
#设置防火墙规则,测试环境也可以直接关闭防火墙
[root@nfs ~]# firewall-cmd --add-service=rpc-bind --permanent 
[root@nfs ~]# firewall-cmd --add-service=nfs --permanent 
[root@nfs ~]# firewall-cmd --add-service=mountd --permanent 
[root@nfs ~]# systemctl restart firewalld     #重启防火墙,使配置生效

我这里的迁移操作依赖于桌面图形化环境,命令热迁移暂时没研究过。
2、两台KVM服务器配置如下(两台kvm主机都需要进行下面的配置):
安装rpcbind软件包,并启动rpcbind服务

[root@kvm1 ~]# yum -y install nfs-utils rpcbind
[root@kvm1 ~]# systemctl enable rpcbind
[root@kvm1 ~]# systemctl start rpcbind
[root@kvm1 ~]# showmount -e 192.168.171.152            # 查询nfs服务器共享的目录
Export list for 192.168.171.152: 
/nfs-share *
[root@kvm1 ~]# mount -t nfs 192.168.171.152:/nfs-share  /kvm/disk/              # 挂载
[root@kvm1 ~]# df -hT /kvm/disk/
Filesystem                 Type  Size  Used Avail Use% Mounted on
192.168.171.152:/nfs-share nfs4   50G  5.2G   45G  11% /kvm/disk
#在其中一台服务器上写入一个测试文件,看看在其他服务器上是否可以看到
[root@kvm1 ~]# touch /kvm/disk/test1
[root@kvm2 ~]# ls /kvm/disk/
test1

至此,就保证了两台kvm服务器使用的目录都是同一块磁盘存储的(注意:两台kvm虚拟机的挂载nfs文件系统的目录路径必须一致,我这里两台kvm虚拟机都是挂载到了/kvm/disk/目录下,否则会在后面的操作中发生错误)。
3、在两个kvm服务器上分别创建存储卷:

[root@kvm1 ~]# virt-manager              # 打开虚拟机控制台

KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
下面对话框中,目标路径是KVM本机的“/kvm/disk”,主机名写的是nfs服务器的IP地址,源路径是nfs服务器共享的目录。
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
以上操作同样需要在第二台KVM上进行操作,最好定义的存储池名字等都一致。以免发生不必要的麻烦。
4、在kvm1上新建一个虚拟机以便进行迁移测试
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
自行上传一个centos的iso系统文件,这里需要指定要安装的iso文件:
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
下来正常安装即可
KVM 实现虚拟机在线热迁移
5、将新建的虚拟机网络配置为Bridge模式,可以ping通外网
以下操作主要是为了模拟虚拟机为公网用户提供服务中进行热迁移。
1)kvm1操作如下:





















[root@kvm1 ~]# systemctl stop NetworkManager        # 关闭此服务
[root@kvm1 ~]# virsh iface-bridge ens33 br0         # 执行此命令时,若提示以下信息,不用在意,因为其已经存在了
Created bridge br0 with attached device ens33
Bridge interface br0 started
[root@kvm1 ~]# ls /etc/sysconfig/network-scripts/ | grep br0      #确定有此文件
ifcfg-br0
[root@kvm1 ~]# virsh destroy centos7.0 
Domain centos7.0 destroyed
[root@kvm1 ~]# virsh edit centos7.0           # 编辑虚拟机的配置文件,定位到interface
    <interface type='bridge'>          # 定位到interface
      <mac address='52:54:00:3c:45:fb'/>        # 删除mac 
      <source bridge='br0'/>
      <model type='virtio'/>
[root@kvm1 ~]# virsh start centos7.0         # 启动

开启虚拟机后,配置虚拟机的网卡配置文件,默认网卡文件为ifcfg-eth0:
KVM 实现虚拟机在线热迁移
重启网络服务,并且确认IP地址:
KVM 实现虚拟机在线热迁移
现在可以在虚拟机上执行“ping www.baidu.com” 命令,使其持续ping公网。
KVM 实现虚拟机在线热迁移
2)kvm2操作如下:





[root@kvm2 ~]# systemctl stop NetworkManager
[root@kvm2 ~]# virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33
Bridge interface br0 started

[root@kvm2 ~]# ls /etc/sysconfig/network-scripts/ | grep br0
ifcfg-br0
#由于kvm2没有虚拟机,所以只需将网络更改为桥接模式即可,。
#以上配置是为了防止虚拟机迁移到这台服务器后,无法和公网进行联系。

6、开始准备对新建的centos 7进行热迁移

[root@kvm1 ~]# virt-manager 

KVM 实现虚拟机在线热迁移
填写如下,填写完成后,单击“连接”:
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移


[root@kvm1 ~]# yum -y install openssh-askpass           # 安装

KVM 实现虚拟机在线热迁移
根据弹出的对话框提示,输入“yes”:
KVM 实现虚拟机在线热迁移
输入目标主机的密码
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
7、开始进行热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
KVM 实现虚拟机在线热迁移
迁移完成:
KVM 实现虚拟机在线热迁移
现在去目标kvm服务器上,打开新迁移过去的虚拟机(会发现ping命令还在继续,压根就没有中断过):
KVM 实现虚拟机在线热迁移












易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!