Libvirt 迁移标志详解

可参考:https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateFlags

在虚拟化环境中,迁移是一项重要的功能,Libvirt 提供了一系列标志,用于控制迁移过程中的不同行为。以下是 virDomainMigrateFlags 枚举的详细解释:

  1. VIR_MIGRATE_LIVE (1):

    • 含义: 在迁移过程中不挂起域,且包含虚拟机的内存状态。如果域内存变化速度比传输速度快,那么迁移将无法收敛。迁移过程中随时可以通过 virDomainSuspend 手动暂停域。对应 virsh 中的 --live 参数。
  2. VIR_MIGRATE_PEER2PEER (2):

    • 含义: 告诉源 libvirtd 直接连接目标主机。如果没有此标志,客户端(如 virsh)将连接到两个主机并控制迁移过程。在点对点模式下,源 libvirtd 通过直接调用目标主机的 libvirtd 来控制迁移过程。对应 virsh 中的 --p2p 参数。
  3. VIR_MIGRATE_TUNNELLED (4):

    • 含义: 通过 libvirtd 连接隧道迁移数据。如果没有此标志,源 hypervisor 直接将迁移数据发送到目标 hypervisor。此标志仅在设置 VIR_MIGRATE_PEER2PEER 时使用。对应 virsh 中的 --tunnelled 参数。
  4. VIR_MIGRATE_PERSIST_DEST (8):

    • 含义: 在成功迁移后,将域定义为在目标主机永久存在。如果域在源主机上持久化,并且未使用 VIR_MIGRATE_UNDEFINE_SOURCE,则该域将在两个主机上存在。对应 virsh 中的 --persistent 参数。
  5. VIR_MIGRATE_UNDEFINE_SOURCE (16):

    • 含义: 在成功迁移后,在源主机取消定义域。对应 virsh 中的 --undefinesource 参数。
  6. VIR_MIGRATE_PAUSED (32):

    • 含义: 使域在目标主机上保持挂起状态。必须显式使用 virDomainResume(在迁移 API 返回的 virDomainPtr 上)才能恢复域运行。对应 virsh 的 --suspend 参数。
  7. VIR_MIGRATE_NON_SHARED_DISK (64):

    • 含义: 除了域的内存外,还可以迁移完整的磁盘镜像。默认情况下,仅迁移非共享、非只读的磁盘镜像。VIR_MIGRATE_PARAM_MIGRATE_DISKS 参数可以指定要迁移的磁盘。此标志与 VIR_MIGRATE_NON_SHARED_INC 互斥。对应 virsh 的 --copy-storage-all 参数。
  8. VIR_MIGRATE_NON_SHARED_INC (128):

    • 含义: 除迁移域内存外,还要迁移磁盘镜像。该标志与 VIR_MIGRATE_NON_SHARED_DISK 类似,但仅复制每个磁盘链的顶层。也就是说,磁盘链的其余部分都应该默认存在于目标主机上,且与源主机完全相同。此标志与 VIR_MIGRATE_NON_SHARED_DISK 互斥。对应 virsh 的 --copy-storage-inc 参数。
  9. VIR_MIGRATE_CHANGE_PROTECTION (256):

    • 含义: 禁止在迁移过程中更改域配置。当双方都支持时,会自动使用此标志。如果有一方不支持,显示设置此标志会导致迁移失败。对应 virsh 的 --change-protection 参数。
  10. VIR_MIGRATE_UNSAFE (512):

    • 含义: 即使它被判定为不安全的,仍强制进行迁移。在某些情况下,libvirt 可能会拒绝迁移域,因为这样做可能会导致数据损坏等

