
几天前,我在维护我的NAS系统时,遇到了一个让我深吸凉气的 LVM RAID6 故障场景。一块关键HDD磁盘在扩容期间发生了不可恢复读错误,导致整个阵列脱机,Thin Pool 无法激活。因为我的架构涉及 LUKS 加密、dm-integrity、Thin Provisioning、lvmcache 等多层堆叠,恢复难度远比普通 RAID 更复杂。这篇文章将详细记录我从 RAID6 故障中恢复的全过程。
一、我先介绍一下我的完整存储架构,帮助理解各组件间的关系:
- 6 块 HDD(2.73TB):启用 dm-integrity 检测 bit rot,之后使用 LUKS 加密,再初始化为 LVM PV。
- 1 块 NVMe(930GB):同样为 LUKS + PV,承载 Thin Pool metadata 和 lvmcache。
- LVM RAID6 逻辑卷(LV):构建于 6 块 HDD 上,承载 Thin Pool 的 tdata。
- Thin Pool 元数据(tmeta):RAID1,3 副本分布于 NVMe 和两块 HDD。
- Writeback Cache:基于 NVMe 上的 lvmcachepool。
- 上层结构:所有业务卷都是 Thin Volumes。
这个架构既加密、又支持 bit rot 检测、并具备双盘容错能力,且缓存加速性能优越。但在扩容 RAID6 时,一块 HDD(WD3A)出现读取错误并掉盘,LVM 无法激活受损 LV,Thin Pool 无法恢复。
二、故障重现与恢复尝试
1. RAID6 扩容后掉盘
我将 RAID6 LV 从每盘 1.5TB 扩展至 2.73TB,系统开始对新区域进行 resync。此时 WD3A 报出 IO 错误,RAID 自动降级。我没有立即修复,而是关机等待更换硬盘。
2. 替换硬盘并初始化
更换硬盘(TO4C)后,我按如下步骤初始化该盘:
# 启用 dm-integrity 和 LUKS 加密
integritysetup format /dev/sdX
cryptsetup luksFormat /dev/mapper/integrity-XYZ
cryptsetup open /dev/mapper/integrity-XYZ TO4C
pvcreate /dev/mapper/TO4C
vgextend bluebox /dev/mapper/TO4C
3. 尝试修复 RAID6 逻辑卷
lvconvert --repair bluebox/raid6-thinpool_tdata_corig /dev/mapper/TO4C
但这一步失败了,提示:
bluebox/raid6-thinpool_tdata_corig must be active to perform this operation.
我尝试以 degraded 模式激活:
lvchange -ay --activationmode degraded bluebox/raid6-thinpool_tdata_corig
却收到错误:
device-mapper: raid: Failed to read superblock of device at position 4
md/raid:mdX: cannot start dirty degraded array.
这说明 dm-raid 尝试启动一个 “脏的、降级的” RAID6,但失败了。
三、深入分析与恢复策略
1. 错误原因定位
从 dmesg 和 LVM 日志可判断:
- LVM 知道有一个 PV(WD3A)缺失;
- 它尝试将其恢复进 RAID,但启动失败,提示 position 4 无法读取;
- 实际上,这是因为该 RAID6 的 layout 未完成同步,存在 dirty bit。
2. 解法一:RAID 组件降级激活并修复
使用以下思路操作:
# 手动移除失效 PV,仅限 metadata
vgreduce --removemissing --force bluebox
# 保留 data 卷不要删;立即备份 LVM 元数据:
vgcfgbackup -f /root/vgbackup_raidbroken.cfg bluebox
然后重启,使用如下命令绕过 RAID6 dirty 标志:
dmsetup create raid6-rebuild --table "0 $(blockdev --getsize /dev/mapper/raid6-thinpool_tdata_corig) raid 6 0 1 /dev/mapper/TO3A /dev/mapper/TO3B /dev/mapper/TO4A /dev/mapper/TO4B /dev/mapper/WD3B /dev/mapper/TO4C"
注意:
- dmsetup 的顺序 必须与原 RAID 创建顺序一致;
- 指定 RAID 参数时可尝试手动清除 dirty flag。
3. 解法二:绕过 lvmraid,用 mdadm 直接组阵列
如果 lvmraid 的 RAID superblock 出现不可逆损坏,理论上可以尝试:
# 假设我们知道物理设备顺序
mdadm --create /dev/md0 --level=6 --raid-devices=6 missing /dev/mapper/TO3A /dev/mapper/TO3B /dev/mapper/TO4A /dev/mapper/TO4B /dev/mapper/WD3B
之后:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
再使用 losetup + cryptsetup 打开加密层和 LVM,再做 volume 扫描。
此法可取出原始数据,但布局极其复杂,不建议在非只读模式尝试。
四、后续建议与风险控制
- LVM RAID 不等于 mdadm RAID:它使用 device-mapper 的软件实现,排障手段更少。
- 扩容时强烈建议先快照并做完整备份,尤其是 Thin Pool 场景。
- 恢复后尽快 pvmove 将 critical volume 迁移出疑似故障盘。
- 我最终通过 vgreduce + 手动修复 RAID layout + lvconvert –repair 恢复了数据,并利用 lvs –segments -a 校验 RAID 成员匹配。
LVM RAID 在架构灵活性和功能整合上非常强大,但出问题时调试和恢复远比传统 mdadm RAID 复杂。此次经历提醒我:架构设计虽好,但容灾和文档更关键。希望这篇实录能为遇到类似情况的朋友提供借鉴和参考。











