Proxmox VE (PVE) RBD 镜像删除失败排查与解决方案
问题描述
在克隆一台虚拟机时意外中断,然后在WEBUI上进行手动删除后,再次进行克隆。但是在克隆到最后都会失败,以下是报错内容:
TASK ERROR: clone failed: rbd create 'vm-2004-cloudinit' error: rbd: create error: 2025-10-13T15:56:55.878+0800 776653c33880 -1 librbd: rbd image vm-2004-cloudinit already exists
或
TASK ERROR: clone failed: rbd create 'vm-2004-cloudinit' error: rbd: create error: (17) File exists
然后对在尝试删除名为 vm-2004-cloudinit 的 Ceph RBD 镜像时,遇到以下错误:
# rbd rm -p inboc vm-2004-cloudinit
rbd: error: image still has watchers
This means the image is still open or the client using it crashed. Try again after closing/unmapping it or waiting 30s for the crashed client to timeout.
可通过 pvesm status 确定了正确的 Ceph 池名(如 inboc),但仍然无法删除该镜像。
排查步骤
1、确认 VM 是否存在
首先检查是否可以通过 PVE 命令找到 VM 2004:
# 应无输出
qm list | grep 2004
# 应提示“无此文件” ls /etc/pve/qemu-server/2004.conf
结果:VM 2004 已不存在于 PVE 管理层中。
2、检查是否有相关进程运行
使用 ps aux 查找与 VM 2004 相关的 QEMU 进程:
ps aux | grep "vm-2004"
结果:发现有 QEMU 进程正在运行(PID 350662),只要 QEMU 进程活着,它就持有对 vm-2004-cloudinit(以及其他磁盘)的 RBD 连接,Ceph 就会认为“有客户端在使用”,拒绝删除。
3、检查 RBD 镜像状态
查看 vm-2004-cloudinit 镜像的状态以及是否有 watcher 存在:
rbd status -p inboc vm-2004-cloudinit
结果:显示有 watcher 存在,表明镜像正在被某个客户端使用。
解决方案
1、终止 QEMU 进程
由于 VM 2004 在 PVE 中已不可见,但 QEMU 进程仍在运行,需强制终止该进程:
kill -9 350662
注意:这相当于“拔电源”,请确保该 VM 无关键业务或已做好数据风险评估。
2、验证进程是否已退出
再次检查是否有相关进程存在:
# 应无相关 kvm 进程
ps aux | grep "vm-2004"
# 应显示 "No watchers"rbd status -p inboc vm-2004-cloudinit
3、删除残留的 RBD 镜像
现在可以安全地删除 vm-2004-cloudinit 镜像:
rbd rm -p inboc vm-2004-cloudinit
如果仍有其他关联的 RBD 镜像(如 vm-2004-disk-0, vm-2004-disk-4),也一并删除:
rbd rm -p inboc vm-2004-disk-0rbd rm -p inboc vm-2004-disk-4
4、清理其他残留
检查并删除可能存在的锁文件:
rm -f /var/run/qemu-server/2004.*
检查网络接口,并手动删除(如有必要):
ip link show | grep tap2004ip link delete tap2004i0
预防措施
1、避免手动删除 /etc/pve/qemu-server/XXX.conf 文件 使用 qm destroy XXX 或 Web UI 删除 VM。
2、避免在 VM 运行时操作集群配置 如移除节点、重启 corosync 等可能导致同步异常的操作。
3、定期检查孤儿进程
定期检查是否存在未被 PVE 管理的 QEMU 进程:
ps aux | grep '/usr/bin/kvm -id'
4、设置监控和告警 对于重要 VM 设置监控和告警,以便及时发现并处理类似问题。
总结
本文档详细描述了如何排查和解决由于 QEMU 进程残留导致的 Ceph RBD 镜像无法删除的问题。核心在于:
- 确认 VM 是否已被 PVE 管理层“遗忘”;
- 终止残留的 QEMU 进程;
- 确认 RBD watcher 已释放;
- 安全删除残留的 RBD 镜像。
遵循上述步骤可以有效解决问题,并防止未来发生类似情况。