【KVM虚拟化】· 虚拟机的冷迁移和热迁移

简介: 【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 的设置是相同的NX,全名为“No eXecute”,即“禁止运行”,是应用在CPU的一种技术,用作把存储器区域分隔为只供存储处理器指令集,或只供数据使用。任何使用NX技术的存储器,代表仅供数据使用,因此处理器的指令集并不能在这些区域存储。这种技术可防止大多数的缓冲溢出攻击,即一些恶意程序,把自身的恶意指令集放在其他程序的数据存储区并运行,从而把整台计算机控制。

静态迁移

1.拷贝镜像文件和虚拟机配置文件

2.重新定义此虚拟机

动态迁移

1.创建共享存储

2.两台机器挂载共享存储(手工挂载;使用资源池)

3.启动动态迁移

4.创建迁移后的虚拟机配置文件

5.重新定义虚拟机

迁移帮助命令

1. virsh migrate --help
2. 
3. [--domain] <string> 域名,id 或 uuid
4. [--desturi] <string> 客户端(常规迁移)或者源(p2p 迁移)中看到到目的地主机连接 URI
5. --live 热迁移
6. --offline 离线迁移
7. --p2p 点对点迁移
8. --direct 直接迁移--tunnelled 管道迁移
9. --persistent 目的地中的持久 VM
10. --undefinesource 在源中取消定义 VM
11. --suspend 部启用目的地主机中的域
12. --copy-storage-all 使用全磁盘复制的非共享存储进行迁移
13. --copy-storage-inc 使用增值复制(源和目的地共享同一基础映像)的非共享存储进行迁移
14. --change-protection 迁移结束前不得对域进行任何配置更改
15. --unsafe 即使不安全也要强制迁移
16. --verbose 显示迁移进程
17. --compressed 实时迁移过程中压缩重复的页
18. --auto-converge force convergence during live migration
19. --rdma-pin-all support memory pinning during RDMA live migration
20. --abort-on-error 在迁移过程中忽略软错误
21. --migrateuri <string> 迁移 URI, 通常可省略
22. --graphicsuri <string> 无空隙图形迁移中使用的图形 URI
23. --listen-address <string> listen address that destination should bind to forincoming migration
24. --dname <string> 在迁移过长中重新命名为一个新名称(如果支持)
25. --timeout <number> 如果 live 迁移超时(以秒计)则强制虚拟机挂起
26. --xml <string> 包含为目标更新的 XML 的文件名
27. --migrate-disks <string> comma separated list of disks to be migrated

迁移实例

       冷迁移时把kvm1中的配置文件,通过scp命令传到kvm2中;热迁移时需要把配置输入到nfs服务器中,导入本地目录,达到开机状态还可以继续迁移。拓扑图如下:

冷迁移

       顾名思义,关机后迁移,类似与克隆。

       先查看都有哪些虚拟机,下面正好打开一台myvm02,连接进入在当前目录创建一个文件,输入一些内容,等迁移完成的时候查看。

1. [root@kvm1 ~]# virsh list --all
2.  Id    Name                           State
3. ----------------------------------------------------
4.  4     myvm02                         running
5.  -     vm01                           shut off
6.  -     vm02                           shut off
7. 
8. 
9. [root@kvm1 ~]# virsh console myvm02
10. Connected to domain myvm02
11. Escape character is ^]
12. 
13. CentOS Linux 7 (Core)
14. Kernel 3.10.0-1160.el7.x86_64 on an x86_64
15. 
16. localhost login: root
17. Password: 
18. [root@localhost ~]# hostnamectl set-hostname 8-10
19. [root@localhost ~]# bash
20. [root@8-10 ~]# vi test.txt
21. hello world

关机后查看确定是否关机

1. [root@kvm1 ~]# virsh shutdown myvm02 
2. Domain myvm02 is being shutdown
3. 
4. [root@kvm1 ~]# virsh list --all

       通过scp命令把磁盘文件复制到kvm2上,因为磁盘较大,需要稍等片刻。不知道磁盘文件的使用virsh dumpxml myvm02找磁盘文件。

[root@kvm1 ~]# scp /kvm/img/vm02.qcow2 192.168.8.20:/kvm/img

