开源虚拟机迁移:从 VMware 和 OpenStack 到 RHOSO 18.0 或社区版 OpenStack。 让虚拟机保持运行。
几分钟内完成切换。
Seamless Migrate 将虚拟机从 RHOSP 17.1、OpenStack 和 VMware vSphere 迁移到 RHOSO 18.0 或社区版 OpenStack。 虚拟机照常提供服务的同时复制磁盘,仅在同步最终增量时停机。
Apache 2.0 演示无需云凭证
停机时间
同一台虚拟机,三种迁移方式。
一个 200 GiB 的卷,已用 120 GiB,客户机写入速率 2 MiB/s,通过 125 MiB/s 链路传输。控制平面的规划模型对各策略的停机时间估算如下:
冷迁移
cold20分53秒 停机时间
复制全部已用数据期间,虚拟机始终处于停机状态。
温迁移
warm11分20秒 停机时间
虚拟机照常提供服务期间执行 3 轮复制(31分32秒),仅在同步最终增量时停机。
存储移交
storage_handover4分20秒 停机时间
无需复制数据:在共享的 Ceph 或 NetApp ONTAP 上,由 Cinder 将每个卷移交给目标云。
支持平台
不同来源,目标由您定。
所有来源共用同一套计划、批次与审批模型。Seamless 通过各云平台的公共 API 与其交互,底层由 os-migrate Ansible 集合负责搬运数据。
coldwarmstorage_handover
coldwarmstorage_handover
vmware_coldvmware_warm
目标平台
RHOSO 18.0
Red Hat OpenStack Services on OpenShift,目标平台,发布版本的实验室验证尚未完成。Seamless 只使用其公共 OpenStack API,从不触碰 OpenShift 资源。
社区版 OpenStack
从 2023.1 Antelope 到 2026.2 Hibiscus 的每个版本系列,无论是用 Kolla-Ansible、OpenStack-Ansible 还是其他工具部署,都走同一条代码路径。提供者检查会报告其版本系列、支持层级和策略配置。
- 重建网络、子网、路由器和安全组
- 迁移实例类型、镜像、密钥对、项目和用户
- 按目标云的网络校验 MTU,包括 ML2/OVN 上的 Geneve
- 默认对每个端点校验 TLS
所有常见客户机操作系统
从 OpenStack 迁移时,KVM 客户机迁移到 KVM,因此能在源端启动的系统也能在目标云上启动:RHEL、CentOS、Rocky、AlmaLinux、Oracle Linux、Ubuntu、Debian、SLES 和 Windows。从 VMware 迁移时,由 RHEL 9 转换主机上的 virt-v2v 转换客户机。旧版本会收到附带修复方法的警告,绝不会被静默阻止。
迁移策略
五种策略,每台虚拟机各选其一。
Seamless 为每台虚拟机估算所有可用策略,并选择停机时间最短的一种;若两种策略持平,则选择更简单的那种。您也可以手动更改这一选择。
从 OpenStack 迁移
cold冷迁移
停止虚拟机,通过 SSH 复制已用数据,然后在目标云上启动。
warm温迁移
虚拟机运行期间进行多轮快照复制,停止后只同步最终增量。
storage_handover存储移交
在源端执行 Cinder unmanage,在目标端执行 manage。无需复制数据。
前提条件: 两个云使用同一个 Ceph 集群或 NetApp ONTAP SVM。
从 VMware 迁移
vmware_coldVMware 冷迁移
全量复制,然后由 virt-v2v 进行转换。
vmware_warmVMware 温迁移
多轮 Changed Block Tracking 复制,然后同步最终增量并进行就地转换。
前提条件: 虚拟机已启用 Changed Block Tracking。
技术预览
带 GPU 的虚拟机也能迁移,地址也可以随行。
这是候选发布版本,并非生产认证。尚未记录发布版本的实验室测试。 0.4.0-rc.1 新增,均可按计划选择启用,并已在模拟环境中验证:两者都能在演示中运行,但在 GPU 主机和真实云上的实验室测试尚未进行。测试通过后才会去掉这个标签。
GPU 工作负载
技术预览,已在模拟环境中验证
配有 NVIDIA vGPU(时间切片或基于 MIG)或整块直通 GPU 的虚拟机,现在可以迁移,不再被阻止。磁盘像其他虚拟机一样迁移;GPU 状态不会迁移,虚拟机在目标端的启动方式与关机后重新启动相同。
- 从 OpenStack 规格或 vCenter 读取 GPU,并在清单中显示
- 计划将每块 GPU 映射到目标端的 GPU 规格,绝不按大小或名称自动匹配;未映射的 GPU 虚拟机保持阻止状态
- 验证时以及源虚拟机停止之前,都会从 Placement 读取空闲容量;资源池已满时,源虚拟机继续运行
- 验证会检查 GPU 规格及其 Placement 分配,检查结果会指出客户机所需的驱动和许可证服务器
网络切换
技术预览,已在模拟环境中验证
迁移可以带上虚拟机的网络身份。每一项都按计划选择启用,未启用的计划照常迁移。
- 钩子:由管理员注册的 Ansible playbook 和 HTTPS webhook,在 pre_stop、post_create、post_verify、on_rollback 和 on_finalize 时运行,各有超时和可选的撤销操作
- 在每种 OpenStack 策略下浮动 IP 均可保留地址:源虚拟机停止后迁移,回滚时归还
- 通过 Designate 或 RFC 2136 服务器以 compare-and-swap 方式切换 DNS 记录,回滚时切回
- 可达性等待计入停机时间;Octavia 助手会排空源端成员,并将迁移后的虚拟机加入资源池
预检会指出仍由运维人员负责的部分,并提供操作手册:Heat 堆栈和自动伸缩组、会被批次拆分的 Octavia 资源池、带地址对的端口,以及目标端无法发布的 DNS 名称。
下一版本:0.5.0
计划内容:通过邮件、Slack 和签名 webhook 发送通知;数据路径上的 SSH 主机密钥固定;以及作为技术预览的高可用控制平面、按租户划分的凭据和变更区段跟踪,后者可在 Ceph RBD 卷的温迁移中免去最后一轮的磁盘扫描。
0.4.0-rc.1 的发布说明 (在新标签页中打开)工作原理
一条路径,每一步尽在掌控。
所有来源共用同一个工作流。每次迁移都按明确的状态机推进,控制平面重启后可从检查点继续,每个操作都会留下审计记录。
- 01
连接源云与目标云
添加 RHOSP 17.1、社区版 OpenStack、Kolla-Ansible 或 vCenter 作为源端,添加 RHOSO 18.0 或社区版 OpenStack 云作为目标端,每种平台都有对应的预设。凭证只写不读:它们存入平台的密钥存储,绝不会写入数据库,也不会出现在 API 响应中。一键即可检查每个连接及其可执行的操作,并报告目标端的版本系列、支持层级和策略配置。
- 02
规划批次,先行试点
发现资源清单,包括磁盘、网卡、客户机操作系统和就绪标记。选择虚拟机,映射网络、实例类型、卷类型和项目,由规划器按风险对批次排序,并先安排小规模试点。只有前一批次完成后,下一批次才会开始。
- 03
迁移之前,先做验证
预检会报告阻断项、警告和提示信息,并逐项给出修复方法。每台虚拟机都会得到每种可用策略的估算结果,以及一个可手动更改的自动选择。
- 04
在虚拟机运行期间复制
采用温迁移的虚拟机在照常提供服务的同时,以多轮快照的方式进行复制。第一轮之后,只有 BLAKE2b 摘要发生变化的数据块才会通过网络传输,每一轮都以校验通过的清单摘要收尾。已收敛的虚拟机等待其变更窗口,期间由 keep-warm 同步保持数据最新。
- 05
在变更窗口内切换
只有获得第二位审批人的批准、处于变更窗口内且有空闲的切换槽位时,切换才会开始。虚拟机停止,同步最终增量,然后在目标云上启动。停机时间从虚拟机停止开始计算,到启动并通过验证为止。
- 06
先验证,再最终确认
Seamless 会检查实例是否处于 ACTIVE 状态,以及端口、TCP 探测和控制台输出匹配情况。检查失败时会自动回滚:删除目标端实例并保留其卷,然后重新启动源虚拟机。最终确认是唯一无法撤销的步骤,需要审批人批准,并完整输入虚拟机名称。
仪表板
每一次迁移,一目了然。
仪表板随控制平面一起交付:计划与波次、每个停机时钟与其 SLO 的对比、审批和审计日志,通过 server-sent events 实时更新。以下是它的真实界面,截取自使用模拟云的演示。

