前言

nas玩家迟早都会碰到的一个问题:因为突然断电,阵列无法识别了。

今天我就很不幸的遇到了,但幸运的是,在grok ai的帮助下,我最后成功的把阵列救了回来。

在这里做个记录,希望对你也有帮助。

注意事项:如无十分把握,请务必提前用dd命令给硬盘做镜像,避免raid修复失败导致数据彻底报废


问题描述

我用的nas系统是fnos,存储空间是3盘位raid5。因为一次意外断电,导致raid5阵列无法被fnos系统识别。

表现症状是:

  1. 在【硬盘信息】中可以看到硬盘,但都显示【未识别】或【未挂载】,以及【文件系统未知】,示意图如下。

  1. 在【存储空间】中无任何显示

  2. ssh访问fnos,查看阵列的当前状态信息

一:用lsblk查看硬盘信息,确认阵列名称为/dev/md125。因为系统会尝试识别raid但最后识别失败,所以会出现2种结果。

# 系统识别raid有3个盘
sdh                                                 8:112  0 232.9G  0 disk
└─sdh1                                              8:113  0 232.9G  0 part
  └─md125                                           9:125  0     0B  0 md
sdj                                                 8:144  0 232.9G  0 disk
└─sdj1                                              8:145  0 232.9G  0 part
  └─md125                                           9:125  0     0B  0 md
sdk                                                 8:160  0 232.9G  0 disk
└─sdk1                                              8:161  0 232.9G  0 part
  └─md125                                           9:125  0     0B  0 md
  
# 系统判定2个盘掉线,只有1个盘在线
sdh                                                 8:112  0 232.9G  0 disk
└─sdh1                                              8:113  0 232.9G  0 part
  └─md125                                           9:125  0     0B  0 raid5
sdj                                                 8:144  0 232.9G  0 disk
└─sdj1                                              8:145  0 232.9G  0 part
sdk                                                 8:160  0 232.9G  0 disk
└─sdk1                                              8:161  0 232.9G  0 part

二:用【cat /proc/mdstat】命令查看阵列状态,同样会有2种不同的结果

# raid状态为inactive,三个盘的状态都为(S),也就是备用盘(Spare)
md125 : inactive sdh1[1](S) sdk1[2](S) sdj1[0](S)
      732195840 blocks super 1.2
      
# raid状态为inactive,系统判定2个盘掉线,只有1个盘在线
md125 : inactive sdh1[1]
      244065280 blocks super 1.2

三:用【mdadm -D /dev/md125】命令确认raid的详细状态,依然是2种结果。

# raid未激活,识别到3个盘
/dev/md125:
           Version : 1.2
        Raid Level : raid5
     Total Devices : 3
       Persistence : Superblock is persistent

             State : inactive
   Working Devices : 3

              Name : fnOS:0
              UUID : 3ba3d465:9252aa97:6372896b:8f9e96af
            Events : 239

    Number   Major   Minor   RaidDevice

       -       8      161        -        /dev/sdk1
       -       8      145        -        /dev/sdj1
       -       8      113        -        /dev/sdh1

# raid已激活,但2个盘掉线,只有1个盘在线
/dev/md125:
           Version : 1.2
     Creation Time : Fri Feb 28 23:37:01 2025
        Raid Level : raid5
     Used Dev Size : 244065280 (232.76 GiB 249.92 GB)
      Raid Devices : 3
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Tue Jul 29 14:51:51 2025
             State : active, FAILED, Not Started
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : unknown

              Name : fnOS:0
              UUID : 3ba3d465:9252aa97:6372896b:8f9e96af
            Events : 243

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       -       0        0        1      removed
       -       0        0        2      removed

       -       8      113        1      sync   /dev/sdh1

好了,到这里可以确认,这个3盘位raid5阵列的问题是:有2个盘因为一些原因,被系统判定掉线,导致raid5无法完成组装。


问题分析

根据以上得到的raid信息,可以确定是系统只能识别1个盘,判定另外2个盘掉线。

那接下去分别校验这三个盘,判断是哪里出了问题。

sudo mdadm --examine /dev/sdh1
sudo mdadm --examine /dev/sdj1
sudo mdadm --examine /dev/sdk1

最后得到以下信息:

/dev/sdh1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : 3ba3d465:9252aa97:6372896b:8f9e96af
           Name : fnOS:0
  Creation Time : Fri Feb 28 23:37:01 2025
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 488130560 sectors (232.76 GiB 249.92 GB)
     Array Size : 488130560 KiB (465.52 GiB 499.85 GB)
    Data Offset : 264192 sectors
   Super Offset : 8 sectors
   Unused Space : before=264112 sectors, after=0 sectors
          State : clean
    Device UUID : db80a296:cb7c4968:3fa20022:6a52ab84

