文档目录

来源与分类

  • 来源渠道:内部 Jira/TIC。
  • 分类结论:产品问题。
  • 确认依据:TIC 的源端日志显示多台虚拟机同时报 Cannot recv data: Connection reset by peer,随后在未重启虚拟机的情况下确认虚拟机已位于目标主机;ZSTAC-77772 代码修复在迁移取消时除 block job 外总是调用 domain.abortJob()。
  • 内部追踪:TIC-4690、ZSTAC-77772。

问题元数据

  • 问题编号:TIC-4690
  • 组件/产品:ZVF ZSphere
  • 状态:迁移取消缺陷已修复;原始 libvirt 连接中断原因仍未知
  • 报告/受影响版本:4.8.12(ZSTAC-77772)
  • 最后更新时间:2026-09-03

问题描述

SharedBlock 虚拟机 热迁移过程中,libvirt 接口可能返回 Cannot recv data: Connection reset by peer。旧 KVM Agent 的取消路径只处理 block job,没有保证取消 domain migration job;控制面收到失败后仍认为 虚拟机 在源主机,但 libvirt 实际已把 虚拟机 切换到目标主机,源/目标两端因此可能同时保留对磁盘的锁定状态。

现有证据只能确认“错误后的取消不完整”是状态/锁残留根因;导致连接被 peer reset 的最初原因仍未知。现场同时迁移 5 台 虚拟机、目标网卡流量高和网络抖动都只是可能触发因素,不能写成已确认根因。

现象

  • 多台虚拟机同时迁移到同一目标主机,源 KVM Agent 报 unable to migrate vm 和 Cannot recv data: Connection reset by peer。
  • API/控制面显示迁移失败并保留源主机归属,但目标主机上已经存在唯一运行中的虚拟机 QEMU/domain;虚拟机没有经过重新启动。
  • 后续上传、备份、启动或存储操作可能提示 LV 被另一主机锁定。
  • 若源、目标两端真的同时存在运行中的 QEMU,属于更高风险双活场景,不应按普通“锁残留”处理。

影响

控制面归属、实际 虚拟机 位置和 SharedBlock 锁持有者不一致,后续迁移、备份、扩容或启动可能失败。误停目标端 虚拟机、在仍有进程打开 LV 时强制解锁,可能造成业务中断或数据损坏。

规避方案

  • 立即暂停该虚拟机的迁移、启动、存储、快照和备份操作。分别在源/目标主机只读核对 libvirt domain、QEMU 命令行和 虚拟机 UUID,并从管理节点保存迁移 API 与 Agent 错误时间线。预期全环境只能有一个运行实例。
  • 再逐块核对 虚拟机 根盘/数据盘 install path、SharedBlock 锁持有者和实际 QEMU 打开的设备。目标端实例运行且源端没有 QEMU/打开文件、只有源端残留锁,才符合本文的安全恢复前提。
  • 暂无经验证的通用临时方案允许用户直接 deactive LV 或解除 sanlock。任一 虚拟机 实例、设备打开者或锁归属无法唯一确认时,必须停止。
  • 支持协助方案:由 ZStack 技术支持先把控制面主机归属修正为实际唯一运行实例所在的目标主机;随后仅对“源端无 QEMU、无文件句柄、目标端唯一运行”的磁盘逐块解除源端残留激活。每处理一块盘前后都保存锁持有者、LV 激活节点和目标端 I/O 状态;目标端 I/O 异常、源端仍有打开者或锁自动重现时立即停止并按存储备份恢复。一次只处理一台 虚拟机。
  • 恢复成功判据:平台归属与目标端唯一实例一致,源端不再持锁,目标端 虚拟机 I/O 正常,并能完成一次只读磁盘/状态检查。异常处理:两端都有进程、deactive 影响目标 I/O、锁自动重现或 虚拟机 状态变化时立即停止,不进行第二次强制操作。

受影响产品

  • ZVF ZSphere 4.8.12(ZSTAC-77772 Issue Version;其它版本按 Agent 包确认)。
  • 部署形态和依赖组件:SharedBlock 数据存储、libvirt 热迁移和对应版本 KVM Agent;仅当本文列出的“目标端唯一运行、源端无进程但仍持锁”条件全部满足时适用。

修复状态

  • 当前状态:迁移取消逻辑已修复。
  • 修复版本:5.4.0.866 已回归通过;修复还合入 4.8.36、ZSphere 4.10.18 和 4.10.20 对应分支。分支合入不等于任意同版本构建都包含修复,交付包仍按 Agent 提交确认。
  • 关联缺陷/修复记录:ZSTAC-77772;zstack-utility 提交 c92a0ce285876517c9ad131d60a20fa280cb2716 等。当前修复在有存储迁移时先尝试取消 block job,随后无论是否带存储迁移都调用 domain.abortJob();取消异常只记录日志,不掩盖原迁移错误。

关联信息

  • 关联 TIC/Jira:TIC-4690、ZSTAC-77772。
  • 验证边界:Jira 曾登记自动化覆盖,后因测试环境无法触发缺陷条件而撤回;本文只采用 5.4.0.866 的人工回归结论,不把撤回 Case 计为有效自动化证据。
热迁移报失败但虚拟机已到目标主机 | 产品已知问题 · KB | ZStack 资源中心