11.4. 使用命令行迁移虚拟机


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

您可以执行 实时迁移离线迁移。有关这两种情况之间的区别,请参阅如何迁移虚拟机

先决条件

Hypervisor
源主机和目标主机都使用 KVM 管理程序。
网络连接
源主机和目标主机可以通过网络相互访问。使用 ping 工具进行验证。
开放端口

确保已在目标主机上开放了以下端口:

  • 使用 SSH 连接到目标主机所需的端口 22。
  • 使用 TLS 连接到目标主机需要端口 16514。
  • 使用 TCP 连接到目标主机需要端口 16509。
  • QEMU 需要端口 49152-49215 ,来传输内存和磁盘迁移数据。
主机
对于红帽支持的迁移,源主机和目标主机必须使用特定的操作系统和机器类型。要确保情况是这种情况,请查看支持的虚拟机迁移主机
CPU
虚拟机必须与目标主机的 CPU 功能兼容。要确保情况如此,请参阅验证虚拟机迁移的主机 CPU 兼容性
存储

要迁移的虚拟机磁盘镜像可以被源主机和目标主机访问。这在离线迁移中是可选的,但在迁移运行的虚拟机时是必需的。要确保存储可被两个主机访问,必须应用以下内容之一:

  • 您正在使用存储区域网络(SAN)逻辑单元(LUN)。
  • 正在您使用 Ceph 存储集群
  • 您已创建了 与源虚拟机磁盘相同的格式和大小的磁盘镜像。请注意,此方法需要在迁移虚拟机时使用 --copy-storage-all 参数。
  • 磁盘镜像在单独的网络位置上。有关设置这样的共享虚拟机存储的步骤,请参阅与其他主机共享虚拟机磁盘镜像
网络带宽

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

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

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

    # 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/s 或 less 的网络中尝试实时迁移这样的虚拟机会导致实时迁移不会进行。

    为确保实时迁移成功完成,您的网络带宽必须显著大于虚拟机的脏页面生成率。

    注意

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

网桥 tap 网络的具体信息
当迁移公共网桥中现有虚拟机时,源和目标主机必须位于同一网络中。否则,迁移后 VM 网络将无法正常工作。
连接协议

在执行虚拟机迁移时,源主机上的 virsh 客户端可以使用多种协议之一连接到目标主机上的 libvirt 守护进程。以下流程中的示例使用 SSH 连接,但您可以选择不同的连接。

  • 如果您希望 libvirt 使用 SSH 连接,请确保启用 virtqemud 套接字并在目标主机上运行。

    # systemctl enable --now virtqemud.socket
  • 如果您希望 libvirt 使用 TLS 连接,请确保启用 virtproxyd-tls 套接字并在目标主机上运行。

    # systemctl enable --now virtproxyd-tls.socket
  • 如果您希望 libvirt 使用 TCP 连接,请确保 virtproxyd-tcp 套接字已经启用并在目标主机上运行。

    # systemctl enable --now virtproxyd-tcp.socket

