KVM迁移

静态迁移(冷迁移)
对于静态迁移,你可以在宿主机上保存一个完成的客户机镜像快照,然后在宿主机中关闭或者暂停该客户机,然后将客户机的镜像文件复制到另一台宿主机中,使用在源主机中启动该客户机时的命令来启动复制过来的镜像。

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

在基于共享存储系统时,KVM动态迁移的具体过程为:

  • 1、迁移开始时,客户机依然在宿主机上运行,与此同时,客户机的内存页被传输到目的主机上。
  • 2、QEMU/KVM 会监控并记录下迁移过程中所有已被传输的内存页的任何修改,并在所有内存页都传输完成后即开始传输在前面过程中内存页的更改内容。
  • 3、QEMU/KVM 会估计迁移过程中的传输速度,当剩余的内存数据量能够在一个可以设定的时间周期(默认 30 毫秒)内传输完成时,QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输到目的主机上,最后传输过来的内存内容在目的宿主机上恢复客户机的运行状态。
  • 4、至此,KVM 的动态迁移操作就完成了。迁移后的客户机尽可能与迁移前一致,除非目的主机上缺少一些配置,比如网桥等。

注意,当客户机中内存使用率非常大而且修改频繁时,内存中数据不断被修改的速度大于KVM能够传输的内存速度时,动态迁移的过程是完成不了的,这时候只能静态迁移。

迁移注意事项:
1、最好迁移的服务器cpu品牌一样
2、64位只能在64位宿主机间迁移,32位可以迁移32位和64位宿主机
3、宿主机中的虚拟机名字不能冲突
4、目的宿主机和源宿主机软件配置尽可能的相同,如 有相同的桥接网卡,资源池等。
5、两台迁移的主机 cat /proc/cpuinfo |grep nx 的设置是相同的.

一,静态迁移

环境描述:

主机名IP地址操作系统
kvm01 172.16.1.30 centos7
kvm02 172.16.1.40 centos7

1,准备工作
1)在kvm01和kvm02主机上安装kvm

环境要求:
1、如果是物理服务器,需要在BIOS中打开虚拟化功能(Virtualization Technology),一般的服务器默认是打开这个功能的。
2、如果是用VMware Workstation做实验,建立的虚拟机的CPU要勾选虚拟化功能,这样虚拟机才会支持KVM虚拟化

#验证cpu是否支持虚拟化:
kvm冷热状态迁移_kvm冷热状态迁移

#安装虚拟化软件:
[root@kvm01 ~]# yum -y install qemu-kvm qemu-kvm-tools qemu-img libvirt virt-install virt-manager  bridge-utils
  • 1.
  • 2.
 

各工具包的作用:

qemu-kvm  //KVM核心模块
qemu-kvm-tools //KVM调试工具,可选择性安装
qemu-img  //创建,转换和修改镜像,能处理被qemu支持的所有镜像格式
libvirt //管理虚拟机的工具包
virt-install  //libvirt库构建新虚拟机的命令行工具
virt-manager //图形化界面管理虚拟机
 bridge-utils //配置linux以太网桥
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
 

#如果是最小化安装,则还需要安装GNOME桌面环境 yum -y groupinstall “GNOME 桌面” .

 #启动libvirtd工具:
 [root@kvm01 ~]# systemctl start libvirtd
[root@kvm01 ~]# systemctl status libvirtd
  • 1.
  • 2.
  • 3.
 

kvm冷热状态迁移_kvm冷热状态迁移_02
kvm02主机操作与上边相同。

2)创建一个虚拟机(那就创建kvm01主机上)

#创建存放磁盘文件和centos镜像的目录:
[root@kvm01 ~]# mkdir /kvm-vm
[root@kvm01 ~]# mkdir /iso
[root@kvm01 ~]# ls /iso/
CentOS-7-x86_64-DVD-1708.iso    #上传centos镜像
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
 

#kvm命令行安装:

[root@kvm01 ~]# virt-install --os-type=linux --os-variant centos7.0 --name web01 --ram 1024 --vcpus 1 --disk /kvm-vm/web01.qcow2,format=qcow2,size=10 --location /iso/CentOS-7-x86_64-DVD-1708.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Retrieving file .treeinfo...                                                       |  354 B  00:00:00     
Retrieving file vmlinuz...                                                         | 5.6 MB  00:00:00     
Retrieving file initrd.img...                                                      |  46 MB  00:00:00     
Allocating 'web01.qcow2'                                                           |  10 GB  00:00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
 

参数解释:

通过virt-install命令创建新虚拟机并进行安装
 --os-type= linux  #系统类型为linux
 --os-variant=  #指定操作系统版本	
 --name  #指定虚拟机名称
 --ram   #以MB为单位为客户端事件分配的内存
 --vcpus  #配置虚拟机的虚拟CPU(vcpu)数量
 --disk   #指定虚拟机的存储位置,磁盘文件的格式及大小(单位GB)
 --location  #选择安装源
 --network   #配置客户网络接口
 --graphics	#配置虚拟机显示设置(vnc)
 listen=0.0.0.0  #表示所有网段都可以连接该虚拟机
 --noautoconsole #不管是否部署成功,执行完都会退出,如果不加的话,将会一直卡在终端
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
 

