扩容后重启RAID6阵列消失,出现RAID0阵列的恢复方案咨询
先别慌,从你提供的操作历史和superblock信息来看,问题根源很清晰:你扩容时错误地添加了整个磁盘(/dev/sdb//dev/sdc)而非分区,同时这两个磁盘的原有分区sdb1/sdc1里还残留着旧RAID0的元数据,导致重启后系统优先识别了旧RAID0,占用了RAID6需要的设备,最终RAID6变成 inactive 状态。下面是分步的安全恢复建议:
第一步:终止当前冲突的RAID设备
首先要停止正在运行的md0和inactive的md1,释放被占用的磁盘:
mdadm --stop /dev/md0 mdadm --stop /dev/md1
如果提示设备busy,先卸载任何挂载的目录:
umount /media/tmp_md_raid
如果还是无法停止,用fuser终止占用进程:
fuser -km /media/tmp_md_raid
第二步:清除磁盘上的冲突元数据
你之前是把整个磁盘加入RAID6的,所以RAID6的superblock在磁盘的MBR区域;而sdb1/sdc1里的旧RAID0元数据是导致系统误识别的原因。我们需要清除整个磁盘上的RAID元数据(注意:不是分区!):
mdadm --zero-superblock /dev/sdb mdadm --zero-superblock /dev/sdc
这一步只会清除RAID的元数据,不会破坏磁盘上的用户数据。
第三步:尝试组装完整的RAID6阵列
现在用RAID6的UUID来指定组装,这是最安全的方式,mdadm会自动匹配所有属于该阵列的设备:
mdadm --assemble --verbose /dev/md1 --uuid=929a14c9:adaf502a:53658e03:90a19fce
或者手动指定所有设备:
mdadm --assemble --verbose /dev/md1 /dev/sdb /dev/sdc /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1
执行后查看阵列状态:
cat /proc/mdstat
如果阵列显示clean或者正在同步,说明组装成功。
第四步:只读挂载备份数据
为了避免意外写入损坏数据,先以只读模式挂载阵列,备份重要数据:
mount -o ro /dev/md1 /media/tmp_md_raid
确认数据可访问后,尽快把关键数据备份到其他存储设备。
备选方案:仅在组装失败时使用
如果上述步骤无法成功组装RAID6,再考虑使用--create --assume-clean重新生成阵列元数据(这是最后手段,操作前务必确认参数完全匹配):
mdadm --create --verbose /dev/md1 --level=6 --raid-devices=6 --chunk=512K --layout=left-symmetric --assume-clean /dev/sdb /dev/sdc /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1
这个命令不会初始化数据,只是重新创建RAID元数据,但必须严格匹配原来的阵列参数(级别、设备数、chunk大小、布局),否则会导致数据损坏。
后续建议
数据备份完成后,建议重新规划磁盘分区,确保所有RAID成员都使用分区而非整个磁盘,避免以后再出现元数据冲突的问题。
备注:内容来源于stack exchange,提问作者tjgrillz

