PVE 擦除磁盘报错 has a holder (500) 的解决方法

在 Proxmox VE(PVE)Web 管理界面擦除磁盘时,如果看到下面的错误:

1
disk/partition '/dev/sdX' has a holder (500)

通常表示目标磁盘仍被 LVM、设备映射、软件 RAID 或其他内核设备占用,因此 PVE 暂时无法直接擦除。本文以清理磁盘上的旧 LVM 或分区信息为例,介绍一种常用处理方法。

一、先确认目标磁盘

下面的命令可以查看磁盘、分区、文件系统和挂载状态:

1
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS

请确认要处理的是数据盘,而不是 PVE 系统盘。本文中的 /dev/sdX 只是占位符,实际操作时需要替换为真实设备名,例如 /dev/sdb 或 /dev/sdc。

如果文章中的截图显示的是 /dev/sdc,命令中也必须使用 /dev/sdc;不要直接照抄其他设备名。

重要: 后面的命令会删除目标磁盘上的分区表、LVM 和文件系统签名,磁盘中的数据将无法正常恢复。执行前请确认已经完成数据备份,并再次核对设备名称。

disk/partition '/dev/sdc' has a holder (500)

二、确认并解除磁盘占用

先查看磁盘是否属于 LVM:

1
2
3
sudo pvs
sudo vgs
sudo lvs

如果目标磁盘上的逻辑卷仍在使用,需要先停止相关虚拟机或服务,再卸载文件系统并停用对应逻辑卷。不要对正在使用的系统盘或虚拟机数据盘执行擦除操作。

三、清理磁盘签名

确认目标设备无重要数据且已经停止使用后,可以先用 wipefs 清除文件系统、RAID 和 LVM 签名:

1
sudo wipefs -a /dev/sdX

如果系统仍然提示磁盘被占用,可以使用下面的命令覆盖磁盘开头的一小段区域,清理残留的分区表信息:

1
sudo dd if=/dev/zero of=/dev/sdX bs=1M count=100 status=progress

将 /dev/sdX 替换为实际设备名。dd 命令具有破坏性,设备名称写错会导致其他磁盘数据丢失。

清理磁盘信息

四、刷新磁盘状态

清理完成后,让内核重新读取分区表:

1
sudo partprobe /dev/sdX

如果 PVE Web 界面仍然显示旧的 LVM 或分区信息,可以重启服务器:

1
sudo reboot

重启服务器

五、重新进入 PVE 擦除磁盘

重启完成后,重新进入 PVE Web 管理界面,检查目标磁盘是否已经不再显示旧的 LVM 或分区信息,然后再执行擦除操作。

擦除完成

常见问题

1. 为什么不建议直接执行完整 dd?

完整覆盖整块磁盘耗时较长,而且无法解决正在使用中的设备占用问题。通常清理磁盘开头的分区表和 LVM 签名,再刷新状态即可满足重新初始化磁盘的需求。

2. 清理后仍然提示 has a holder 怎么办?

检查目标磁盘是否仍被挂载、LVM、设备映射或软件 RAID 使用,并确认相关虚拟机和服务已经停止。必要时重启 PVE,再重新检查磁盘状态。

3. 如何恢复误操作?

wipefs 和 dd 都可能造成数据不可恢复。执行前应先备份数据;如果已经覆盖磁盘,只能尝试使用专业数据恢复工具,不能保证恢复成功。