记一次抢救阵列数据

8/26/2024 RAIDLinux抢救

# 前言

我某次使用 Webmin 寻思给原本三块硬盘的 RAID5 阵列添加一块 spare 磁盘,随后将原来的 3T 成员换成 4T. 结果按下添加之后变成了成员,阵列总大小也扩容了。 我当时寻思哎 RAID5 就 RAID5 吧,少一块也死不了,然后把四盘 RAID5 拔了一块,阵列变成 Degraded 接着用。 这个以前的想法差点害死现在的我。

# traceback

当我打开nas的盖子,拔出一块我以为是 3T WD绿盘的时候看到了一抹紫色。 当时我就 panic 了,火速塞回并回到笔记本前面查看阵列状态,看到一抹红色 Failed. 当时没怀疑为什么插回去不自动回到阵列,也没尝试停止之后再启动,而是尝试再用 Webmin 的添加硬盘。 这一步就导致了我的硬盘元数据被标记成了 Spare 而非成员。

# 疯狂寻找解决方案

那我肯定是 Bing 搜索怎么抢救raid阵列,以及 mdadm 的手册。

我去搜了一下发现个非常有意思的玩法 (opens new window),依照此我去创了个镜像,去不断force assemble (没成功,因为元数据已经报告是 spare 成员) 然后我又看了一下文档 (opens new window),发现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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

随后--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.
1
2
3
4

又重新翻找了一下文档 ,只看到一个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).
1
2

撒花!

最近更新: 11/24/2024, 10:03:25 AM