虚拟机迁移原理

本文介绍虚拟机到虚拟机(V2V)在线迁移技术,包括实时迁移的过程及应用场景,详细解析KVM预拷贝在线迁移的具体步骤,以及如何减少停机时间和提高迁移效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原网址

虚拟机到虚拟机的迁移(Virtual-to-Virtual)
V2V 迁移是在虚拟机之间移动操作系统和数据,照顾主机级别的差异和处理不同的虚拟硬件。虚拟机从一个物理机上的 VMM 迁移到另一个物理机的 VMM,这两个 VMM 的类型可以相同,也可以不同。如 VMware 迁移到 KVM, KVM 迁移到 KVM。可以通过多种方式将虚拟机从一个 VM Host 系统移动到另一个 VM Host 系统。
V2V 在线迁移
在线迁移(online migration):又称为实时迁移 (live migration)。是指在保证虚拟机上服务正常运行的同时,虚拟机在不同的物理主机之间进行迁移,其逻辑步骤与离线迁移几乎完全一致。不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机运行,当迁移进行到一定阶段,目的主机已经具备了运行系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,服务在目的主机上继续运行。对于服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。在线迁移适用于对服务可用性要求很高的场景。
目前主流的在线迁移工具,如 VMware 的 VMotion,XEN 的 xenMotion,都要求物理机之间采用 SAN(storage area network), NAS(network-attached storage)之类的集中式共享外存设备,因而在迁移时只需要考虑操作系统内存执行状态的迁移,从而获得较好的迁移性能。
另外,在某些没有使用共享存储的场合,可以使用存储块在线迁移技术来实现 V2V 的虚拟机在线迁移。相比较基于共享存储的在线迁移,数据块在线迁移的需要同时迁移虚拟机磁盘镜像和系统内存状态,迁移性能上打了折扣。但是他使得在采用分散式本地存储的环境下,仍然能够利用迁移技术转移计算机环境,并且保证迁移过程中操作系统服务的可用性,扩展了虚拟机在线迁移的应用范围。V2V 在线迁移技术消除了软硬件相关性,是进行软硬件系统升级,维护等管理操作的有力工具。
V2V 内存迁移技术
对于 VM 的内存状态的迁移,XEN 和 KVM 都采用了主流的的预拷贝(pre-copy)的策略。迁移开始之后,源主机 VM 仍在运行,目的主机 VM 尚未启动。迁移通过一个循环,将源主机 VM 的内存数据发送至目的主机 VM。循环第一轮发送所有内存页数据,接下来的每一轮循环发送上一轮预拷贝过程中被 VM 写过的脏页内存 dirty pages。直到时机成熟,预拷贝循环结束,进入停机拷贝阶段,源主机被挂起,不再有内存更新。最后一轮循环中的脏页被传输至目的主机 VM。预拷贝机制极大的减少了停机拷贝阶段需要传输的内存数据量,从而将停机时间大大缩小。
然而,对于更新速度非常快的内存部分,每次循环过程都会变脏,需要重复 pre-copy,同时也导致循环次数非常多,迁移的时间变长。针对这种情况,KVM 虚拟机建立了三个原则:集中原则,一个循环内的 dirty pages 小于等于 50;不扩散原则, 一个循环内传输的 dirty pages 少于新产生的;有限循环原则,循环次数必须少于 30。在实现上,就是采取了以下措施:
有限循环:循环次数和效果受到控制,对每轮 pre-copy 的效果进行计算,若 pre-copy 对于减少不一致内存数量的效果不显著,或者循环次数超过了上限,循环将中止,进入停机拷贝阶段。
在被迁移 VM 的内核设置一个内存访问的监控模块。在内存 pre-copy 过程中,VM 的一个进程在一个被调度运行的期间,被限制最多执行 40 次内存写操作。这个措施直接限制了 pre-copy 过程中内存变脏的速度,其代价是对 VM 上的进程运行进行了一定的限制。
KVM 的预拷贝在线迁移过程详解:
系统验证目标服务器的存储器和网络设置是否正确,并预保留目标服务器虚拟机的资源。
图 1. 源服务器和目标服务器简图