把myvm02虚拟机配置文件导出,传到kvm2中

1. [root@kvm1 ~]# virsh dumpxml myvm02 > /tmp/vm02.xml
2. [root@kvm1 ~]# scp /tmp/vm02.xml root@192.168.8.20:/etc/libvirt/qemu/

       打开kvm2,从新定义虚拟机,查看myvm02已经存在,开机测试查看 是否有test文件,到此冷迁移完成。

1. [root@kvm2 ~]# virsh define /etc/libvirt/qemu/vm02.xml 
2. Domain myvm02 defined from /etc/libvirt/qemu/vm02.xml
3. 
4. [root@kvm2 ~]# virsh list --all
5.  Id    Name                           State
6. ----------------------------------------------------
7.  -     myvm02                         shut off
8. 
9. [root@kvm2 ~]# virsh start myvm02
10. Domain myvm02 started
11. 
12. CentOS Linux 7 (Core)
13. Kernel 3.10.0-1160.el7.x86_64 on an x86_64
14. 
15. 8-10 login: root
16. Password: 
17. Last login: Mon Apr 24 17:21:09 on ttyS0
18. [root@8-10 ~]# cat test.txt 
19. hello world

热迁移

       热迁移要求较高,磁盘文件需要做nfs共享,虚拟网卡配置为网桥模式方便测试,这里将配置从nfs开始,后面创建池、卷、虚拟机。

打开nfs服务器

1. [root@nfs ~]# yum -y install nfs-utils rpcbind
2. #省略安装内容
3. [root@nfs ~]# mkdir /nfsdir
4. [root@nfs ~]# vim /etc/exports
5. /nfsdir *(rw,sync,no_root_squash)
6. 
7. [root@nfs ~]# systemctl start nfs rpcbind
8. [root@nfs ~]# systemctl enable nfs rpcbind

测试nfs

打开另外两台kvm

1. [root@kvm1 ~]# showmount -e 192.168.8.30
2. Export list for 192.168.8.30:
3. /nfsdir *

配置本地地址解析

1. [root@kvm1 ~]# vim /etc/hosts
2. 192.168.8.10 kvm1
3. 192.168.8.20 kvm2
4. [root@kvm1 ~]# scp /etc/hosts root@192.168.8.20:/etc/

配置kvm1网络