整个迁移进程一览无余
按状态统计的迁移、平均停机时间和 SLO 达标率、当前停机的每台虚拟机及其时钟,以及等待人工处理的审批:切换审批和顾问决策,每一项都链接到做出决定的页面。

波次、审批与最终确认队列
计划的状态与数据,因等待顾问决策而暂缓的迁移(带 Approve 和 Override 按钮),已在目标云上验证并逐波等待最终确认的虚拟机,以及其状态允许的操作:编辑、验证、规划波次、暂停、取消。

一台虚拟机完成切换的全过程
下一步和当前可用的操作,不可用的操作会说明原因。阶段步进器、最后一次复制的进度、相对于 SLO 的停机时钟及估算明细,以及谁请求、谁批准了切换。

每台虚拟机及其就绪状态
源端的虚拟机,含项目、电源状态、vCPU 与内存、GPU、磁盘、已用空间和客户机操作系统,带指引的就绪标记,以及持有每台虚拟机的计划。在这里筛选、选择并启动计划。

两端云环境,均已检查
每个源端和目标端的健康状况、端点、区域、登录和 TLS 状态、转换主机、角色、Compute API 版本和存储后端,以及目标端的版本系列、支持层级、策略配置和空闲 GPU 容量。一键全部检查;凭据只写不读。

