云盘路径不一致导致快照创建报“unable to find volume”
问题现象
- 云盘创建快照失败,提示
unable to find volume。 - 该云盘已有快照(即不是一块全新的云盘)。
- 数据库中记录的云盘路径与主机上实际的
qcow2路径不一致。
适用场景
- 产品:ZStack Cloud。
- 版本:素材说明适用于所有版本。
- 组件:云盘快照、管理数据库和主存储。
判断方法
- 确认云盘已有快照。
- 对比
VolumeEO.primaryStorageUuid、VolumeEO.installPath、云主机 libvirt XML 与主机侧存储路径。
解决方案
1. 执行前准备与处理步骤
- 在 UI 中确认云盘上已存在快照。
- 在运行云主机的物理主机上,导出云主机的 libvirt XML,查看实际的 qcow2 路径:
# virsh dumpxml $vmuuid
记录 <disk> 中 <source file="..."> 条目(即 $device),以及该磁盘在主机上的对应路径。
- 确认 UI 和主机上对该云盘都没有正在运行的任务:
# virsh blockjob $vmuuid $device
将 $device 替换为 XML 中的磁盘 target,将 $vmuuid 替换为运行中的云主机 UUID。
- 备份数据库,关闭云主机高可用、停止定时业务
# zstack-ctl dump_mysql --file-name zstack-db-backup-master # 在主管理节点上执行
# zstack-ctl dump_mysql --file-name zstack-db-backup-slave # 在备管理节点上执行
- 更改数据库
5.1 登陆数据库
# mysql -u root -pzstack.mysql.password zstack
5.2 查询数据库,确认该云盘的 primaryStorageUuid 和 installPath 与主机侧路径不匹配:
select * from VolumeEO where uuid=$Volume-UUID;
$Volume-UUID 是云盘的 UUID 如果数据库中的值与 XML / 主机侧的值不一致,则进行以下修改
5.3 修改
update VolumeEO set primaryStorageUuid="$Real-PS-UUID-From-Xml", installPath="$fixed-InstallPath-From-Xml" where uuid="$Volume-UUID";
参数说明:
$Real-PS-UUID-From-Xml是 XML 中存储路径所对应的主存储 UUID。$fixed-InstallPath-From-Xml是按主存储类型规范化后的 XML 存储路径:- 对于 Shared Block 主存储,需要将
/dev/替换为sharedblock://。 - 对于 Ceph 主存储,需要在 pool 前添加
ceph://。 - 如不确定,可以参考同一主存储上其他正常云盘的
installPath写法。
- 合并旧快照
6.1. 登录 ZStack Cloud UI,将全局配置中的"快照增量最大数目"调整为 2,以便更快生成全量快照。
6.2. 连续创建快照:最多两次后即可生成一个全量快照。注意修改快照超时时间。
6.3. 删除先前无法删除的旧快照。
- 在 UI 中确认可以成功创建新快照。
- 重新启用云主机全局高可用,并检查云平台资源连接性是否正常。
验证方法
- 可以在 UI 中正常创建新的云盘快照。
- 生成全量快照后,可以正常删除旧快照。
原因说明
管理数据库中 VolumeEO.installPath 和 VolumeEO.primaryStorageUuid 与云盘在主机上的实际位置不同步,导致快照代码路径无法找到 qcow2 文件,从而返回 unable to find volume。
风险与回滚
- 修改
VolumeEO前备份数据库并关闭全局云主机高可用。 - 如果更新值不正确,恢复操作前的数据库备份,并将云盘元数据回退到原值。