流程

  • 离线迁移

    • 要迁移关闭虚拟机,请使用 virsh migrate --offline 命令。以下示例使用 SSH 隧道将关闭的 example-VM 虚拟机从本地主机迁移到 example-destination 主机的系统连接。

      # virsh migrate \
         --offline --persistent <example_VM> \
         qemu+ssh://example-destination/system
  • Live migration(实时迁移)

    1. 要迁移正在运行的虚拟机,请使用 virsh migrate --live 命令。以下示例使用 SSH 隧道将实时 example-VM 虚拟机从本地主机迁移到 example-destination 主机的系统连接。

      # virsh migrate \
         --live --persistent <example_VM> \
         qemu+ssh://example-destination/system
    2. 等待迁移完成。这个过程可能需要一些时间,具体取决于网络带宽、系统负载和虚拟机的大小。如果 virsh migrate 没有使用- verbose 选项,命令行不会显示任何进度指示符,除了错误外。

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

  • Multi-FD 实时迁移

    • 您可以在实时迁移过程中使用到目标主机的多个并行连接。这也被称为多个文件描述符(Multi-FD)迁移。使用多 FD 迁移时,您可以使用所有可用网络带宽来加快迁移。

      # virsh migrate \
         --live --persistent \
         --parallel --parallel-connections 4 \
         <example_VM> qemu+ssh://<example-destination>/system

      这个示例使用 4 个 Multi-FD 通道来迁移 <example_VM>虚拟机。最好为每个 10 Gbps 可用网络带宽使用一个通道。默认值为 2 个通道。

  • 具有增加的停机时间限制的实时迁移,

    • 要提高实时迁移的可靠性,您可以设置 maxdowntime 参数,该参数指定实时迁移期间虚拟机可暂停的最大时间(以毫秒为单位)。设置更大的停机时间有助于确保迁移成功完成。

      # virsh migrate-setmaxdowntime \
         <example_VM> \
         <time_interval_in_milliseconds>
  • 使用免密码 SSH 身份验证进行实时迁移

    • 为了避免在迁移过程中输入远程主机的 SSH 密码,您可以指定一个私钥文件供迁移使用。这可用于自动迁移脚本或对等迁移。

      # virsh migrate \
         --live --persistent <example_VM> \
         qemu+ssh://<example-destination>/system?keyfile=<path_to_key>
  • 复制后迁移

    • 如果您的虚拟机内存占用较大,您可以执行一个 复制后 迁移,首先传输源虚拟机的 CPU 状态,并立即在目标主机上启动迁移的虚拟机。源虚拟机的内存页在迁移的虚拟机在目标主机上运行后传输。因此,复制后 迁移可能导致迁移虚拟机的较少的停机时间。

      但是,目标主机上运行的虚拟机可能尝试访问尚未传输的内存页,这导致 page fault。如果迁移过程中发生太多 page faults,则迁移的虚拟机的性能可能会严重降级。

      由于 复制后 迁移的潜在复杂情况,在大多数用例中使用以下命令:这使用标准实时迁移,并在指定时间内无法切换到复制后迁移。

      # virsh migrate \
         --live --persistent --postcopy \
         --timeout <time_interval_in_seconds> \
         --timeout-postcopy <example_VM> \
         qemu+ssh://<example-destination>/system

      在 RHEL 10.1 及更高版本中,您还可以使用以 multifd pre-copy 阶段开头的迁移来实时迁移内存密集型虚拟机,然后切换到复制后迁移。这提供更好的迁移性能和灵活性。

      # virsh migrate \
         --live --persistent --parallel \
         --postcopy --postcopy-after-precopy \
         <example_VM> \
         qemu+ssh://<example-destination>/system
  • 自动融合的实时迁移

    • 如果您的虚拟机处于很重的内存工作负载之下,您可以使用 -auto-converge 选项。这个选项会自动减慢虚拟机 CPU 的执行速度。因此,这个 CPU 节流有助于减慢内存写,这意味着对于即使有大量内存工作负载的虚拟机,实时迁移也会成功。

      但是,CPU 节流对于解决内存写与 CPU 执行速度没有直接关系的工作负载没有帮助,这可能会在实时迁移过程中对虚拟机的性能造成负面影响。

      # virsh migrate \
         --live --persistent --auto-converge \
         <example_VM> qemu+ssh://<example-destination>/system

验证

  • 对于 离线 迁移:

    • 在目标主机上,列出可用的虚拟机,以验证虚拟机是否成功迁移。

      # virsh list --all
      Id      Name             State
      ----------------------------------
      10    example-VM-1      shut off
  • 对于 实时 迁移:

    • 在目标主机上,列出可用的虚拟机,以验证目标虚拟机的状态:

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

      如果虚拟机的状态被列为 running,这表示迁移完成。但是,如果实时迁移仍在进行中,目标虚拟机的状态将列为 paused

  • 对于 复制后 迁移:

    1. 在源主机上,列出可用的虚拟机,以验证源虚拟机的状态。

      # virsh list --all
      Id      Name             State
      ----------------------------------
      10    example-VM-1      shut off
    2. 在目标主机上,列出可用的虚拟机,以验证目标虚拟机的状态。

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

      如果源虚拟机的状态被列为 shut off,并且目标虚拟机的状态被列为 running,这表示迁移完成。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部