Red Hat Training

A Red Hat training course is available for RHEL 8

第 9 章 迁移虚拟机

如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。

9.1. 迁移虚拟机的工作方式

虚拟机迁移的基本部分是将虚拟机的 XML 配置复制到不同的主机机器中。如果没有关闭迁移的虚拟机,迁移还会将虚拟机内存和任何虚拟设备的状态传送到目标主机机器中。要使虚拟机在目标主机上正常工作,虚拟机的磁盘镜像必须仍可用。

默认情况下,迁移的虚拟机在目标主机上是临时的,虚拟机在源主机上仍然被定义。

您可以使用 实时非实时迁移对运行的虚拟机进行迁移。要迁移关闭虚拟机,必须使用离线迁移。详情请查看下表。

表 9.1. VM 迁移类型

迁移类型描述使用案例存储要求

实时迁移

VM 将继续在源主机中运行,而 KVM 会将虚拟机的内存页面传送到目标主机。当迁移接近完成后,KVM 会非常简单地挂起虚拟机,并在目标主机上恢复它。

对于需要一直保持运行的虚拟机,这个方法非常有用。但是,如果虚拟机修改内存页面的速度比 KVM 可以传输它们的速度更快,比如 I/O 负载较重的虚拟机,则不能进行实时迁移,这需要使用非实时迁移

VM 的磁盘镜像必须位于 共享网络中,同时可访问源主机和目标主机。

非实时迁移

挂起虚拟机,将其配置及其内存复制到目标主机,并恢复虚拟机。

这个迁移方式需要虚拟机停机,但通常比实时迁移更可靠。建议有高 I/O 负载的虚拟机使用这个方法。

VM 的磁盘镜像必须位于 共享网络中,同时可访问源主机和目标主机。

离线迁移

将虚拟机的配置移到目标主机

建议关闭虚拟机。

VM 的磁盘镜像不必在共享网络中可用,并可手动复制或移动到目标主机。

其它资源

9.2. 迁移虚拟机的好处

迁移虚拟机对以下情况非常有用:

负载均衡
如果主机超载或者另一台主机使用不足,则可将虚拟机移动到使用率较低的主机中。
硬件独立
当您需要升级、添加或删除主机中的硬件设备时,您可以安全地将虚拟机重新定位到其他主机。这意味着,在改进硬件时虚拟机不需要停机。
节能
虚拟机可重新分发到其他主机,因此可关闭未载入的主机系统以便在低用量时节约能源并降低成本。
地理迁移
可将虚拟机移动到另一个物理位置,以减少延迟,或者因为其他原因需要。

9.3. 迁移虚拟机的限制

在 RHEL 8 中迁移虚拟机前,请确定您了解迁移的限制。

  • 无法在 RHEL 8 中执行实时存储迁移,但您可以在虚拟机关闭时迁移存储。请注意,在 Red Hat Virtualization 上提供了实时存储迁移功能。
  • 将虚拟机迁移(或从) libvirt 的用户会话是不可靠的,因此不推荐。
  • 使用以下功能和配置的虚拟机在迁移时将无法正常工作,或者迁移失败。这些特性包括:

    • 设备透传
    • SR-IOV 设备分配
    • 介质设备,如 vGPU
    • 使用 NUMA 固定功能

9.4. 将虚拟机磁盘镜像与其他主机共享

要在 支持的 KVM 主机 间执行虚拟机实时迁移,需要共享虚拟机存储。本节提供将本地存储的虚拟机镜像与源主机以及使用 NFS 协议的目标主机共享的信息。

先决条件

  • 旨在迁移的虚拟机被关闭。
  • 可选: 一个主机系统可用于托管不是源或目标主机的存储,但源和目标主机都可以通过网络访问它。这是共享存储的最佳解决方案,红帽推荐使用它。
  • 请确定 NFS 文件锁定没有被使用,因为在 KVM 中不支持它。
  • 在源主机和目标主机上安装并启用 NFS。如果没有:

    1. 安装 NFS 软件包:

      # yum install nfs-utils
    2. 请确保在防火墙中打开了 iptables 中的 NFS 端口(比如 2049)。

      # firewall-cmd --permanent --add-service=nfs
      # firewall-cmd --permanent --add-service=mountd
      # firewall-cmd --permanent --add-service=rpc-bind
      # firewall-cmd --permanent --add-port=2049/tcp
      # firewall-cmd --permanent --add-port=2049/udp
      # firewall-cmd --reload
    3. 启动 NFS 服务。

      # systemctl start nfs-server

流程

  1. 连接到提供共享存储的主机。在本例中,它是 cargo-bay 主机:

    # ssh root@cargo-bay
    root@cargo-bay's password:
    Last login: Mon Sep 24 12:05:36 2019
    root~#
  2. 创建存放磁盘镜像的目录,并将与迁移主机共享。

    # mkdir /var/lib/libvirt/shared-images
  3. 将虚拟机的磁盘镜像从源主机复制到新创建的目录。例如,以下命令将 wanderer1 虚拟机的磁盘镜像复制到 'cargo-bay' 主机上的 /var/lib/libvirt/shared-images/ 目录中:

    # scp /var/lib/libvirt/images/wanderer1.qcow2 root@cargo-bay:/var/lib/libvirt/shared-images/wanderer1.qcow2
  4. 在您要用于共享存储的主机上,将共享目录添加到 /etc/exports 文件中。以下示例中,source-exampledest-example 主机共享 /var/lib/libvirt/shared-images 目录:

    /var/lib/libvirt/shared-images source-example(rw,no_root_squash) dest-example(rw,no_root_squash)
  5. 在源和目标主机上,将共享目录挂载到 /var/lib/libvirt/images 目录中:

    # mount cargo-bay:/var/lib/libvirt/shared-images /var/lib/libvirt/images