安装成功后,在命令行输入virt-manager打开kvm图形化管理界面,如下所示:
kvm冷热状态迁移_kvm冷热状态迁移_03
点击进入安装centos系统。安装完成后,查看虚拟机的一个状态:

[root@kvm01 ~]# virsh list --all
 Id    Name                           State
---------------------------------------------------- 
 -     web01                          shut off     #安装完成后,默认保持关闭状态
  • 1.
  • 2.
  • 3.
  • 4.
 

配置kvm虚拟机为桥接网络(使其能够访问外网):

#关闭宿主机的网络控制台:
[root@kvm01 ~]# systemctl stop NetworkManager
#在宿主机上创建br0(桥接网卡):
[root@kvm01 ~]# virsh iface-bridge ens33 br0
Created bridge br0 with attached device ens33
Bridge interface br0 started
#修改实例的配置文件:
[root@kvm01 ~]# virsh edit web01 
     69     <interface type='bridge'>    #修改网卡类型为桥接
     70       <mac address='52:54:00:dc:0f:d0'/>
     71       <source bridge='br0'/>   #指定桥接网卡

#启动实例:
[root@kvm01 ~]# virsh start web01 
Domain web01 started

[root@kvm01 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     web01                          running
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
 

配置web01主机的网络配置信息,并测试ping通外网:
kvm冷热状态迁移_kvm冷热状态迁移_04

2,静态迁移
静态迁移主要分为两个步骤:
1)拷贝镜像文件和虚拟机配置文件
2)重新定义此虚拟机

1)关闭或挂起虚拟机:
[root@kvm01 ~]# virsh shutdown web01 
Domain web01 is being shutdown
[root@kvm01 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
 

2)拷贝镜像文件和配置文件至kvm02主机:
#在拷贝之前先准备好kvm02主机上的环境,省得待会再去修改配置文件对应的参数(麻烦)。

[root@kvm02 ~]# mkdir /kvm-vm   //创建对应的镜像文件目录
[root@kvm02 ~]# systemctl stop NetworkManager  
[root@kvm02 ~]# virsh iface-bridge ens33 br0   //创建桥接网卡
Created bridge br0 with attached device ens33
Bridge interface br0 started
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
 
#拷贝:
[root@kvm01 ~]# scp /kvm-vm/web01.qcow2 172.16.1.40:/kvm-vm/
[root@kvm01 ~]# scp /etc/libvirt/qemu/web01.xml  172.16.1.40:/etc/libvirt/qemu/
  • 1.
  • 2.
  • 3.
 

3)在kvm02主机上定义该虚拟机:

[root@kvm02 ~]# virsh define /etc/libvirt/qemu/web01.xml 
Domain web01 defined from /etc/libvirt/qemu/web01.xml

#启动虚拟机:
[root@kvm02 ~]# virsh start web01 
Domain web01 started

[root@kvm02 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     web01                          running

[root@kvm02 ~]# 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
 

成功完成静迁移。。。

二,动态迁移(热迁移)

动态迁移主要分为5个步骤:
1,创建共享存储
2,两台机器挂载共享存储(手动挂载;使用资源池)
3,启动动态迁移
4,创建迁移后的虚拟机配置文件
5,重新定义虚拟机

环境描述:

主机名IP地址操作系统
nfs 172.16.1. 10 centos7
kvm01 172.16.1.30 centos7
kvm02 172.16.1.40 centos7
1)第一步,关闭所有主机的selinux(一定要关)及防火墙;
[root@kvm01 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@kvm01 ~]# reboot  #重启生效

[root@kvm01 ~]# systemctl stop firewalld     
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
 

注意:不要使用setenforce 0(临时关闭),否则迁移时还会报错。

2)部署nfs(在nfs服务器上)

[root@nfs ~]# yum -y install nfs-utils
[root@nfs ~]# vim /etc/exports
/nfs-share 172.16.1.0/24(rw,sync,no_root_squash)
[root@nfs ~]# mkdir /nfs-share
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
 

#kvm01和kvm02测试是否能够进行远程挂载

[root@kvm01 ~]# showmount -e 172.16.1.10
Export list for 172.16.1.10:
/nfs-share 172.16.1.0/24
[root@kvm02 ~]# showmount -e 172.16.1.10
Export list for 172.16.1.10:
/nfs-share 172.16.1.0/24
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
 

3)设置主机名,/etc/hosts 互相解析,以及两台kvm主机配置免密登录

