lvm逻辑卷因底层硬盘物理坏道导致i/o挂起时,须立即停用lv、定位并拔除故障盘电源,再通过smartctl确认坏道、ddrescue镜像抢救数据,最后在新盘上复刻分区、pvcreate、vgextend、pvmove迁移、vgreduce剔除旧pv,并lvchange激活后e2fsck验证文件系统。

LVM逻辑卷因底层硬盘物理坏道导致I/O挂起(如ls、cp卡死、df无响应、dmesg持续刷UNC错误),说明磁盘已进入不可靠读写状态,必须立即切断访问链路,否则可能触发LVM元数据损坏或LV自动deactivate。
第一步:确认挂起源与紧急隔离
执行lsof +D /mnt/your-lv-mount查占用进程,若无结果但ls -l /mnt/your-lv-mount仍卡住,说明问题在块设备层而非文件系统缓存;运行cat /proc/mounts | grep -E "(lv|vg)"确认LV是否仍为active状态;若LV状态异常,立即执行lvchange -an /dev/vgname/lvname——这一步必须做,【不强制停用LV会导致后续pvmove失败或元数据错乱】。
用dmsetup ls --tree查看LV对应的底层device mapper路径,再查lsblk -S匹配Serial号,定位到物理盘(如/dev/sdb);立刻拔掉该盘SATA电源线(非数据线),仅保留数据线用于后续诊断——带电热插拔消费级SATA盘极易引发控制器reset风暴。
第二步:验证物理坏道并禁用故障盘
方法一:用smartctl抓取实时硬件状态
插入故障盘(仅接数据线,不接电源),执行smartctl -d sat -a /dev/sdb;重点检查Reallocated_Sector_Ct和Current_Pending_Sector两列数值,只要任一值>0,即可判定存在物理坏道;若UDMA_CRC_Error_Count也同步飙升,先换SATA线再测——排除接口干扰。
方法二:用ddrescue快速镜像+跳过坏区
准备一块容量≥故障盘的新盘(如/dev/sdc),执行:ddrescue -d -r3 -n /dev/sdb /dev/sdc /root/rescue.log;【-d参数强制直通设备,绕过内核缓存;-r3表示每个坏扇区最多重试3次,避免无限hang】;若ddrescue启动即报Input/output error且进度条不动,说明坏道位于开头区域,需改用-d -R参数从末尾反向读取。
第三步:LVM层面安全替换物理卷
第一步:在新盘上创建相同分区布局
用fdisk -l /dev/sdb记录原盘分区起止扇区,对新盘/dev/sdc执行fdisk /dev/sdc,严格复刻分区大小与对齐方式(尤其注意4K对齐偏移);分区完成后运行partprobe /dev/sdc刷新内核分区表。
第二步:初始化新物理卷并扩展卷组
执行pvcreate /dev/sdc1(假设原PV是sdb1);再运行vgextend vgname /dev/sdc1将新PV加入卷组;此时pvs应显示旧PV与新PV共存,且旧PV的PE使用率仍为100%。
第三步:迁移数据并剔除故障PV
执行pvmove /dev/sdb1 /dev/sdc1;该命令会按PE顺序迁移,遇到坏扇区时自动跳过并记录到日志;迁移完成后,用vgs -v确认旧PV的Alloc PE变为0;接着执行vgreduce vgname /dev/sdb1;最后运行pvremove /dev/sdb1彻底清除LVM元数据。
第四步:激活LV并验证文件系统
执行lvchange -ay /dev/vgname/lvname;运行e2fsck -f /dev/vgname/lvname强制检查(仅限ext4);若报错“Group descriptors corrupted”,说明迁移中丢失了关键元数据,需从ddrescue镜像中恢复——此时直接挂载/dev/sdc1为只读,用debugfs提取关键inode。











