实验环境
- 主机硬件: 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)。 如下图所示:
搭建虚拟机环境
创建虚拟机,并安装 CentOS-7-x86_64-DVD-1810.iso 系统。作为虚拟机模板,后面都通过复制它来搭建新虚拟机环境的。 相关的配置如下图示:
搭建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虚拟化支持,如下图所示:
再复制一份最初状态的虚拟机,用作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
配置完成后,如下图所示:
遇到的问题:
上述挂载的命令不能成功返回,使用下面命令,报错:
# 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上的远程连接
菜单:文件--> 添加连接
遇到的问题:
建立连接时,报错:
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
安装后,就能正常弹出密码输入框了。
输入正确的密码之后,可以看成功添加远程的连接了,如下图:
通过virt-manager进行迁移操作
热迁移操作
选中要迁移的虚拟机,右键选中"迁移"
迁移过程中,会先在目标环境上创建虚拟机:
源环境上会暂停一下虚拟机:
源环境上虚拟机消失,目标环境上虚拟机开始运行:
迁移结束。 此时,再打开该虚拟机,仍是之前运行的状态:
迁移成功 。
遇到的问题:
无法迁移虚拟机,无法在‘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
从提示信息来看,虚拟机的磁盘必须使用缓存。
有两种方式来设置这个缓存 :
- 使用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>
############################################
- 使用virt-manager设置缓存
见图
- 问题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:
迁移完成后,成功返回。
参考