记一次抢救阵列数据
前言
我某次使用 Webmin 寻思给原本三块硬盘的 RAID5 阵列添加一块 spare 磁盘,随后将原来的 3T 成员换成 4T. 结果按下添加之后变成了成员,阵列总大小也扩容了。
 我当时寻思哎 RAID5 就 RAID5 吧,少一块也死不了,然后把四盘 RAID5 拔了一块,阵列变成 Degraded 接着用。
 这个以前的想法差点害死现在的我。
traceback
当我打开nas的盖子,拔出一块我以为是 3T WD绿盘的时候看到了一抹紫色。
 当时我就 panic 了,火速塞回并回到笔记本前面查看阵列状态,看到一抹红色 Failed.
 当时没怀疑为什么插回去不自动回到阵列,也没尝试停止之后再启动,而是尝试再用 Webmin 的添加硬盘。
 这一步就导致了我的硬盘元数据被标记成了 Spare 而非成员。
疯狂寻找解决方案
那我肯定是 Bing 搜索怎么抢救raid阵列,以及 mdadm 的手册。
我去搜了一下发现个非常有意思的玩法,依照此我去创了个镜像,去不断force assemble (没成功,因为元数据已经报告是 spare 成员)
 然后我又看了一下文档,发现1.2版本的元数据在0x1000(4k)存储,0x10A0控制着成员是第几块硬盘,改了之后examine成功识别
# mdadm --examine /dev/mapper/sdf
/dev/mapper/sdf:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : [REDACTED]
           Name :[REDACTED]
  Creation Time : Tue May 17 22:51:15 2022
     Raid Level : raid5
   Raid Devices : 4
 Avail Dev Size : 7813773360 sectors (3.64 TiB 4.00 TB)
     Array Size : 8790403968 KiB (8.19 TiB 9.00 TB)
  Used Dev Size : 5860269312 sectors (2.73 TiB 3.00 TB)
    Data Offset : 263808 sectors
   Super Offset : 8 sectors
   Unused Space : before=263728 sectors, after=1953504048 sectors
          State : clean
    Device UUID : [REDACTED]
Internal Bitmap : 8 sectors from superblock
    Update Time : Sun Aug 25 14:04:10 2024
  Bad Block Log : 512 entries available at offset 24 sectors
       Checksum : 448a0db2 - expected 448a0db0
         Events : 491050
         Layout : right-asymmetric
     Chunk Size : 64K
   Device Role : Active device 3
   Array State : A.AA ('A' == active, '.' == missing, 'R' == replacing)随后--assemble --force, 不出意外出意外了
[29979631.580878] md: invalid superblock checksum on dm-2
[29979631.580886] md: dm-2 does not have a valid v1.2 superblock, not importing!
[29979631.580893] md: md_import_device returned -22
[29979631.581194] md: md0 stopped.又重新翻找了一下文档
 ,只看到一个checksum相关的sb_csum,然后克隆kernel找(
 usr/include/linux/raid/md_p.h
 __u32 sb_csum; /* 6 checksum of the whole superblock */
 然后脱裤子放屁了一把才发现mdadm早就报告了Checksum : 448a0db2 - expected 448a0db0
 我直接hexedit把0x10d8改成448a0db0,再次mdadm --examine /dev/mapper/sdf发现Checksum : b00d8a44 - expected 448a0db0
 再次改正,examine显示Checksum : 448a0db0 - correct
 好!
#  mdadm --assemble /dev/md0 /dev/mapper/sdd /dev/mapper/sde /dev/mapper/sdf
mdadm: /dev/md0 has been started with 3 drives (out of 4).撒花!