Internal Bitmap : 8 sectors from superblock
    Update Time : Tue Jul 29 14:51:51 2025
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : c53acbf1 - correct
         Events : 243

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 1
   Array State : .A. ('A' == active, '.' == missing, 'R' == replacing)

#################################################################################
/dev/sdj1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : 3ba3d465:9252aa97:6372896b:8f9e96af
           Name : fnOS:0
  Creation Time : Fri Feb 28 23:37:01 2025
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 488130560 sectors (232.76 GiB 249.92 GB)
     Array Size : 488130560 KiB (465.52 GiB 499.85 GB)
    Data Offset : 264192 sectors
   Super Offset : 8 sectors
   Unused Space : before=264112 sectors, after=0 sectors
          State : clean
    Device UUID : 16d083ad:0fc3c159:87702a0b:ec88f787

Internal Bitmap : 8 sectors from superblock
    Update Time : Tue Jul 29 14:33:35 2025
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : ba0861f2 - correct
         Events : 239

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)
   
#################################################################################
/dev/sdk1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x1
     Array UUID : 3ba3d465:9252aa97:6372896b:8f9e96af
           Name : fnOS:0
  Creation Time : Fri Feb 28 23:37:01 2025
     Raid Level : raid5
   Raid Devices : 3

 Avail Dev Size : 488130560 sectors (232.76 GiB 249.92 GB)
     Array Size : 488130560 KiB (465.52 GiB 499.85 GB)
    Data Offset : 264192 sectors
   Super Offset : 8 sectors
   Unused Space : before=264112 sectors, after=0 sectors
          State : clean
    Device UUID : 33db5e3c:58f52bb1:07e0deaf:4c74d658

Internal Bitmap : 8 sectors from superblock
    Update Time : Tue Jul 29 14:33:35 2025
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : 15e0fa3b - correct
         Events : 239

         Layout : left-symmetric
     Chunk Size : 512K

   Device Role : Active device 2
   Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)

提取以上信息的重点:

/dev/sdh1:
    Update Time : Tue Jul 29 14:51:51 2025
    Events : 243
    Array State : .A. ('A' == active, '.' == missing, 'R' == replacing)
    
/dev/sdj1:
    Update Time : Tue Jul 29 14:33:35 2025
    Events : 239
    Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)
    
/dev/sdk1:
    Update Time : Tue Jul 29 14:33:35 2025
    Events : 239
    Array State : AAA ('A' == active, '.' == missing, 'R' == replacing)

借助ai的分析,可以得出以下判断:因为突然掉线,3个盘的元数据未完成同步,导致系统无法正确的组装raid。


问题解决

好了,知道了问题原因,接下去就是找办法修复这个raid惹。

一:停止raid

系统当前识别md125阵列有1个盘在线,后续我们操作元数据同步时,需要3个盘都是离线状态。

sudo mdadm --stop /dev/md125

二:强制组装raid。

# 强制组装raid
sudo mdadm --assemble --force -v /dev/md125 /dev/sdh1 /dev/sdj1 /dev/sdk1

成功重组raid的输出信息

mdadm: looking for devices for /dev/md125
mdadm: /dev/sdh1 is identified as a member of /dev/md125, slot 1.
mdadm: /dev/sdj1 is identified as a member of /dev/md125, slot 0.
mdadm: /dev/sdk1 is identified as a member of /dev/md125, slot 2.
mdadm: forcing event count in /dev/sdj1(0) from 239 up to 243
mdadm: forcing event count in /dev/sdk1(2) from 239 up to 243
mdadm: added /dev/sdh1 to /dev/md125 as 1
mdadm: added /dev/sdk1 to /dev/md125 as 2
mdadm: added /dev/sdj1 to /dev/md125 as 0
mdadm: /dev/md125 has been started with 3 drives.

注意:force参数会强制同步 Events 计数,优先使用最新元数据(/dev/sdh1 的 Events: 243)

好了,到此raid就修复完成,系统就可以正确识别这个3盘位raid5,fnos也可以识别到这个存储空间,只需要在fnos的web控制台中点击去挂载就可以完成存储空间的恢复。

🎉


参考文章

  1. RAID5掉盘,恢复过程另一块硬盘出现问题处理过程
  2. Linux RAID Array Assembly Guide

喝杯奶茶