Red Hat Training

A Red Hat training course is available for RHEL 8

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

如果虚拟机所在的当前主机变得不适合或者无法再使用,或者要重新分发托管工作负载,您可以将该虚拟机迁移到另一个 KVM 主机中。以下流程提供了对此类迁移的各种场景的说明和示例。

先决条件

  • 源主机和目标主机都使用 KVM 管理程序。
  • 源主机和目标主机可以通过网络相互访问。使用 ping 工具进行验证。
  • 确保目标主机上打开了以下端口:

    • 使用 SSH 连接到目标主机需要端口 22。
    • 使用 TLS 连接到目标主机需要端口 16509。
    • 使用 TCP 连接到目标主机需要端口 16514。
    • QEMU 需要端口 49152-49215 来传输内存和磁盘迁移数据。
  • 对于红帽支持的迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确保情况是这种情况,请查看 支持的虚拟机迁移主机
  • 虚拟机必须与目标主机的 CPU 功能兼容。要确保情况如此,请参阅验证虚拟机迁移的主机 CPU 兼容性
  • 要迁移的虚拟机的磁盘镜像位于源主机和目标主机都可访问的单独的网络位置。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。

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

  • 迁移正在运行的虚拟机时,您的网络带宽必须高于虚拟机生成脏内存页面的速度。

    要在开始实时迁移之前获取虚拟机的脏页面率,请执行以下操作:

    • 监控虚拟机在短时间内的脏页面生成率。

      # virsh domdirtyrate-calc example-VM 30
    • 在监控完成后,获取其结果:

      # virsh domstats example-VM --dirtyrate
      Domain: 'example-VM'
        dirtyrate.calc_status=2
        dirtyrate.calc_start_time=200942
        dirtyrate.calc_period=30
        dirtyrate.megabytes_per_second=2

      在本例中,VM 每秒会生成 2 MB 的脏内存页面。如果您不暂停虚拟机或降低其工作负载,那么在小于或等于 2 MB/秒带宽的网络中尝试实时迁移这样的虚拟机会导致实时迁移不会进行。

      为确保实时迁移成功完成,红帽建议您的网络带宽要明显大于虚拟机的脏页面生成率。

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

calc_period 选项的值可能因工作负载和脏页率而异。您可以使用多个 calc_period 值进行试验,以确定与您环境中脏页率一致的最合适的周期。

  • 确保 libvirtd 服务启用并在运行。

    # systemctl enable --now libvirtd.service

流程

  1. 使用 virsh migrate 命令,以及适合您迁移要求的选项。

    1. 以下命令使用 SSH 隧道将 example-VM-1 虚拟机从本地主机迁移到 example-destination 主机的系统连接。虚拟机在迁移过程中保持运行状态。

      # virsh migrate --persistent --live example-VM-1 qemu+ssh://example-destination/system
    2. 以下命令可让您手动调整运行在本地主机上的 example-VM-2 虚拟机的配置,然后将虚拟机迁移到 example-destination 主机。迁移的虚拟机将自动使用更新的配置。

      # virsh dumpxml --migratable example-VM-2 > example-VM-2.xml
      # vi example-VM-2.xml
      # virsh migrate --live --persistent --xml example-VM-2.xml example-VM-2 qemu+ssh://example-destination/system

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

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

      # virsh migrate example-VM-3 qemu+ssh://example-source/system qemu+ssh://example-destination/system --xml example-VM-3-alt.xml

      迁移后,虚拟机在源主机上处于关闭状态,并在关闭后删除迁移的副本。

    4. 以下从 example-source 主机中删除关闭的 example-VM-4 虚拟机,并将其配置移到 example-destination 主机。

      # virsh migrate --offline --persistent --undefinesource example-VM-4 qemu+ssh://example-source/system qemu+ssh://example-destination/system

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

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

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

验证

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

    # virsh list
    Id      Name             State
    ----------------------------------
    10    example-VM-1      running

    如果迁移仍在运行,这个命令会将虚拟机状态列为 paused

故障排除

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

    # virsh suspend example-VM-1

其它资源

  • virsh migrate --help 命令
  • virsh (1) 手册页