来源与分类
问题元数据
- 问题编号:TIC-3700、ZSV-8228
- 组件/产品:ZVF ZSphere
- 状态:已修复
- 报告/受影响版本:4.10.3
- 最后更新时间:2026-09-02
问题描述
4.10.3 的 SharedBlock/SAN 路径在关闭 虚拟机 后导出 OVA/创建镜像时,会进入 qcow2 resize/commit 相关流程。旧代码未先比较当前虚拟大小,在上层传入错误的小尺寸时仍允许 qemu-img resize --shrink;现有分析观察到原卷被截断到约 64 MB,后续 Linux 根文件系统的 superblock 和数据不可读。修复在 SharedBlock 非在线 resize 中启用 skip_if_sufficient:当前 qcow2 虚拟大小大于等于请求值时直接跳过缩小。
现象
- Windows 虚拟机可能正常,而 CentOS 7.9 等 Linux 虚拟机无法启动。
- 启动日志出现 XFS 文件系统错误、bad superblock,
xfs_repair无法修复;检查卷虚拟大小可见异常缩小。 - 当前 top 的
/dev/centos/root无法通过 libguestfs 挂载,而关联 image cache 的根文件系统仍可挂载。image cache 健康只证明基础镜像未坏,不能恢复 虚拟机 后续业务数据。 - 问题在 SAN/SharedBlock 数据存储可稳定复现,本地存储未复现。
影响
原 虚拟机 卷发生数据截断,可能不可恢复;这是数据安全问题,不只是导出任务失败。把截断后的 LV 重新扩回原大小不会还原已丢失的数据,反复执行 xfs_repair 也可能进一步改变唯一现场。
规避方案
- 已验证自助规避:4.10.3 SAN/SharedBlock 环境在升级前停止“从现有 虚拟机/硬盘创建镜像”和“导出 OVA”,不要用生产 虚拟机 验证是否命中。Windows 可启动、本地存储未复现都不能证明 SAN Linux 虚拟机 安全。
- 已经发生后,立即停止 虚拟机 启动、OVA 导出、resize、commit 和文件系统修复操作;保存任务 UUID、卷/快照链、导出前后虚拟大小、Agent 日志和锁状态,并先对受影响 LV 做存储侧只读保护/副本。
- 暂无经验证的通用临时方案可以修复已经被截断的数据。支持协助方案只能从导出前的已验证备份、存储快照或其它完整副本恢复到新卷;image cache 只能重建基础系统,不能替代业务数据备份。
- 恢复成功判据:新卷大小与备份一致、文件系统只读检查通过、虚拟机 在隔离网络启动并完成业务校验;异常处理是备份也损坏、大小不一致或挂载失败时保留现场,不在原卷继续尝试。
- 预防性升级后先用可丢弃测试 虚拟机 在 SAN 上执行一次关闭、导出 OVA、再次启动和数据校验,确认原卷虚拟大小不变,再恢复生产导出流程。
受影响产品
- ZVF ZSphere:4.10.3
- 部署形态和依赖组件:SAN 数据存储上的 XFS 数据盘参与 OVA 导出;非 XFS、非 SAN 或未执行 OVA 导出时不套用本问题结论。
修复状态
- 当前状态:已修复。
- 修复版本:4.10.6;本地提交历史显示 ZSV-8228 合入
zsv_4.10.6。 - 关联缺陷/修复记录:ZSV-8228。
shared_block_plugin.resize_volume()调用qemu_img_resize(..., skip_if_sufficient=True),当前虚拟大小已达到请求值时不再执行 shrink。
