实验环境

  • 主机硬件: i7-8550u
  • 主机内存:8G
  • 主机操作系统:Win10
  • 虚拟化软件:Vmware Workstation 15 Pro
  • 客户机系统:Centos7 x86_64
  • 虚拟机KVM 1 : 192.168.1.68
  • 虚拟机KVM 2 : 192.168.1.65
  • 虚拟机NFS : 192.168.1.67
  • 安装介质:CentOS-7-x86_64-Minimal-1810.iso , CentOS-7-x86_64-DVD-1810.iso

实验目标

通过一台笔记本来实现KVM虚拟机的热迁移操作环境。

实验过程

通过在笔记本上启动三个虚拟机,一个是NFS服务端(192.168.1.67),一个是热迁移的源头(192.168.1.65),另一个是热迁移的目标环境(192.168.1.68)。 如下图所示:

vgpu热迁移在哪启动 vmware热迁移_运维

搭建虚拟机环境

创建虚拟机,并安装 CentOS-7-x86_64-DVD-1810.iso 系统。作为虚拟机模板,后面都通过复制它来搭建新虚拟机环境的。 相关的配置如下图示:

vgpu热迁移在哪启动 vmware热迁移_运维_02

搭建NFS服务端环境

复制一份上述安装完成的虚拟机,用作NFS服务器端,IP设为192.168.1.67 .

安装相关软件包:

yum install nfs-utils

配置NFS

在/etc/exports 文件中添加下面内容: /opt/nfs_dir *(rw,no_root_squash,no_all_squash,sync) 注:这里设置的是对所有IP段开放,可根据实际缩小范围。

创建相关目录: mkdir /opt/nfs_dir

开机启动NFS服务:

systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap

启动服务:

systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap

检测状态:

[root@localhost magc]# netstat -anpu | grep rpcbind
udp        0      0 0.0.0.0:923             0.0.0.0:*                           6263/rpcbind
udp6       0      0 :::923                  :::*                                6263/rpcbind

开放防火墙端口:

firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --reload

也可以直接关闭防火墙:

systemctl stop firewalld.service

禁用防火墙: systemctl disable firewalld.service

注:为了节约资源,可以将此虚拟机关闭图形界面,默认不启动图形桌面

# 设为终端界面
systemctl set-default multi-user.target
# 恢复为图形界面
# systemctl set-default graphical.target

为了节约资源,也可以将此虚拟机的内存缩小至1.3G。

部署KVM虚拟机环境

这里属于Vmware虚拟机中安装KVM虚拟机,是双层的嵌套,注意要在Vmware中开启VT虚拟化支持,如下图所示:

vgpu热迁移在哪启动 vmware热迁移_vgpu热迁移在哪启动_03

再复制一份最初状态的虚拟机,用作KVM虚拟机环境。 修改IP地址为192.168.1.65 , Hostname改为kvm2host

安装KVM:

yum -y install qemu-kvm libvirt virt-install bridge-utils virt-manager openssh-askpass
# 重启环境
reboot

重启完毕后,查看KVM模块是否正常启动:

#查看KVM模块是否启动
lsmod |grep kvm

开启libvirtd相关服务:

systemctl enable libvirtd
systemctl start libvirtd

配置NFS存储池

通过virt-manager来配置存储池比较方便。

打开 virt-manager , 双击 "QEMU/KVM" --> 存储

添加存储池(左下角加号): 名称:kvm 类型:netfs:网络导出的目录

点 “前进”按钮:

目标路径:/home/magc/kvm_dir 主机名:192.168.1.67 源路径:/opt/nfs_dir

配置完成后,如下图所示:

vgpu热迁移在哪启动 vmware热迁移_网络_04

遇到的问题:

上述挂载的命令不能成功返回,使用下面命令,报错:

# showmount -e 192.168.1.67
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)

原因是服务端防火墙导致的,在NFS服务器上执行:

firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=2049/udp
firewall-cmd --reload

或者直接关闭防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

创建桥接网卡

修改文件:/etc/sysconfig/network-scripts/ifcfg-ens33 注:其中ens33是有线网卡的名字 注释掉网络IP信息,并添加最后一行,如下所示:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=6c4867b4-9272-4e96-bd1c-085f4d9cf111
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.1.65
#PREFIX=24
#GATEWAY=192.168.1.254
#DNS1=114.114.114.114
BRIDGE=br0

然后,再创建文件:/etc/sysconfig/network-scripts/ifcfg-br0 内容:

DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.1.65
PREFIX=24
GATEWAY=192.168.1.254
DNS1=114.114.114.114

关闭Selinux