验证

  • 要验证进程是否成功,在源主机上启动虚拟机并观察它是否正确引导。

其它资源

  • 有关配置 NFS、打开 IP 表和配置防火墙的详情,请参考 导出 NFS 共享

9.5. 使用命令行界面迁移虚拟机

如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。本节介绍了各种迁移情境的信息和示例。

先决条件

  • 源主机和目标主机都使用 KVM 管理程序。
  • 源主机和目标主机可以通过网络相互访问。使用 ping 实用程序验证这一点。
  • 要让红帽支持迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确定这种情况,请查看 VM 迁移兼容性表
  • 红帽建议将虚拟机的磁盘镜像迁移到源主机和目标主机都可以访问的独立联网位置中。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。

    有关设置这样的共享虚拟机存储的步骤,请参阅 第 9.4 节 “将虚拟机磁盘镜像与其他主机共享”

  • 当迁移公共网桥中现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将不会操作。

流程

  1. 确保启用并运行 libvirtd 服务。

    # systemctl enable libvirtd.service
    # systemctl restart libvirtd.service
  2. 使用带有适合您的迁移要求的 virsh migrate 命令。

    • 下面将 wanderer1 虚拟机从本地主机迁移到 dest-example 主机的系统会话。虚拟机将在迁移过程中继续运行。

      # virsh migrate --persistent --live wanderer1 qemu+ssh://dest-example/system
    • 以下操作可让您手动调整本地主机上运行的 wanderer2 虚拟机的配置,然后将该虚拟机迁移到 dest-example 主机。迁移的虚拟机将自动使用更新的配置。

      # virsh dumpxml --migratable wanderer2 >wanderer2.xml
      # vi wanderer2.xml
      # virsh migrate --live --persistent --xml wanderer2.xml wanderer2 qemu+ssh://dest-example/system

      当目标主机需要使用不同路径访问共享虚拟机存储或配置特定于目标主机的功能时,这个过程很有用。

    • 以下命令会从 source-example 主机挂起 wanderer3 虚拟机,将其迁移到 dest-example 主机,并指示它使用 wanderer3-alt.xml 文件提供的经过调整的 XML 配置。迁移完成后,libvirt 会在目标主机上恢复虚拟机。

      # virsh migrate wanderer3 qemu+ssh://source-example/system qemu+ssh://dest-example/system --xml wanderer3-alt.xml

      迁移后,虚拟机在源主机上保持挂起状态,并在关闭后删除迁移的副本。

    • 下面从 wanderer4 主机中删除已关闭的 source-example 虚拟机,并将其配置移到 dest-example 主机。

      # virsh migrate --offline --persistent --undefinesource wanderer4 qemu+ssh://source-example/system qemu+ssh://dest-example/system

      请注意,这种类型的迁移不需要将虚拟机的磁盘镜像移到共享存储中。但是,要使虚拟机在目标主机上可用,您需要迁移虚拟机的磁盘镜像。例如:

      # scp root@source-example:/var/lib/libvirt/images/wanderer4.qcow2 root@dest-example:/var/lib/libvirt/images/wanderer4.qcow2
  3. 等待迁移完成。这个过程可能需要一些时间,具体要看网络带宽、系统负载和虚拟机的大小。如果 virsh migrate 没有使用 --verbose 选项,CLI 不会显示任何进度指示符,除了错误外。

    当迁移进行时,您可以使用 virsh domjobinfo 工具显示迁移统计。

验证

  • 在目标主机上,列出可用虚拟机以验证虚拟机是否已迁移:

    # virsh list
    Id Name                 State
    ----------------------------------
    10 wanderer1              running

    请注意,如果迁移仍然在运行,这个命令会列出虚拟机状态为 paused

故障排除

  • 在某些情况下,目标主机与迁移虚拟机 XML 配置的某些值不兼容,比如网络名称或 CPU 类型。因此,虚拟机将无法在目标主机上引导。要修复这些问题,您可以使用 virsh edit 命令更新有问题的值。
  • 如果实时迁移需要很长时间才能完成,这可能是因为虚拟机负载很重,且有太多的内存页面改变使得实时迁移不可能实现。要解决这个问题,请挂起虚拟机,将迁移改为非实时迁移。

    # virsh suspend wanderer1

其它资源

  • 有关虚拟机迁移的进一步选项和示例,请使用 virsh migrate --help 或者 virsh man page。

9.6. 虚拟机迁移支持的主机

要使虚拟机迁移正常工作并获得红帽支持,源和目标主机必须是特定的 RHEL 版本和机器类型。下表显示了支持的虚拟机迁移路径。

表 9.2. 实时迁移兼容性

迁移方法发行类型示例支持状态

向前

主发行版本

7.6+ → 8.1

在支持的 RHEL 7 系统上: 机器类型 i440fxq35

向后

主发行版本

8.1 → 7.6+

在支持的 RHEL 8 系统上: 机器类型 i440fxq35

向前

次发行版本

8.0.1+ → 8.1+

在支持的 RHEL 7 系统上: RHEL 7.6.0 及之后的版本中的机器类型 i440q35

在支持的 RHEL 8 系统上: 机器类型 q35

向后

次发行版本

8.1 → 8.0.1

在支持的 RHEL 7 系统中。完全支持机器类型 i440fxq35

在支持的 RHEL 8 系统上: 机器类型 q35

其它资源

  • 有关当前支持的 RHEL 7 和 RHEL 8 版本的详情,请查看红帽知识库

9.7. 其它资源

  • 您还可以将虚拟机从非 KVM 管理程序迁移到 RHEL 7 或 RHEL 8 主机上。这也被称为 V2V conversion,您可以在红帽知识库中找到附加信息和说明。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。