1. [root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
2. [root@kvm1 network-scripts]# cp ifcfg-ens33 ifcfg-br10
3. [root@kvm1 network-scripts]# vim ifcfg-ens33 
4. TYPE=Ethernet
5. NAME=ens33
6. DEVICE=ens33
7. ONBOOT=yes
8. BRIDGE=br10
9. [root@kvm1 network-scripts]# vim ifcfg-br10
10. DEVICE=br10
11. TYPE=Bridge
12. BOOTPROTO=static
13. NAME=br10
14. ONBOOT=yes
15. IPADDR=192.168.8.10
16. GATEWAY=192.168.8.2
17. DNS1=8.8.8.8
18. [root@kvm1 network-scripts]# systemctl restart network

配置kvm2网络

1. [root@kvm2 ~]# cd /etc/sysconfig/network-scripts/
2. [root@kvm2 network-scripts]# cp ifcfg-ens33 ifcfg-br10
3. [root@kvm2 network-scripts]# vim ifcfg-ens33
4. TYPE=Ethernet
5. NAME=ens33
6. DEVICE=ens33
7. ONBOOT=yes
8. BRIDGE=br10
9. [root@kvm2 network-scripts]# vim ifcfg-br10
10. DEVICE=br10
11. TYPE=Bridge
12. BOOTPROTO=static
13. NAME=br10
14. ONBOOT=yes
15. IPADDR=192.168.8.20
16. GATEWAY=192.168.8.2
17. DNS1=8.8.8.8
18. [root@kvm2 network-scripts]# systemctl restart network

创建kvm1与kvm2之间互信

kvm1

1. [root@kvm1 ~]# ssh-keygen -t rsa
2. #直接按回车
3. [root@kvm1 ~]# ssh-copy-id 192.168.8.20      #传给对端kvm2

kvm2

1. [root@kvm2 ~]# ssh-keygen -t rsa
2. #直接按回车
3. [root@kvm2 ~]# ssh-copy-id 192.168.8.10      #传给对端kvm1

测试时,使用ssh 加对端ip无交互即可登录对端主机。

       开始创建存储池,两台都需要创建,如果做动态迁移,虚拟机需要在nfs共享目录内。下面创建的池名为nfspool(自己定义)类型是netfs 源主机是nfs服务器ip,源地址是nfs服务器中的共享目录,而目标地址就是kvm主机的存放目录。(这条命令就相当于挂载目录)

1. [root@kvm1 ~]# mkdir /kvm/nfspool
2. [root@kvm1 ~]# virsh pool-define-as --name nfspool --type netfs --source-host 192.168.8.30 --source-path /nfsdir --target /kvm/nfspool
3. Pool nfspool defined
4. 
5. [root@kvm1 ~]# virsh pool-start nfspool
6. Pool nfspool started

kvm2操作跟上面一样

1. [root@kvm2 ~]# mkdir /kvm/nfspool
2. [root@kvm2 ~]# virsh pool-define-as --name nfspool --type netfs --source-host 192.168.8.30 --source-path /nfsdir --target /kvm/nfspool
3. Pool nfspool defined
4. 
5. [root@kvm2 ~]# virsh pool-start nfspool
6. Pool nfspool started

       现在池中是没有卷的,先创建一个卷,这里就在kvm1中创建了,因为是挂载上了,创建的卷会在nfs服务器中共享到kvm2中。下面命令表示在nfspool池中创建一个nfs_vm01.qcow2的卷,大小为10G,文件类型为qcow2 。

1. [root@kvm1 ~]# ls /kvm/nfspool/
2. [root@kvm1 ~]# virsh vol-create-as nfspool nfs_vm01.qcow2 10G --format qcow2
3. Vol nfs_vm01.qcow2 created
4. 
5. [root@kvm1 ~]# virsh vol-list nfspool
6.  Name                 Path                                    
7. ------------------------------------------------------------------------------
8.  nfs_vm01.qcow2       /kvm/nfspool/nfs_vm01.qcow2

现在查看kvm2,上面是有磁盘文件的。

1. [root@kvm2 ~]# ls /kvm/nfspool/
2. nfs_vm01.qcow2

安装一台虚拟机到共享池,创建的是后就需要等一会了,注意设置时区,root密码等。

[root@kvm1 ~]# virt-install -n vm001 -r 1024 --vcpus 1 -l /kvm/iso/centos.iso --disk /kvm/nfspool/nfs_vm01.qcow2 -w bridge=br10 --nographics -x "console=ttyS0"

       到这里是不是觉得上面的操作很熟悉,没错就是继续NFS的存储池,这里nfs服务器省略了创建LVM卷,生产环境中还是不能省略的。因为我这里nfs目录中没有虚拟机所以需要创建迁移的虚拟机。它的工作原理简单来说,在kvm1共享目录中的虚拟机,也在kvm2共享目录中,因为是挂载的nfs服务,当要维护kvm1的时候需要停止它的服务,这时可以把虚拟机转换kvm2中开启,关闭kvm1的虚拟机,而服务时不会停,后面测试用ping访问。

登录虚拟机,获取地址。

1. localhost login: root
2. Password: 
3. [root@localhost ~]# dhclient
4. [root@localhost ~]# ip a show ens3
5. 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
6. link/ether 52:54:00:40:41:ed brd ff:ff:ff:ff:ff:ff
7.     inet 192.168.8.132/24 brd 192.168.8.255 scope global dynamic ens3
8.        valid_lft 1797sec preferred_lft 1797sec

       切换会kvm1,实现迁移。迁移前使用win端ping虚拟机ip,切记添加-t参数一直ping,查看切换的同时会不会有延迟。

[root@kvm1 ~]# virsh migrate vm001 --live --unsafe qemu+ssh://192.168.8.20/system

可以看到下图中有一个请求超时,但马上就好了。

查看kvm1中的虚拟机,vm001已经关闭。

1. [root@kvm1 ~]# virsh list --all
2.  Id    Name                           State
3. ----------------------------------------------------
4.  -     myvm02                         shut off
5.  -     vm001                          shut off
6.  -     vm01                           shut off
7.  -     vm02                           shut off

查看kvm2中的虚拟机,vm001已经迁移过来了,并且是开启状态。

1. [root@kvm2 ~]# virsh list --all
2.  Id    Name                           State
3. ----------------------------------------------------
4.  1     myvm02                         running
5.  4     vm001                          running

错误总结

       下面这个错误表示地址解析不到kvm2,想到了没有给他们两台地址解析,这个文档上面已经添加了。

1. [root@kvm1 ~]# virsh migrate vm001 --live --unsafe qemu+ssh://192.168.8.20/system
2. error: Unable to resolve address 'kvm2' service '49152': Name or service not known


相关文章
|
1月前
|
KVM 虚拟化
KVM虚拟机的桥接网络
文章主要介绍了KVM虚拟机的NAT和桥接网络类型的工作原理、配置方法以及如何进行网络模式的切换。
23 3
KVM虚拟机的桥接网络
|
1月前
|
KVM 虚拟化
KVM虚拟机的克隆
这篇文章介绍了如何使用KVM虚拟机进行完整克隆和链接克隆,包括手动克隆和使用virt-clone工具克隆的方法,以及如何编写脚本来实现自动化克隆和删除虚拟机。
23 3
KVM虚拟机的克隆
|
1月前
|
KVM 虚拟化
KVM虚拟机的热迁移
这篇文章详细介绍了KVM虚拟机的热迁移过程,包括临时迁移和永久迁移的步骤,以及可能遇到的故障和解决方案。
43 1
KVM虚拟机的热迁移
|
21天前
|
存储 SQL 数据挖掘
虚拟化数据恢复—VMware虚拟机vmdk文件被误删除的数据恢复案例
虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。管理员联系VMware工程师寻求帮助。VMware工程师尝试新建一个虚拟机来解决故障,但发现ESXi存储空间不足。于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除,然后重建一个虚拟机并且分配固定大小的虚拟磁盘。
|
25天前
|
存储 SQL 数据挖掘
虚拟化数据恢复—EXSI虚拟机误还原快照的数据恢复案例
虚拟化技术原理是将硬件虚拟化供不同的虚拟机使用,一台物理机上可以有多台虚拟机。人为误操作或者物理机故障会导致上层虚拟机不可用,甚至虚拟机里的重要数据丢失。下面给大家分享一个vmware虚拟化误操作还原快照的数据恢复案例。 虚拟化数据恢复环境: 一台由物理机迁移到EXSI上面的虚拟机,迁移完成后做了一个快照。该虚拟机上运行SQL Server数据库,记录了几年的数据。 EXSI虚拟化平台上一共有数十台虚拟机,EXSI连接了一台EVA存储,所有的虚拟机(包括故障虚拟机)都放在EVA存储上。
|
1月前
|
KVM 虚拟化 数据安全/隐私保护
KVM虚拟机安装实战
本文讲述了如何创建并使用VNC连接KVM虚拟机的详细教程,包括安装图解和命令行参数说明。
46 8
|
1月前
|
KVM 虚拟化
KVM虚拟机的冷迁移
这篇文章详细描述了KVM虚拟机的冷迁移过程,包括无依赖环境迁移、有链接克隆虚拟机迁移、多块磁盘迁移的案例,以及可能遇到的错误和解决方案。
29 3
|
4月前
|
Unix Linux 虚拟化
虚拟机VMware知识积累
虚拟机VMware知识积累
|
2月前
|
测试技术 Linux 虚拟化
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
详细的VMware虚拟机安装macOS Big Sur的保姆级教程,包括下载VMware和macOS镜像、图解安装步骤和遇到问题时的解决方案,旨在帮助读者顺利搭建macOS虚拟机环境。
59 3
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
|
2月前
|
编解码 Linux 虚拟化
超详细VMware虚拟机安装Win10操作系统过程图解
这篇文章提供了一个详细的VMware虚拟机安装Windows 10操作系统的图解教程,包括了从创建虚拟机到安装操作系统的全过程,以及安装后的一些基本设置,如屏幕分辨率调整等。作者还提到了后续会分享关于磁盘分区的创建过程。
超详细VMware虚拟机安装Win10操作系统过程图解
下一篇
无影云桌面