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

news2024/11/28 4:36:35

目录

🍎静态迁移(冷迁移)

🍎动态迁移(热迁移)

🍎迁移注意事项

🍒静态迁移

🍒动态迁移

🍒迁移帮助命令

🍎迁移实例

🍓冷迁移

🍓热迁移

🍓错误总结


    🦐博客主页:大虾好吃吗的博客

    🦐专栏地址: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.重新定义虚拟机

迁移帮助命令

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

迁移实例

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

冷迁移

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

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

[root@kvm1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 4     myvm02                         running
 -     vm01                           shut off
 -     vm02                           shut off
​
​
[root@kvm1 ~]# virsh console myvm02
Connected to domain myvm02
Escape character is ^]
​
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64
​
localhost login: root
Password: 
[root@localhost ~]# hostnamectl set-hostname 8-10
[root@localhost ~]# bash
[root@8-10 ~]# vi test.txt
hello world

关机后查看确定是否关机

[root@kvm1 ~]# virsh shutdown myvm02 
Domain myvm02 is being shutdown
​
[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中

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

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

[root@kvm2 ~]# virsh define /etc/libvirt/qemu/vm02.xml 
Domain myvm02 defined from /etc/libvirt/qemu/vm02.xml
​
[root@kvm2 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     myvm02                         shut off
​
[root@kvm2 ~]# virsh start myvm02
Domain myvm02 started
​
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64
​
8-10 login: root
Password: 
Last login: Mon Apr 24 17:21:09 on ttyS0
[root@8-10 ~]# cat test.txt 
hello world

热迁移

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

打开nfs服务器

[root@nfs ~]# yum -y install nfs-utils rpcbind
#省略安装内容
[root@nfs ~]# mkdir /nfsdir
[root@nfs ~]# vim /etc/exports
/nfsdir *(rw,sync,no_root_squash)
​
[root@nfs ~]# systemctl start nfs rpcbind
[root@nfs ~]# systemctl enable nfs rpcbind

测试nfs

打开另外两台kvm

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

配置本地地址解析

[root@kvm1 ~]# vim /etc/hosts
192.168.8.10 kvm1
192.168.8.20 kvm2
[root@kvm1 ~]# scp /etc/hosts root@192.168.8.20:/etc/

配置kvm1网络

[root@kvm1 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm1 network-scripts]# cp ifcfg-ens33 ifcfg-br10
[root@kvm1 network-scripts]# vim ifcfg-ens33 
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br10
[root@kvm1 network-scripts]# vim ifcfg-br10
DEVICE=br10
TYPE=Bridge
BOOTPROTO=static
NAME=br10
ONBOOT=yes
IPADDR=192.168.8.10
GATEWAY=192.168.8.2
DNS1=8.8.8.8
[root@kvm1 network-scripts]# systemctl restart network

配置kvm2网络

[root@kvm2 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm2 network-scripts]# cp ifcfg-ens33 ifcfg-br10
[root@kvm2 network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br10
[root@kvm2 network-scripts]# vim ifcfg-br10
DEVICE=br10
TYPE=Bridge
BOOTPROTO=static
NAME=br10
ONBOOT=yes
IPADDR=192.168.8.20
GATEWAY=192.168.8.2
DNS1=8.8.8.8
[root@kvm2 network-scripts]# systemctl restart network

创建kvm1与kvm2之间互信

kvm1

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

kvm2

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

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

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

[root@kvm1 ~]# mkdir /kvm/nfspool
[root@kvm1 ~]# virsh pool-define-as --name nfspool --type netfs --source-host 192.168.8.30 --source-path /nfsdir --target /kvm/nfspool
Pool nfspool defined

[root@kvm1 ~]# virsh pool-start nfspool
Pool nfspool started

kvm2操作跟上面一样

[root@kvm2 ~]# mkdir /kvm/nfspool
[root@kvm2 ~]# virsh pool-define-as --name nfspool --type netfs --source-host 192.168.8.30 --source-path /nfsdir --target /kvm/nfspool
Pool nfspool defined

[root@kvm2 ~]# virsh pool-start nfspool
Pool nfspool started

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

[root@kvm1 ~]# ls /kvm/nfspool/
[root@kvm1 ~]# virsh vol-create-as nfspool nfs_vm01.qcow2 10G --format qcow2
Vol nfs_vm01.qcow2 created

[root@kvm1 ~]# virsh vol-list nfspool
 Name                 Path                                    
------------------------------------------------------------------------------
 nfs_vm01.qcow2       /kvm/nfspool/nfs_vm01.qcow2   

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

[root@kvm2 ~]# ls /kvm/nfspool/
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访问。

登录虚拟机,获取地址。

localhost login: root
Password: 
[root@localhost ~]# dhclient
[root@localhost ~]# ip a show ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:40:41:ed brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.132/24 brd 192.168.8.255 scope global dynamic ens3
       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已经关闭。 

[root@kvm1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     myvm02                         shut off
 -     vm001                          shut off
 -     vm01                           shut off
 -     vm02                           shut off

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

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

错误总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT让我变成了“超人”-如何提升团队30%效能质量提高100%的阶段性总结报告

创作背景 CHATGPT刚出现时我的内心有一万匹“马”在奔腾&#xff0c;我是排斥的、BS的、甚至关掉屏敝掉相关新闻、连家里电视机的插线都拨掉。因为它的表现真的伤到了我的自尊。 这样的情绪源至我自己的“不自信”&#xff0c;不自信的前提是因为听到的东西太过于有“冲击性”了…

更适合电音的蓝牙耳机,设计真的很潮,哈氪零度青春版上手

现在低价位的耳机&#xff0c;音质都没什么特点&#xff0c;设计也是马马虎虎吧&#xff0c;想找一款好看好听的耳机还真不容易。最近我用的是一款哈氪零度青春版&#xff0c;这款耳机设计就很不错&#xff0c;上面加入了冰雪的元素&#xff0c;而且这款耳机音频素质也很不错&a…

ESP32-S3在VSCODE上编译烧录

1.准备 安装好ESP-IDF和VSCODE上的扩展插件 参考安装步骤1 参考按照步骤2 2.编译和烧录 &#xff08;1&#xff09;显示所有例程 &#xff08;2&#xff09;在get-started处选择hello_world&#xff0c;然后创建项目目录 &#xff08;3&#xff09;选择芯片类型&#xff0c…

【网络协议详解】——DNS系统协议(学习笔记)

目录 &#x1f552; 1. DNS的作用&#x1f552; 2. 域名结构&#x1f552; 3. 域名分类&#x1f552; 4. 域名空间&#x1f552; 5. 域名服务器类型&#x1f558; 5.1 根域名服务器&#x1f558; 5.2 顶级域名服务器&#x1f558; 5.3 权限域名服务器&#x1f558; 5.4 本地域名…

Java-软考总结

软考总结目录 宏观  学习感受  阶段划分 微观  1.自己看书和看视频&#xff1a;  2.学习的知识点和课后题进行结合  3.做往年的软考真题  4.提炼出相对来说难以攻克的问题组织分享和讨论  5.小组讨论做错的题并进行结构化 总结学习时间上学习方法上学习形式上 宏…

【Linux入门】Linux权限及管理

【Linux入门】Linux权限及管理 目录 【Linux入门】Linux权限及管理Linux权限管理文件访问者的分类文件类型和访问权限&#xff08;事物属性&#xff09; 文件权限值的表示方法文件访问权限的相关设置方法目录的权限实现共享目录粘滞位目录权限总结 作者&#xff1a;爱写代码的刚…

【iOS开发-多线程【四】pthreadNSThread

前言 多线程的最后一篇&#xff0c;从GCD的API到GCD的实现&#xff0c;学到了NSOperation和NSOperationQueue 慢慢了解了多线程的使用场景和众多原理&#xff0c;其中不乏涉及到了其他的知识&#xff0c;锁等。 这篇博客学习iOS常用的NSThread&#xff0c;了解pthread&#x…

DBeaver安装与使用教程

—仅供学习 侵权请联系删除– 一、DBeaver介绍 DBeaver是免费和开源&#xff08;GPL&#xff09;为开发人员和数据库管理员通用数据库工具。 1.它支持任何具有一个JDBC驱动程序数据库&#xff0c;也可以处理任何的外部数据源。 DBeaver 通过 JDBC 连接到数据库&#xff0c;可以…

在AgilePLM项目中使用积木报表

前言 目前市面上有很多比较好的报表工具&#xff0c;但很多收费都比较昂贵&#xff0c;这次找到一个开源免费的报表工具。推荐企业内部开发使用 积木报表虽然没有FineReport那么功能强大&#xff0c;但是目前测试下来也可以满足大部分报表功能。也是能缩短开发周期降低开发成…

PCDViewer的常用操作

PCDViewer是一款功能强大但操作极为简单的点云可视化和编辑软件&#xff0c;支持对点云的渲染显示、查询、量测、建图拼接、编辑、格式转换等功能&#xff0c;同时支持了pose文件、矢量文件等的显示。PCDViewer目前提供了Windows、Ubuntu18.04、Ubuntu20.04等版本。 本页面总结…

Mysql之高可用方案浅析

在工程项目中&#xff0c;系统应用的高可用性越来越重要&#xff0c;业主越来越重视。其实高可用可以分为应用层高可用和数据层高可用&#xff0c;数据层高可用中常见的有关系型数据库mysql的高可用、非关系型NoSQl数据库redis的高可用等&#xff0c;下面聊聊典型的关系型数据库…

2023 剑桥大学博士后/访问学者项目一览

作为全球知名的高等教育机构&#xff0c;剑桥大学一直致力于与世界各地的学者保持紧密联系&#xff0c;共同探索各个学科领域的前沿问题和挑战。为了加强国际间的学术交流和合作&#xff0c;剑桥大学开展了博士后访问学者项目&#xff0c;为来自不同国家和地区的优秀学者提供机…

【Python pyqt】零基础也能轻松掌握的学习路线与参考资料

。 Python和pyqt是一对非常强大的组合&#xff0c;可以用于快速开发各种应用程序&#xff0c;包括桌面应用程序、Web应用程序、游戏等等。如果想要系统地了解如何学习Python pyqt&#xff0c;可以遵循以下学习路线&#xff1a; Python基础知识学习 在学习pyqt之前&#xff0c…

机器学习_数据升维_多项式回归代码_保险案例数据说明_补充_均匀分布_标准正太分布---人工智能工作笔记0038

然后我们再来看一下官网注意上面这个旧的,现在2023-05-26 17:26:31..我去看了新的官网, scikit-learn已经添加了很多新功能, 我们说polynomial多项式回归其实是对数据,进行 升维对吧,从更多角度去看待问题,这样 提高模型的准确度. 其实y=w0x0+w1x1.. 这里就是提高了这个x的个…

发现一个好玩的东西:Markdown 使用 Emoji 表情

Markdown 使用 Emoji 表情 玩法1、复制和粘贴表情符号2、使用表情符号简码Markdown 定义列表 玩法 有两种方法可以将表情符号添加到Markdown文件中&#xff1a; 将表情符号复制并粘贴到Markdown格式的文本中或者键入emoji shortcodes。 1、复制和粘贴表情符号 在大多数情况…

C++ 学习 ::【基础篇:06】:C++ (inline)内联函数的介绍及其出现的意义【对比于 C语言宏函数】

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

基于html+css的图展示94

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

SpringCloudAlibaba中篇(Sentinel,Seata)(超级无敌认真好用,万字收藏篇!!!!)

文章目录 SpringCloudAlibaba中篇(Sentinel,Seata)1 Sentinel&#xff08;流量处理&#xff09;1.1 分布式系统遇到的问题1.2 服务雪崩1.3 容错机制1.4 什么是Sentinel1.5 初步使用Sentinel-流控规则1.6 Sentinel- SentinelResource1.7 初步使用Sentinel-降级规则1.8 控制台部署…

计算机组成原理-指令系统-机器级语言表示(汇编)

目录 一、X86汇编语言指令基础 寄存器 常见的算数运算指令​编辑 常见逻辑运算指令 AT&T格式和 Intel格式指令 选择语句的机器级表示 循环语句的机器级表示 二、CISC和RISC 一、X86汇编语言指令基础 寄存器 常见的算数运算指令 常见逻辑运算指令 AT&T格式和 Intel格…

程序猿成长之路番外篇-如何理解牛顿迭代法及如何使用牛顿迭代法求数的平方根

小伙伴们好久不见&#xff0c;我又来了&#xff0c;这次我分享的内容是如何理解牛顿迭代法及如何使用牛顿迭代法求数的平方根 什么是牛顿迭代法&#xff1f; 官方话术&#xff1a;牛顿迭代法又称为牛顿-拉夫逊&#xff08;拉弗森&#xff09;方法&#xff08;Newton-Raphson m…