问题描述

在克隆一台虚拟机时意外中断,然后在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 镜像。

遵循上述步骤可以有效解决问题,并防止未来发生类似情况。