必须先迁移数据再用vgreduce移除坏盘,否则会丢失数据;通过dmesg、smartctl、pvs等确认坏盘状态及lv占用,用pvmove迁出数据,vgreduce剔除空pv,最后pvremove清除元数据。

不能直接用 vgreduce 剔除含有活动数据的物理卷(尤其是坏盘),必须先迁移数据、确认无LV占用,再安全移除。否则会丢失数据或破坏LVM结构。
确认坏盘状态并停止使用
先通过系统日志和磁盘工具确认硬盘确实异常:
- 运行
dmesg | grep -i "ata\|error\|fail"查看内核报错,关注对应设备如/dev/sdb - 用
smartctl -a /dev/sdb检查SMART健康状态(需安装smartmontools) - 执行
fdisk -l /dev/sdb或lsblk确认该盘是否被LVM标记为PV(输出含LVM2_member) - 若磁盘已无法读取、频繁超时或内核持续报 I/O 错误,应立即停止写入,避免进一步损坏
检查卷组中该PV的数据分布
确保坏盘上没有正在使用的逻辑卷数据:
- 运行
pvs -o +pv_used,lv_name,vg_name /dev/sdb查看该PV是否被占用及对应LV - 用
lvs -o +devices列出所有LV及其底层PV设备,确认坏盘是否出现在任何LV的Devices列中 - 若显示有LV驻留在该PV上(如
myvg/mylv /dev/sdb:0-199),则必须先迁移——vgreduce 不允许删除非空PV
迁移数据(关键步骤)
仅当坏盘上有LV数据时才需此步。使用 pvmove 将数据迁出:
- 先确保卷组中有足够空闲PE空间(
vgs myvg查看VFree) - 执行
pvmove /dev/sdb——自动选择其他PV上的空闲空间完成迁移 - 若只想迁部分区域,可用
pvmove /dev/sdb:0-99 - 迁移过程可后台运行,用
pvmove --abort可中断;完成后用pvs验证PUsed是否降为 0
从卷组中移除坏盘
确认该PV完全空闲后,再执行剔除:
- 运行
vgreduce myvg /dev/sdb(myvg替换为实际卷组名) - 成功后
pvs输出中将不再列出/dev/sdb,且vgs myvg的PV数量减1 - 最后可执行
pvremove /dev/sdb清除LVM元数据(便于后续重用或报废识别) - 注意:不要对未迁移完的PV执行 vgreduce,命令会拒绝并报错 "Cannot remove last PV..." 或 "PV still in use"