潜在问题,因此迁移会被认为是不安全的。对于 QEMU 域,如果该域使用磁盘,且未将缓存模式显示设置为 "none",则可能会发生这种情况。迁移这些域是不安全的,除非磁盘镜像存储在一致的集群文件系统上,例如 GFS2 或 GPFS。对应 virsh 的 --unsafe 参数。

  1. VIR_MIGRATE_OFFLINE (1024):

    • 含义: 仅迁移域定义,而不用在目标主机上启动域,也不会在源主机上停止域。offline 迁移需要设置 VIR_MIGRATE_PERSIST_DEST。offline 迁移不能复制磁盘存储和其他基于文件的存储(如 UEFI 变量)。对应 virsh 的 --offline 参数。
  2. VIR_MIGRATE_COMPRESSED (2048):

    • 含义: 压缩迁移数据。可以使用 VIR_MIGRATE_PARAM_COMPRESSION 指定压缩方式。如果省略该参数,则使用 hypervisor 的默认方法。压缩方法可以通过特定的 VIR_MIGRATE_PARAM_COMPRESSION_* 参数进行调节。对应 virsh 的 --compressed 参数。
  3. VIR_MIGRATE_ABORT_ON_ERROR (4096):

    • 含义: 当迁移时发生软错误(例如 IO 错误),取消迁移。对应 virsh 的 --abort-on-error 参数。
  4. VIR_MIGRATE_AUTO_CONVERGE (8192):

    • 含义: 启用确保实时迁移最终收敛的算法。这意味着将降低域的性能,以确保它内存更改的速度不会超过传输的速度。VIR_MIGRATE_PARAM_AUTO_CONVERGE_* 参数可调整该算法。对应 virsh 的 --auto-converge 参数。
  5. VIR_MIGRATE_RDMA_PIN_ALL (16384):

    • 含义: 此标志可用于 RDMA 迁移(即当 VIR_MIGRATE_PARAM_URI 参数以 "rdma://" 开始),从而让 hypervisor 在迁移开始之前一次性固定域的所有内存,而不是根据需要固定内存页。这对于 QEMU/KVM 需要使用 hard_limit 内存调整元素(在域 XML 中),并将其设置为域配置的最大内存加上 QEMU 本身消耗的任何内存。不能把内存限制设置的太高,以免主机内核耗尽内存。对应 virsh 的 --rdma-pin-all 参数。
  6. VIR_MIGRATE_POSTCOPY (32768):

    • 含义: 设置 VIR_MIGRATE_POSTCOPY 标志,libvirt 会启用后复制迁移模式。然而,迁移会正常开始,需要调用 virDomainMigrateStartPostCopy 来切换到后复制模式。详情请参阅 virDomainMigrateStartPostCopy。对应 virsh 的 --postcopy 参数。
  7. VIR_MIGRATE_TLS (65536):

    • 含义: 设置 VIR_MIGRATE_TLS 标志,将尝试使用 hypervisor 配置的 TLS 来进行迁移。如果在源或目标上配置不正确,迁移将失败。对应 virsh 的 --tls 参数。
  8. VIR_MIGRATE_PARALLEL (131072):

    • 含义: 通过多个网络连接传输内存页。可以使用 VIR_MIGRATE_PARAM_PARALLEL_* 来设置并行迁移功能。对应 virsh 的 --parallel 参数。