[root@kvm01 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.10 nfs
172.16.1.30 kvm01
172.16.1.40 kvm02
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
 
#拷贝给其他主机:
[root@kvm01 ~]# for i in 10 40; do scp /etc/hosts 172.16.1.$i:/etc/; done
  • 1.
  • 2.
 
#配置免密登录:
[root@kvm01 ~]# ssh-keygen -t rsa
[root@kvm01 ~]# ssh-copy-id kvm02
[root@kvm01 ~]# ssh kvm02 hostname
kvm02
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
 

4)两个kvm主机进行挂载共享存储:

#需要将kvm01上的镜像文件,拷贝至nfs的共享目录中:
[root@kvm01 ~]# scp /kvm-vm/web01.qcow2  nfs:/nfs-share
[root@nfs ~]# ls /nfs-share/
web01.qcow2
  • 1.
  • 2.
  • 3.
  • 4.
 
kvm01:  
[root@kvm01 ~]# vim /etc/fstab    
//添加以下内容:
172.16.1.10:/nfs-share          /kvm-vm                 nfs     defaults        0 0
[root@kvm01 ~]# mount -a     //重新加载
[root@kvm01 ~]# ls /kvm-vm/
web01.qcow2

kvm02:
[root@kvm02 ~]# mkdir /kvm-vm
[root@kvm02 ~]# vim /etc/fstab
172.16.1.10:/nfs-share          /kvm-vm                 nfs     defaults        0 0
[root@kvm02 ~]# mount -a
[root@kvm02 ~]# ls /kvm-vm/
web01.qcow2
#创建桥接网络:
[root@kvm02 ~]# systemctl stop NetworkManager
[root@kvm02 ~]# virsh iface-bridge ens33 br0 
Created bridge br0 with attached device ens33
Bridge interface br0 started
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
 

4)进行动态迁移:
#在动态迁移之前,模拟web01虚拟机正常工作中:
kvm冷热状态迁移_kvm冷热状态迁移_05

kvm提供了迁移工具migrate:
[root@kvm01 ~]# virsh migrate --live --unsafe --verbose web01 qemu+ssh://172.16.1.40/system
Migration: [100 %]     #迁移成功
  • 1.
  • 2.
  • 3.
 

参数解释:

–live #热迁移
–unsafe #即使不安全也要强制迁移
–verbose #显示迁移过程
web01则表示当前的域名(虚拟机),后边则指向目标主机的地址。

#迁移成功后,在kvm02主机上查看虚拟机状态:

[root@kvm02 ~]# virsh list 
 Id    Name                           State
----------------------------------------------------
 2     web01                          running
  • 1.
  • 2.
  • 3.
  • 4.
 

可以看到虚拟机的状态为运行状态。

#登录虚拟机,查看工作状态是否不间断:
kvm冷热状态迁移_kvm冷热状态迁移_06

可以看到通过热迁移,虚拟机会一直保持工作,并不会丢失数据,并且QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输到目的主机上。至此,迁移目标已经实现了。

在生产环境中,接下来我们可以选择一个合适的时间来重新定义虚拟机:

#将虚拟机的配置文件拷贝至新机上(或自己创建配置文件):
[root@kvm01 ~]# scp /etc/libvirt/qemu/web01.xml kvm02:/etc/libvirt/qemu/
web01.xml                                                               100% 4047     4.0KB/s   00:00   
[root@kvm02 ~]# ls /etc/libvirt/qemu  #在web02上查看
networks  web01.xml
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
 
#重新定义虚拟机:
[root@kvm02 ~]# virsh shutdown web01 
Domain web01 is being shutdown

[root@kvm02 ~]# virsh define /etc/libvirt/qemu/web01.xml 
Domain web01 defined from /etc/libvirt/qemu/web01.xml

[root@kvm02 ~]# virsh start web01   #启动虚拟机
Domain web01 started

[root@kvm02 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 3     web01                          running    

[root@kvm02 ~]# 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
 

至此,热迁移工作结束。。

常见错误:

1、迁移时遇到的错误描述:
# virsh migrate centos --live qemu+ssh://192.168.30.132/system
error: unable to connect to server at 'KVM-2:49152': No route to host    
原因:你的免密登录没有成功
解决方法:重新做免密登录即可
2、迁移时的存储错误:
# virsh migrate centos --live qemu+ssh://192.168.30.132/system
 error: Failed to open file '/mnt/CentOS6.8.qcow2': Input/output error
  原因:存储没有挂载成功
  解决方法:mount -o remount /dev/sdb /mnt
3、迁移时FQDN错误:
# virsh migrate centos --live qemu+ssh://192.168.30.132/system
 error: internal error hostname on destination resolved to localhost, but migration requires an FQDN
  原因:两台宿主机无法解析主机名
  解决方法:重新配置主机名和ip的解析
4、迁移时语法错误:
# virsh migrate centos --live qemu+ssh://192.168.30.132:/system
error: internal error Unable to parse URI qemu+ssh://192.168.30.132:/system
  原因:qemu+ssh语法写错了
  解决方法:正确的应该是:virsh migrate centos --live qemu+ssh://192.168.30.132/system