将/etc/sysconfig/selinux 中的enforcing 改为disabled

重启机器 。

复制虚拟机

此时将源主机192.168.1.65 , 复制出一份,IP设为192.168.1.68,主机名改为kvm68host 注:此时复制,保证了两个环境具有相同的NFS存储池信息,相同的网卡设备。SELinux已被关闭。

安装虚拟机

在192.168.1.65环境上安装客户机,文件系统存放在NFS存储池中

安装客户机系统

这里的客户机就是迁移对象,即Vmware虚拟机中的KVM虚拟机。 为了测试方便,这里选择安装最小版的centos系统。

安装过程略去。

创建虚拟机过程遇到的问题:

报权限不足的问题:

使用测试环境上的NFS仍有此问题,可见是本地环境的问题导致的,

继续排查

解决办法:关闭Selinux

将/etc/sysconfig/selinux 中的enforcing 改为disabled

重启机器 。

重新创建虚拟机,安装正常进行。

配置热迁移源环境

这里源环境就是192.168.1.65虚拟机。

在virt-manager中建立192.168.1.68上的远程连接

菜单:文件--> 添加连接

vgpu热迁移在哪启动 vmware热迁移_centos_05

遇到的问题:

建立连接时,报错:

unable to connect to libvirt qemu+ssh://root@192.168.1.68/system

You need to install openssh-askpass or similar to connnect to this host .

解决办法:

sudo yum install openssh-askpass

安装后,就能正常弹出密码输入框了。

vgpu热迁移在哪启动 vmware热迁移_IP_06

输入正确的密码之后,可以看成功添加远程的连接了,如下图:

vgpu热迁移在哪启动 vmware热迁移_运维_07

通过virt-manager进行迁移操作

热迁移操作

选中要迁移的虚拟机,右键选中"迁移"

vgpu热迁移在哪启动 vmware热迁移_网络_08

vgpu热迁移在哪启动 vmware热迁移_网络_09

迁移过程中,会先在目标环境上创建虚拟机:

vgpu热迁移在哪启动 vmware热迁移_vgpu热迁移在哪启动_10

源环境上会暂停一下虚拟机:

vgpu热迁移在哪启动 vmware热迁移_centos_11

源环境上虚拟机消失,目标环境上虚拟机开始运行:

vgpu热迁移在哪启动 vmware热迁移_vgpu热迁移在哪启动_12

迁移结束。 此时,再打开该虚拟机,仍是之前运行的状态:

vgpu热迁移在哪启动 vmware热迁移_centos_13

迁移成功 。

遇到的问题:

无法迁移虚拟机,无法在‘192.168.1.68:49512'连接到服务器:没有到主机的路由

查看防火墙设置,停止防火墙

systemctl stop firewalld.service

通过virsh进行迁移操作

此次操作的源主机是192.168.1.68,

[root@kvm68host magc]# virsh list
 Id    名称                         状态
----------------------------------------------------
 5     centos7.0                      running

迁移的目标主机是192.168.1.65:

[root@kvm2host magc]# virsh list
 Id    名称                         状态
----------------------------------------------------

热迁移操作:

[root@kvm2host magc]# virsh migrate --live centos7.0 qemu+ssh://192.168.1.68/system
root@192.168.1.68's password:

迁移完成后,成功返回。

遇到的问题:

  • 问题一:
错误:不安全的迁移:Migration may lead to data corruption if disks use cache != none or cache != directsync

从提示信息来看,虚拟机的磁盘必须使用缓存。

有两种方式来设置这个缓存 :

  1. 使用virsh 直接编辑
# virsh edit test
Domain test XML configuration edited.
############################################添加cache='none'
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='none'/>
      <source file='/var/lib/libvirt/images/test.qcow2'/>
          <target dev='vda' bus='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>
############################################
  1. 使用virt-manager设置缓存

见图

vgpu热迁移在哪启动 vmware热迁移_IP_14

  • 问题2:
[root@kvm2host magc]# virsh migrate --live centos7.0 qemu+ssh://192.168.1.68/system
root@192.168.1.68's password:
错误:无法解析地址 'kvm68host' 服务 '49152': 未知的名称或服务

无法解析主机名kvm68host

将下面一行加入/etc/hosts

192.168.1.68  kvm68host

注:此时,通过virt-manager进行迁移则可以正常进行,可见,使用上层virt-manager 和virsh 的操作并不完全等同。

再次迁移:

[root@kvm2host magc]# virsh migrate --live centos7.0 qemu+ssh://192.168.1.68/system
root@192.168.1.68's password:

迁移完成后,成功返回。

参考