java 复制代码
```java
// Java中模拟的Libvirt迁移标志位(根据官方文档)

private static final long VIR_MIGRATE_LIVE = 1L << 0; // 1 - 不暂停域迁移期间。在域运行时将其内存传输到目标主机。如果域更改内存的速度快于传输速度,则迁移可能无法收敛。在迁移过程中任何时候都可以通过virDomainSuspend手动暂停域。

private static final long VIR_MIGRATE_PEER2PEER = 1L << 1; // 2 - 指示源libvirtd直接连接到目标主机。如果不设置此标志,客户端(如virsh)将同时连接到两个主机并控制迁移过程。在点对点模式下,源libvirtd通过直接调用目标守护进程来控制迁移。

private static final long VIR_MIGRATE_TUNNELLED = 1L << 2; // 4 - 通过libvirtd连接隧道迁移数据。如果不设置此标志,源虚拟机管理程序将直接向目标虚拟机管理程序发送迁移数据。此标志只能与VIR_MIGRATE_PEER2PEER一起使用。

private static final long VIR_MIGRATE_PERSIST_DEST = 1L << 3; // 8 - 成功迁移后在目标主机上定义域为持久化。如果域在源主机上是持久化的,并且未使用VIR_MIGRATE_UNDEFINE_SOURCE,它将在两个主机上都变为持久化。

private static final long VIR_MIGRATE_UNDEFINE_SOURCE = 1L << 4; // 16 - 迁移成功完成后从源主机上删除域定义。

private static final long VIR_MIGRATE_PAUSED = 1L << 5; // 32 - 将域在目标主机上保持暂停状态。需要显式调用virDomainResume(由迁移API返回的virDomainPtr)来恢复域的虚拟CPU。

private static final long VIR_MIGRATE_NON_SHARED_DISK = 1L << 6; // 64 - 除了域的内存外,还迁移完整的磁盘映像。默认情况下,仅迁移非共享的非只读磁盘映像。可以使用VIR_MIGRATE_PARAM_MIGRATE_DISKS参数指定应迁移哪些磁盘。此标志与VIR_MIGRATE_NON_SHARED_INC互斥。

private static final long VIR_MIGRATE_NON_SHARED_INC = 1L << 7; // 128 - 除了域的内存外,还迁移磁盘映像。这类似于VIR_MIGRATE_NON_SHARED_DISK,但仅复制每个磁盘备份链的顶层。即,期望备份链的其余部分在目标主机上存在,并且与源主机上的完全相同。此标志与VIR_MIGRATE_NON_SHARED_DISK互斥。

private static final long VIR_MIGRATE_CHANGE_PROTECTION = 1L << 8; // 256 - 在迁移过程中保护域配置不受更改。当双方都支持时,会自动使用此标志。显式设置此标志将导致如果源主机或目标主机不支持它,则迁移失败。

private static final long VIR_MIGRATE_UNSAFE = 1L << 9; // 512 - 强制迁移,即使被认为是不安全的。在某些情况下,libvirt可能会拒绝迁移域,因为这样做可能导致潜在问题,例如数据损坏,因此迁移被认为是不安全的。

private static final long VIR_MIGRATE_OFFLINE = 1L << 10; // 1024 - 迁移域定义而不启动目标主机上的域,也不停止源主机上的域。离线迁移需要设置VIR_MIGRATE_PERSIST_DEST。

private static final long VIR_MIGRATE_COMPRESSED = 1L << 11; // 2048 - 压缩迁移数据。可以使用VIR_MIGRATE_PARAM_COMPRESSION参数指定压缩方法。如果省略此参数,则将使用虚拟机管理程序的默认方法。可以通过它们特定的VIR_MIGRATE_PARAM_COMPRESSION_*参数调整各个压缩方法。

private static final long VIR_MIGRATE_ABORT_ON_ERROR = 1L << 12; // 4096 - 如果在迁移过程中发生软错误(如I/O错误),则取消迁移。

private static final long VIR_MIGRATE_AUTO_CONVERGE = 1L << 13; // 8192 - 启用确保实时迁移最终收敛的算法。这通常意味着会减慢域的速度以确保其更改内存的速度不会超过虚拟机管理程序将其更改内存传输到目标主机的速度。

private static final long VIR_MIGRATE_RDMA_PIN_ALL = 1L << 14; // 16384 - 当与RDMA迁移一起使用时(即,当VIR_MIGRATE_PARAM_URI以"rdma://"开头时),此标志告诉虚拟机管理程序在迁移开始之前一次性固定所有域的内存,而不是按需固定内存页。

private static final long VIR_MIGRATE_POSTCOPY = 1L << 15; // 32768 - 设置VIR_MIGRATE_POSTCOPY标志告诉libvirt启用后复制迁移。但是,迁移将以正常方式开始,并需要调用virDomainMigrateStartPostCopy将其切换到后复制模式。

private static final long VIR_MIGRATE_TLS = 1L << 16; // 65536 - 设置VIR_MIGRATE_TLS标志会导致迁移尝试使用虚拟机管理程序配置的TLS环境执行迁移。如果源主机或目标主机配置不正确,则迁移将会失败。

private static final long VIR_MIGRATE_PARALLEL = 1L << 17; // 131072 - 通过几个网络连接将内存页发送到目标主机。参见VIR_MIGRATE_PARAM_PARALLEL_*参数以配置并行迁移。

private static final long VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES = 1L << 18; // 262144 - 强制在复制非共享存储迁移时发生的来宾写入同步写入目标。这确保了对于在快速本地存储上进行大量I/O并且镜像较慢的VM,存储迁移能够收敛。

private static final long VIR_MIGRATE_POSTCOPY_RESUME = 1L << 19; // 524288 - 恢复在后复制阶段失败的迁移。

private static final long VIR_MIGRATE_ZEROCOPY = 1L << 20; // 1048576 - 使用零拷贝机制迁移内存页。对于QEMU/KVM,这意味着QEMU将暂时被允许锁定主机的所有客户机页面,尽管只有排队等待传输的页面才会被锁定。
复制代码
相关推荐
everyStudy25 分钟前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
luthane27 分钟前
python 实现average mean平均数算法
开发语言·python·算法
凡人的AI工具箱1 小时前
AI教你学Python 第11天 : 局部变量与全局变量
开发语言·人工智能·后端·python
sleP4o1 小时前
Python操作MySQL
开发语言·python·mysql
是店小二呀1 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
洛寒瑜1 小时前
【读书笔记-《30天自制操作系统》-23】Day24
开发语言·汇编·笔记·操作系统·应用程序
ephemerals__1 小时前
【c++】动态内存管理
开发语言·c++
咩咩觉主1 小时前
en造数据结构与算法C# 群组行为优化 和 头鸟控制
开发语言·c#
CVer儿1 小时前
条件编译代码记录
开发语言·c++
凌不了云1 小时前
windows环境下安装python第三方包
开发语言·python