`

基于libvirt的虚拟化迁移

 
阅读更多
为什么要迁移呢?当一台主机的负载过高时,我们希望把虚拟机迁移到一台系统更好的主机上。当主机发生硬件故障需要停机维护时,我们需要迁移虚拟机,如果主机就只跑了一台虚拟机我们可以把它迁移到其他主机,提高资源的利用率,等等。

迁移命令:
# virsh migrate --live GuestName DestinationURI   (--live :迁移过程中虚拟机一直保持运行状态)
GuestName指虚拟机名称,DestinationURI:目的主机的URI。
举例:# virsh  migrate --live vm0 qemu+tcp://192.168.0.200/system
迁移的要求是:需要目的主机和源主机有相同的环境,包括hypervisor。

注意点:
笔者在做迁移的时候,所有前置条件都一配置好,执行迁移命令:
sudo virsh migrate --live vm0 qemu+tcp://192.168.1.200/system
却出现的如下错误:
error: Unable to resolve address 'ubuntu1204' service '49152': No address associated with hostname
笔者的系统环境是Ubuntu,错误中‘ubuntu1204’是192.168.1.200的主机名,对此错误很是不解,说是‘ubuntu1204’无法解析,查得资料:http://wiki.libvirt.org/page/Migration_fails_with_%22Unable_to_resolve_address%22_error
在迁移的过程中,运行在目的主机中的libvirtd进程要根据address和port创建一个URI,URI是目的主机用来接收数据和发回数据到源主机的libvirtd进程的。上面的错误的原因是libvirtd没法解析主机名到IP地址。可以看下图:
目的主机libvirtd在发回数据的时候,把hostname发回去了,而源主机就用直接请求hostname而非IP,恰巧在源主机没有做DNS配置,因此才出现次错误。
如果是在REHEL系列的Linux中出现的错误如所示:Migration fails with "Unable to resolve address" error

解决方案一:
配置source源主机的 /etc/hosts文件:加入"192.168.1.200 ubnuntu1204"  参考:http://bbs.openzj.com/thread-7200-1-1.html

解决方案二:
# virsh migrate vm0 qemu+tcp://192.168.1.200/system tcp://192.168.1.200
这时目的主机libvirtd进程将使用“tcp://192.168.1.200“作为迁移连接,libvirt会自动生成的端口追加到此URI后面,(这里相当于开启另外一个连接来迁移数据,可以和方案三对比之)当然也可以手动指定端口号如:
# virsh migrate vm0 qemu+tcp://192.168.1.200/system tcp://192.168.1.200 12345

解决方案三:使用隧道(tunnelled) 迁移,该方式不会为迁移创建单独的连接,而是通过与目的libvirtd通信的这个连接来传输数据。(例如连接:qemu+tcp://192.168.1.200/system)
# virsh migrate vm0 qemu+tcp://192.168.1.200/system  --p2p --tunnelled

问题解决了,顺便学习下libvirt migrate的概念:

说到虚拟机的迁移,其实就是数据的转移,数据的转移就涉及数据的传输,数据的传输需要通过网络。libvirt提供了两种方案。

hypervisor native transport:
“本地”数据传输,相当于一种手动方式做的迁移。数据是否可以加密取决于hypervisor自身是否已实现。
Migration native path

libvirt tunnelled transport
隧道化的(tunnelled)数据传输支持很强的加密功能,这要归结于libvirt的RPC协议。不好的一方面是数据会在hypervisor和libvirtd之间的传输。
Migration tunnel path
迁移时的通信控制:(此景会有一个第三方的管理程序来管理,上面所说单纯是从两个主机直接的角度来说的)

虚拟机的迁移需要两个主机之间的密切协调,同时应用程序(虚拟机管理平台)也将参与进来,此应用可以是在源主机、目的主机、甚至是第三台主机。

受管理的直接迁移(Managed direct migration):
直接管理迁移,libvirt客户端进程控制迁移的不同阶段。客户端应用程序必须连接以及获得在源主机和目的主机的libvirtd进程的认证。无需两个libvirtd进程间相互通信。如果客户端应用崩溃了,或者在迁移过程中失去了链接,一种办法就是强制终止迁移,重启源主机的guest CPU。
Migration direct, managed
受管理的点对点迁移:(Managed peer to peer migrate)
对于点对点,libvirt客户端程序只是与在源主机的libvirtd进程通信,源主机libvirtd进程自己控制整个迁移的过程,直接连接到目的主机的libvirtd。如果客户端应用崩溃了或者与libvirtd失去连接,迁移过程无需中断直至迁移完成。需要注意的是源主机认证(通常是root)链接到目的主机,而不是通过客户端应用链接到源主机。

Migration peer-to-peer
不受管理的直接迁移:(Unmanaged direct migrate)
此迁移方式既不受libvirt客户端控制,也不受libvirtd控制,迁移的控制过程委托给基于hypervisor之上的管理服务来处理。libvirt 客户只需要通过hypervisor的管理层做一下初始化。不管是libvirt 客户端还是libvirtd崩溃了,迁移还是会照样进行直至完成。

Migration direct, unmanaged

迁移URI:
虚拟机迁移时,客户端应用程序需要准备的URI可达三个,具体取决于控制流如何选择或者API如何调用。第一个URI就是应用程序到运行着虚拟机的源主机的连接,第二个URI就是目的主机到应用程序之间的连接(在点对点的迁移中,这个连接是来自源主机,而不是客户端应用程序)。第三个URI就是hypervisor指定的用来控制以何种方式迁移的连接。在任何一种受管理的迁移中,前两个URI是必不可少的,第三个是可选的。而在不受管理的直接迁移中,第一个和第三个是必须的,第二个并不会使用。


通常管理应用程序只需关心前两个URI。二者都是普通的libvirt 连接URI格式。libvirt会通过查找目的主机的配置文件中的hostname自动确定hypervisor指定的URI(第三个URI)。

应用程序获取第三个URI时可能会出现的如下几种情况:
1、hostname的配置不正确,或者DNS不正确,如果主机的hostname不能正确的解析到IP地址的化就会生成一个错误的URI,这刚好时文章开头出现的问题。此时需要明确指定IP地址或者使用正确的hostname。
2、主机有多个网络接口,此时需要用IP明确指定来关联某个具体的网卡。
3、防火墙限制端口的使用,当libvirt自动生扯功能的端口需要防火墙对其端口是开放的。
分享到:
评论

相关推荐

    基于KVM虚拟化技术的研究与实验评估1

    【基于KVM虚拟化技术的研究与实验评估】 随着云计算的快速发展,虚拟化技术成为了其中不可或缺的关键组成部分。KVM(Kernel-based Virtual Machine),一种基于Linux内核的全虚拟化解决方案,因其高效性能和开源...

    虚拟化技术KVM.pdf

    KVM是一种基于Linux内核的全虚拟化解决方案,它允许Linux内核直接支持虚拟化功能,无需额外的软件层。KVM的性能非常高,因为它直接利用了现代CPU的虚拟化扩展特性(如Intel VT-x或AMD-V)。 ##### 2.2 KVM的技术...

    libvirt源码

    这些API涵盖了多种虚拟化技术,如KVM、Xen、QEMU等,使得开发者无需关注底层虚拟化技术的细节,就能实现对虚拟机的创建、启动、停止、迁移等操作。 2. **libvirt 库** Libvirt库是其核心组件,包含了所有与虚拟化...

    大二下学期KVM虚拟化实践与编程实验报告.zip

    在大二下学期的KVM虚拟化实践与编程实验中,学生将深入理解并操作虚拟化技术,特别是基于Kernel-based Virtual Machine (KVM) 和 QEMU 的环境。这个实验涵盖了虚拟化环境的搭建、虚拟机的启动与管理、虚拟化应用的...

    libvirt0.9.4.tar.gz

    《深入解析libvirt0.9.4:虚拟化管理的核心技术》 在IT领域,虚拟化技术已经成为现代数据中心和云计算的基础。libvirt作为一款强大的开源虚拟化管理工具,为多种虚拟化平台提供了统一的API接口,让开发者可以方便地...

    libvirt-java0.4.7

    例如,开发者可以利用libvirt-java轻松地实现批量创建和迁移虚拟机,或者开发自定义的虚拟化管理界面。 值得注意的是,libvirt-java的使用需要配合libvirt守护进程运行,并且可能需要依赖特定版本的libvirt库。在...

    libvirt-1.3.5.tar.gz

    《深入理解libvirt:KVM虚拟化关键技术剖析》 libvirt是开源社区开发的一个强大而灵活的工具,它为管理虚拟化技术提供了一个统一的API接口。libvirt支持多种虚拟化平台,包括KVM(Kernel-based Virtual Machine)、...

    Foundations of Libvirt Development

    7. **虚拟化管理实践**: 为了提供更具体的实践知识,书中可能包含了如何使用Libvirt进行真实世界虚拟化任务的案例分析,例如服务器迁移、灾难恢复、测试环境搭建等。 8. **跨平台支持**: Libvirt作为跨平台的虚拟化...

    Libvirt 介绍

    Libvirt 是一个开源项目,提供了一组 API、工具和库,用于管理和控制虚拟化平台。在 OpenStack 环境中,Libvirt 是一个至关重要的组件,它为各种虚拟化技术(如 KVM、Xen、QEMU 和 LXC)提供了统一的接口,使得 ...

    开源虚拟化的比较

    另一方面,邮政系统建立了基于Asianux3.0SP2和KVM的虚拟化测试平台,用于各种操作平台的应用开发和测试,同时确保了旧应用的兼容性。 #### 进行中的虚拟化工作与下步方向 当前,虚拟化技术的发展仍在不断推进,...

    网络虚拟化概述.pptx

    Linux桥接是早期虚拟化环境中常见的网络管理方式,尤其在XenServer 5.6之前,但现在仍被KVM和libvirt等虚拟化平台所支持。Linux桥接通过'brctl'模块管理,提供基本的二层交换功能。 总之,网络虚拟化通过将网络功能...

    KVM虚拟化技术__实战与原理解析_带书签

    2. **libvirt**:这是一个API库,用于管理虚拟化基础设施,包括KVM、Xen和其他虚拟化技术。它提供了多种语言的绑定,使得管理员可以通过编程方式管理虚拟机。 3. **网络配置**:KVM支持多种网络模型,如桥接模式、...

    KVM虚拟化技术 实战与原理解析 高清完整版

    学习KVM虚拟化技术,不仅需要理解虚拟化的基本概念,还要掌握Linux操作系统、网络和存储等相关知识,同时熟悉QEMU、libvirt等工具的使用。通过实战演练,可以深入理解KVM的工作原理,提升运维和管理虚拟化环境的能力...

    kvm虚拟化环境安装配置

    kvm是一种开源的虚拟化解决方案,可以在物理服务器上运行多个虚拟机,而libvirt是kvm的管理工具,提供了虚拟机的生命周期管理、虚拟机监控和虚拟机迁移等功能。 在安装kvm和libvirt之前,需要安装一些必要的依赖包...

    基于云计算的多平台虚拟化集成管理系统.pdf

    标题《基于云计算的多平台虚拟化集成管理系统》指出,本文讨论的是一套集成管理系统,它将云计算与多平台虚拟化技术相结合,形成一个高效的计算环境。云计算是一种通过互联网提供动态可伸缩的虚拟化资源的服务模式。...

    轻量虚拟化技术-- docker实战分享

    ### 轻量虚拟化技术——Docker实战分享 #### 一、轻量虚拟化技术概述 ##### 什么是轻量虚拟化技术? 轻量虚拟化技术是指一种在操作系统级别实现虚拟化的技术,它允许在单一操作系统实例上运行多个隔离的应用程序...

    Virt-manager虚拟化技术介绍.pdf

    Virt-manager虚拟化技术介绍 Virt-manager是虚拟机管理器(Virtual Machine Manger)的缩写,也是该管理工具的软件包名称。它是一个用于管理虚拟机的图形化桌面用户接口,目前仅支持在Linux或其他类Unix系统中运行...

    云计算中虚拟机动态迁移的研究

    预测性迁移基于资源预测模型,提前迁移可能面临资源瓶颈的虚拟机;负载均衡迁移则根据整个集群的资源使用情况,调整虚拟机分布,确保整体资源利用率;故障预测迁移则结合监控数据,预测可能的硬件故障,提前迁移...

    Python库 | libvirt_vmcfg-0.0.3-py2.py3-none-any.whl

    `libvirt_vmcfg`是一个针对Python的库,主要用于处理与虚拟化管理相关的配置任务。它允许开发者通过Python接口与libvirt库进行交互,从而实现对虚拟机的配置和管理。`libvirt`本身是一个开源的API,支持多种虚拟化...

Global site tag (gtag.js) - Google Analytics