附带证据的建议
顾问建议了什么,其置信度与策略阈值的对比,以及做出了什么决定、为什么:自动采纳、由人工覆盖,或等待审批。历史事件及其修复方法可供搜索。

实时跟踪的审计日志
每一个计划、迁移、顾问和提供者操作,带操作者、时间和 ID,可按类别和计划筛选。下载当前显示的内容,或将整个日志导出为 JSON Lines 以存入一次写入存储。
- 实时推送,而非轮询
- 阶段变更、同步轮次、审批和事件通过 server-sent events 送达。连接中断后,仪表板从它看到的最后一个事件继续。
- 说明原因,而不只是拒绝
- 从 viewer 到 admin 四种角色。您暂时无法执行的操作仍留在页面上,并说明它在等待什么:角色、审批、变更窗口或阶段。
- WCAG 2.2 AA
- 键盘优先,进度和结果向屏幕阅读器播报,44 px 的点击目标,遵循减少动态效果的设置,状态从不仅靠颜色表示。
- 不从其他主机加载任何内容
- 字体和脚本随控制平面一起交付,不从第三方加载任何内容,因此离线隔离环境中的显示完全相同。
安全保障
在您最终确认之前,一切均可回滚
审批、变更窗口和回滚是控制平面中的规则,而不是运维手册里的约定。在审批人最终确认之前,源虚拟机始终保留在原处。
- 由控制平面强制执行的门禁
- 只有审批、变更窗口和空闲的切换槽位三项条件同时满足,切换才会开始。
- 双人复核
- 发起或强制执行切换的人不能自行审批,必须由另一位审批人批准。
- 最终确认前均可回滚
- 回滚会删除目标端实例、保留其卷,归还切换时迁移的浮动 IP 地址或 DNS 记录,并重新启动源虚拟机。验证失败时会自动执行回滚。
- 不可逆步骤需输入确认
- 最终确认之前,任何操作都不会删除源数据;最终确认需要审批人批准,并完整输入虚拟机名称。
- 重启后继续执行
- 控制平面恢复后,进行中的迁移会从各自的检查点继续执行。计划内的停止可以先排空:各计划暂停,等进行中的切换完成后才会真正停止。
- 源虚拟机不会搁浅
- 每个步骤都有运行时长上限,因此卡住的 playbook 不会让已停止的虚拟机一直处于停机状态。
- 每项操作都有据可查
- 每个变更类调用都会被审计。您可以导出审计记录,或按保留策略进行清理。
部署
融入您的基础设施。
一个容器镜像加 PostgreSQL。可部署在 RHOSO 旁边的 OpenShift 集群上、任意 Kubernetes 上,或部署在单台主机上:Linux 服务器自身的 Docker Engine、Mac 上的 Colima,或 Podman。
Linux
Docker Engine 20.10+ 搭配 Compose v2.20+:Ubuntu、Debian、RHEL、Rocky Linux、AlmaLinux、Fedora
$ scripts/compose-init.shscripts/compose-init.sh$ make seamless-upmake seamless-up$ curl -fsS http://127.0.0.1:8080/api/v1/healthcurl -fsS http://127.0.0.1:8080/api/v1/health$ ssh -L 8080:127.0.0.1:8080 you@your-serverssh -L 8080:127.0.0.1:8080 you@your-server使用服务器自身的 Docker Engine,无需 Colima,也无需 Node.js:镜像会自行构建仪表板。控制平面仅监听 127.0.0.1:8080,因此不会开放任何防火墙端口,仪表板通过 SSH 隧道访问;重启后容器会自动恢复运行,SELinux 可保持 enforcing 模式。
macOS
Colima,或 Docker Desktop(需指定上下文)
$ make seamless-colima-upmake seamless-colima-up$ scripts/compose-init.shscripts/compose-init.sh$ make seamless-upmake seamless-up$ make seamless-logsmake seamless-logs运行在专用的 Colima profile(4 CPU、6 GiB、40 GiB)上,不会更改您当前的 Docker 上下文。使用 Docker Desktop 或其他任何上下文时,请为每条 make 命令添加 SEAMLESS_DOCKER_CONTEXT=desktop-linux。
Podman
4.7 或更高版本
$ scripts/compose-init.shscripts/compose-init.sh$ make seamless-up SEAMLESS_ENGINE=podmanmake seamless-up SEAMLESS_ENGINE=podman$ make seamless-logs SEAMLESS_ENGINE=podmanmake seamless-logs SEAMLESS_ENGINE=podmanpodman compose 运行同一套服务栈;如已安装 docker-compose,则以其作为提供程序。启用 SELinux 的主机会自动重新标记令牌挂载。
Kubernetes
1.28 或更高版本:EKS、AKS、GKE、RKE2、k3s、kubeadm
$ kubectl apply -k deploy/kuberneteskubectl apply -k deploy/kubernetes$ kubectl -n seamless-migrate rollout status deploy/seamlesskubectl -n seamless-migrate rollout status deploy/seamless$ kubectl -n seamless-migrate get ingress seamlesskubectl -n seamless-migrate get ingress seamless基于 OpenShift 清单的 Kustomize overlay,并附带 Ingress。请先根据 secret-example.yaml 创建 Secrets,并创建 TLS Secret seamless-tls。
OpenShift
4.16 或更高版本
$ oc apply -k deploy/openshiftoc apply -k deploy/openshift$ oc -n seamless-migrate rollout status deploy/seamlessoc -n seamless-migrate rollout status deploy/seamless$ oc -n seamless-migrate get route seamlessoc -n seamless-migrate get route seamlessPostgreSQL 16、经过加固的单副本 Deployment、edge-TLS Route,以及默认拒绝的 NetworkPolicies。Secrets 保留在 kustomization 之外。
常见问题
答疑解惑。
团队在迁移第一台虚拟机之前会问的问题。
Seamless Migrate 是什么?
Seamless Migrate 是一个采用 Apache License 2.0 的开源控制平面,用于将虚拟机从 Red Hat OpenStack Platform 17.1、社区版 OpenStack(包括 Kolla-Ansible)和 VMware vSphere 迁移到 Red Hat OpenStack Services on OpenShift(RHOSO)18.0 或社区版 OpenStack 云(从 2023.1 Antelope 到 2026.2 Hibiscus)。它负责规划迁移批次,估算每台虚拟机的停机时间,在虚拟机持续运行时复制磁盘,让每次切换都必须经过审批并在变更窗口内进行,在目标云上验证每台虚拟机,并在检查失败时自动回滚。
如何将虚拟机从 VMware vSphere 迁移到 OpenStack?
将 vCenter(vSphere 7.0U3 或 8.x)添加为源端,将 RHOSO 18.0 或社区版 OpenStack 云添加为目标端,然后规划并验证迁移批次。启用了 Changed Block Tracking(CBT,变更块跟踪)的虚拟机采用温迁移:在虚拟机运行期间通过多轮 CBT 复制磁盘,切换时只传输最终增量,随后由 virt-v2v 进行就地转换。未启用 CBT 的虚拟机采用冷迁移:先全量复制,再进行转换。数据通过 os-migrate vmware-migration-kit 和目标云中带有 VDDK 的转换主机传输。
可以不进行就地采用,而将工作负载从 RHOSP 17.1 迁移到 RHOSO 18.0 吗?
可以。Red Hat 的采用(adoption)流程会就地转换 17.1 部署。如果这种方式不适用,例如需要换用新硬件或新的存储后端、重新设计网络(如从 ML2/OVS 改为 ML2/OVN),或需要整合多个云,Seamless Migrate 可以在新旧环境并行的情况下迁移工作负载:先在 RHOSO 上重建网络、安全组、实例类型、镜像、密钥对、项目和用户,再以冷迁移、温迁移或存储移交的方式迁移每台虚拟机。
可以不迁移到 RHOSO,而迁移到社区版 OpenStack 云吗?
可以。除 RHOSO 18.0 之外,从 2023.1 Antelope 到 2026.2 Hibiscus 的每个社区版 OpenStack 版本系列都可以作为目标平台,无论它是用 Kolla-Ansible、OpenStack-Ansible 还是其他工具部署的:使用 OpenStack Community 或 Kolla-Ansible 预设注册该云,同样的冷迁移、温迁移和存储移交策略即可在其上运行。提供者检查会报告每个目标平台的版本系列、支持层级和策略配置;若缺少所需能力,预检验证会在迁移任何数据之前阻断计划。目前 RHOSO 18.0 是目标平台,发布版本的实验室验证尚未完成;对每个由上游维护的社区版本系列的实验室验证尚未进行,将在正式版本发布之前完成。
迁移需要多长的停机时间?
这取决于迁移策略和虚拟机本身。以一个 200 GiB 的卷为例,已用 120 GiB,客户机写入速率 2 MiB/s,通过 125 MiB/s 链路传输,规划模型估算的停机时间分别为:冷迁移 20分53秒,温迁移 11分20秒,存储移交 4分20秒。温迁移的停机时间取决于最终增量和一次磁盘扫描,而不是全量复制。
冷迁移、温迁移和存储移交有什么区别?
冷迁移会停止虚拟机并复制其已用数据,因此停机时间随磁盘大小增长。温迁移在虚拟机持续运行时以多轮快照复制磁盘,只在同步最终增量时停机。存储移交完全不复制数据:当两个云共享同一个 Ceph 集群或 NetApp ONTAP SVM 时,Cinder 在源端对每个卷执行 unmanage,在目标端执行 manage,因此无论卷有多大,停机时间都是几分钟。
带 GPU 的虚拟机可以迁移吗?
可以,这是一项已在模拟环境中验证的技术预览。配有 NVIDIA vGPU(时间切片或基于 MIG)或整块直通 GPU 的虚拟机,只要计划将每块 GPU 映射到目标端的 GPU 规格即可迁移;未映射的 GPU 虚拟机保持阻止状态。验证会将计划所需的 GPU 与目标端在 Placement 中的空闲容量进行比对,切换门控会在源虚拟机停止之前再次读取:若没有空间,迁移会等待,源虚拟机继续运行。带直通 GPU 的 VMware 虚拟机只能在关机状态下冷迁移。在 GPU 主机上的实验室测试尚未进行。
迁移后的虚拟机能保留 IP 地址和 DNS 名称吗?
固定 IP 和 MAC 地址默认保留。作为已在模拟环境中验证的技术预览,计划还可以保留每个浮动 IP 的地址:在源虚拟机停止后迁移,回滚时归还;地址变化时,还可以在 Designate 或 RFC 2136 服务器中切换 DNS 记录。验证会等待每个迁移后的地址响应,并将等待时间计入停机时间;Seamless 本身不运行 BGP。其余部分可由管理员注册的钩子(Ansible playbook 或 HTTPS webhook)处理,预检会指出仍由运维人员负责的部分,例如 Heat 堆栈、自动伸缩组和 Octavia 资源池。
迁移可以回滚吗?
可以,在最终确认之前均可回滚。回滚会删除目标端实例、保留其卷,并重新启动源虚拟机;验证失败时也会自动触发回滚。最终确认之前,任何操作都不会删除源数据,而最终确认需要审批人批准,并完整输入虚拟机名称。
哪些客户机操作系统可以迁移?
从 OpenStack 迁移时,KVM 客户机迁移到 KVM,因此能在源端启动的系统也能在目标云上启动:RHEL 5 至 10、CentOS、Rocky、AlmaLinux、Oracle Linux、Ubuntu、Debian、SLES、openSUSE、Windows Server 2003 至 2025 以及 Windows 7 至 11。从 VMware 迁移时,由 virt-v2v 转换客户机:RHEL 7 至 10 和 Windows Server 2016 至 2025 受 Red Hat 支持;其他客户机经测试复制验证后可用,或需要先安装 virtio 驱动程序。
Seamless Migrate 在哪里运行?
它由一个容器镜像加 PostgreSQL 16 组成。可以部署在 RHOSO 旁边的 OpenShift 4.16 或更高版本上,也可以部署在 Kubernetes 1.28 或更高版本(EKS、AKS、GKE、RKE2、k3s、kubeadm)上,或者部署在单台主机上:Linux 服务器自身的 Docker Engine 20.10 或更高版本搭配 Compose v2.20(Ubuntu、Debian、RHEL、Rocky Linux、AlmaLinux、Fedora;无需 Colima,也无需 Node.js)、装有 Colima 的 Mac,或 Podman 4.7 或更高版本。一个运维脚本 seamless-ctl.sh 就能在每个平台上都以同样的方式完成部署的启动、停止、重启和扩缩容,并在计划内停止之前先排空运行中的计划。带有模拟云的演示可在笔记本电脑上运行,无需任何云凭证。
Seamless Migrate 免费吗?
是的。它采用 Apache License 2.0 开源,源代码托管在 GitHub 上。
Seamless Migrate 是 Red Hat 的产品吗?
不是。它是一个独立的开源项目,与 Red Hat、OpenInfra Foundation 或 Broadcom 均无关联,也未获得其赞助或认可,且不在任何 Red Hat 订阅的覆盖范围内。它基于上游的 os-migrate Ansible 集合构建,数据搬运仍由该集合负责。
Seamless Migrate 与 os-migrate 有何不同?
os-migrate 负责导出和导入租户资源,并以冷迁移方式复制工作负载,整个复制期间虚拟机处于停机状态。Seamless Migrate 在其基础上,增加了 OpenStack 源端的温迁移路径、存储移交、VMware 温迁移编排,以及一个控制平面,提供迁移计划、批次、停机时间估算、审批、验证、回滚、仪表板、REST API 和 CLI。
开始使用
大有可为。
先从小规模试点开始。
演示会在您笔记本电脑上的模拟云中运行每个阶段,从预复制到切换、验证和回滚。无需 OpenStack 即可试用。
Linux 服务器上的 Docker,或 Mac 上的 Colima
$ git clone https://github.com/imransetiadi/seamless-vms-migrationgit clone https://github.com/imransetiadi/seamless-vms-migration$ cd seamless-vms-migrationcd seamless-vms-migration# 仅限 macOS:Linux 无需此步$ make seamless-colima-upmake seamless-colima-up # 仅限 macOS:Linux 无需此步$ scripts/compose-init.shscripts/compose-init.sh# 模拟云,运行所有阶段$ make seamless-demomake seamless-demo # 模拟云,运行所有阶段试用本地演示 (在新标签页中打开)使用 compose-init.sh 输出的管理员令牌在 /login 登录。也可以使用 Podman: SEAMLESS_ENGINE=podman。