lvm在线更换坏盘需先确认pv可读且被识别,再用pvmove迁移数据至新pv,最后vgreduce移除旧pv;全程须验证smart状态、i/o错误及lvm元数据一致性。

可以在线迁移数据并更换坏盘,但必须严格遵循LVM逻辑卷管理流程,pvmove本身不处理物理磁盘故障,它只在LVM层面安全转移PE(物理扩展)。真正更换坏盘前,需确认该PV确实已无法写入、SMART报错或内核日志频繁出现I/O错误,且系统仍能读取其上数据(否则pvmove会失败)。
确认坏盘状态并标记为不可用
先通过dmesg、smartctl和lvs/pvs验证问题盘是否可读、是否被LVM识别:
- 运行 dmesg | grep -i "sdb\|error" 查看是否有硬件级I/O超时或重映射告警
- 执行 smartctl -a /dev/sdb 检查Reallocated_Sector_Ct、Current_Pending_Sector等关键项
- 用 pvs -v 确认该PV是否处于“allocatable”状态;若显示 [unknown] 或 missing,说明LVM已丢失连接,此时不能直接pvmove
- 如果PV仍可见但读取缓慢或偶发失败,可临时禁用自动分配:vgchange --alloc restricted
准备新盘并扩展卷组
新盘需大小≥原坏盘已用PE总量(可用 pvs --units g 查看Used列),且分区类型设为8e(Linux LVM):
- 用 fdisk /dev/sdc 创建单主分区,t → 8e,w保存
- 执行 pvcreate /dev/sdc1 初始化物理卷
- 将新PV加入原卷组:vgextend
/dev/sdc1 - 验证:vgs
应显示Free PE增加,pvs 显示两块PV均在线
执行pvmove并监控进度
pvmove默认逐个迁移PE,支持指定范围、限速和中断恢复,迁移期间LV和文件系统持续可用:
- 最简命令:pvmove /dev/sdb1(自动选择目标PV,通常为同VG内空闲空间最大的那个)
- 显式指定目标:pvmove /dev/sdb1 /dev/sdc1(确保目标空间足够)
- 限速防止IO冲击:pvmove --rate 10M /dev/sdb1(单位为KB/s,10M=10240KB/s)
- 后台运行并查看进度:pvmove -i 5 /dev/sdb1 &(-i 5表示每5秒刷新一次状态)
- 中途检查:pvs -o +pv_used,pe_count 或 pvmove -i 查剩余未迁移PE数
移除旧PV并清理
pvmove完成后,原坏盘的PE应全部清零,此时才能安全踢出卷组:
- 确认迁移完成:pvs 中 /dev/sdb1 的Used列应为0,且无警告输出
- 从卷组中移除:vgreduce
/dev/sdb1 - 停用该PV(可选但推荐):pvremove /dev/sdb1(清除LVM元数据,避免误操作)
- 物理下线:关闭服务器,拔掉sdb盘,替换为新盘后重新分区初始化(如需复用该槽位)