当虚拟机还在源服务器上运转时,第一个循环内将全部内存镜像复制到目标服务器上。在这个过程中,KVM 依然会监视内存的任何变化。
图 2. 内存镜像复制示意图


以后的循环中,检查上一个循环中内存是否发生了变化。 假如发生了变化,那么 VMM 会将发生变化的内存页即 dirty pages 重新复制到目标服务器中,并覆盖掉先前的内存页。在这个阶段,VMM 依然会继续监视内存的变化情况。
图 3. 进行有变化的内存复制


VMM 会持续这样的内存复制循环。随着循环次数的增加,所需要复制的 dirty pages 就会明显减少,而复制所耗费的时间就会逐渐变短,那么内存就有可能没有足够的时间发生变化。最后,当源服务器与目标服务器之间的差异达到一定标准时,内存复制操作才会结束,同时暂停源系统。
图 4. 所需复制的数据在减少


在源系统和目标系统都停机的情况下,将最后一个循环的 dirty-pages 和源系统设备的工作状态复制到目标服务器。
图 5. 状态信息的复制


然后,将存储从源系统上解锁,并锁定在目标系统上。启动目标服务器,并与存储资源和网络资源相连接。
图 6. 停止源服务器,启动目标服务器




### 虚拟机迁移的工作原理及实现机制 虚拟机迁移是一种技术,允许在不中断服务的情况下将正在运行的虚拟机从一个物理主机迁移到另一个物理主机。这种迁移通常用于负载均衡、硬件维护以及优化资源利用率等场景。 #### 1. 基本概念 热迁移的核心在于确保虚拟机的状态在整个过程中得以保存并同步到目标主机。这包括但不限于虚拟机的内存状态、CPU寄存器信息以及其他运行时数据[^1]。为了支持这一过程,源主机和目标主机之间的网络连接必须具备足够的带宽以满足实时的数据传输需求,同时虚拟机的磁盘镜像需存储于共享存储之上或采用特定的技术保障一致性[^3]。 #### 2. 实现流程概述 以下是典型的虚拟机迁移的主要阶段: - **预复制 (Pre-copy)** 在此阶段,源主机上的虚拟机会继续正常运行,而其当前的内存页会被逐步复制到目标主机。由于在此期间可能会有新的脏页产生(即发生变化的页面),因此需要多次迭代完成整个内存空间的转移直到剩余未发送的脏页数量降到可接受范围内[^1]。 - **停止与最终拷贝 (Stop-and-Copy)** 当预复制完成后,会短暂暂停虚拟机执行以便进行最后一步操作——即将那些最新产生的少量脏页快速转移到新位置,并更新必要的元数据如 CPU 寄存器值等。这个动作非常迅速以至于用户体验几乎不受影响[^2]。 - **恢复运行** 完成上述步骤后,在目标机器上重新启动该实例即可恢复正常工作流。此时原节点上的旧副本则被销毁释放相应计算资源[^3]。 #### 3. 技术细节探讨 具体来说,不同平台可能有不同的实现方式和技术选型,但总体遵循类似的逻辑框架。例如 OpenStack 中 nova 组件负责管理 VM 生命周期事件,其中包括冷/热迁移功能;它利用 libvirt API 接口调用底层 KVM/QEMU 驱动程序来实际处理这些复杂的任务链路[^2]。 下面给出一段伪代码表示如何通过编程接口触发一次简单的KVM环境下的热迁移: ```python import libvirt def migrate_vm(domain_name, dest_uri): conn_src = libvirt.open("qemu:///system") # 打开源端连接 dom = conn_src.lookupByName(domain_name) conn_dest = libvirt.open(dest_uri) # 打开目的端连接 flags = libvirt.VIR_MIGRATE_LIVE | libvirt.VIR_MIGRATE_TUNNELLED dom.migrate(conn_dest, flags, None, None, 0) migrate_vm('test_vm', 'qemu+ssh://dest_host/system') ``` 以上脚本展示了怎样借助 Python-bindings 和 Libvirt 库发起跨节点间的安全隧道模式下活动态虚机搬迁命令。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值