Raid

重新組裝 mdadm-raid5

  • August 22, 2015

我的一個朋友有一個帶有 9 個磁碟的 mdadm-raid5,它不再重新組裝。

查看系統日誌後,我發現磁碟 sdi 已從陣列中踢出:

Jul  6 08:43:25 nasty kernel: [   12.952194] md: bind<sdc>
Jul  6 08:43:25 nasty kernel: [   12.952577] md: bind<sdd>
Jul  6 08:43:25 nasty kernel: [   12.952683] md: bind<sde>
Jul  6 08:43:25 nasty kernel: [   12.952784] md: bind<sdf>
Jul  6 08:43:25 nasty kernel: [   12.952885] md: bind<sdg>
Jul  6 08:43:25 nasty kernel: [   12.952981] md: bind<sdh>
Jul  6 08:43:25 nasty kernel: [   12.953078] md: bind<sdi>
Jul  6 08:43:25 nasty kernel: [   12.953169] md: bind<sdj>
Jul  6 08:43:25 nasty kernel: [   12.953288] md: bind<sda>
Jul  6 08:43:25 nasty kernel: [   12.953308] md: kicking non-fresh sdi from array!
Jul  6 08:43:25 nasty kernel: [   12.953314] md: unbind<sdi>
Jul  6 08:43:25 nasty kernel: [   12.960603] md: export_rdev(sdi)
Jul  6 08:43:25 nasty kernel: [   12.969675] raid5: device sda operational as raid disk 0
Jul  6 08:43:25 nasty kernel: [   12.969679] raid5: device sdj operational as raid disk 8
Jul  6 08:43:25 nasty kernel: [   12.969682] raid5: device sdh operational as raid disk 6
Jul  6 08:43:25 nasty kernel: [   12.969684] raid5: device sdg operational as raid disk 5
Jul  6 08:43:25 nasty kernel: [   12.969687] raid5: device sdf operational as raid disk 4
Jul  6 08:43:25 nasty kernel: [   12.969689] raid5: device sde operational as raid disk 3
Jul  6 08:43:25 nasty kernel: [   12.969692] raid5: device sdd operational as raid disk 2
Jul  6 08:43:25 nasty kernel: [   12.969694] raid5: device sdc operational as raid disk 1
Jul  6 08:43:25 nasty kernel: [   12.970536] raid5: allocated 9542kB for md127
Jul  6 08:43:25 nasty kernel: [   12.973975] 0: w=1 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973980] 8: w=2 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973983] 6: w=3 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973986] 5: w=4 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973989] 4: w=5 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973992] 3: w=6 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973996] 2: w=7 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.973999] 1: w=8 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul  6 08:43:25 nasty kernel: [   12.974002] raid5: raid level 5 set md127 active with 8 out of 9 devices, algorithm 2

不幸的是,這未被辨識,現在另一個驅動器被踢了(sde):

Jul 14 08:02:45 nasty kernel: [   12.918556] md: bind<sdc>
Jul 14 08:02:45 nasty kernel: [   12.919043] md: bind<sdd>
Jul 14 08:02:45 nasty kernel: [   12.919158] md: bind<sde>
Jul 14 08:02:45 nasty kernel: [   12.919260] md: bind<sdf>
Jul 14 08:02:45 nasty kernel: [   12.919361] md: bind<sdg>
Jul 14 08:02:45 nasty kernel: [   12.919461] md: bind<sdh>
Jul 14 08:02:45 nasty kernel: [   12.919556] md: bind<sdi>
Jul 14 08:02:45 nasty kernel: [   12.919641] md: bind<sdj>
Jul 14 08:02:45 nasty kernel: [   12.919756] md: bind<sda>
Jul 14 08:02:45 nasty kernel: [   12.919775] md: kicking non-fresh sdi from array!
Jul 14 08:02:45 nasty kernel: [   12.919781] md: unbind<sdi>
Jul 14 08:02:45 nasty kernel: [   12.928177] md: export_rdev(sdi)
Jul 14 08:02:45 nasty kernel: [   12.928187] md: kicking non-fresh sde from array!
Jul 14 08:02:45 nasty kernel: [   12.928198] md: unbind<sde>
Jul 14 08:02:45 nasty kernel: [   12.936064] md: export_rdev(sde)
Jul 14 08:02:45 nasty kernel: [   12.943900] raid5: device sda operational as raid disk 0
Jul 14 08:02:45 nasty kernel: [   12.943904] raid5: device sdj operational as raid disk 8
Jul 14 08:02:45 nasty kernel: [   12.943907] raid5: device sdh operational as raid disk 6
Jul 14 08:02:45 nasty kernel: [   12.943909] raid5: device sdg operational as raid disk 5
Jul 14 08:02:45 nasty kernel: [   12.943911] raid5: device sdf operational as raid disk 4
Jul 14 08:02:45 nasty kernel: [   12.943914] raid5: device sdd operational as raid disk 2
Jul 14 08:02:45 nasty kernel: [   12.943916] raid5: device sdc operational as raid disk 1
Jul 14 08:02:45 nasty kernel: [   12.944776] raid5: allocated 9542kB for md127
Jul 14 08:02:45 nasty kernel: [   12.944861] 0: w=1 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944864] 8: w=2 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944867] 6: w=3 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944871] 5: w=4 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944874] 4: w=5 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944877] 2: w=6 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944879] 1: w=7 pa=0 pr=9 m=1 a=2 r=9 op1=0 op2=0
Jul 14 08:02:45 nasty kernel: [   12.944882] raid5: not enough operational devices for md127 (2/9 failed)

現在陣列不再啟動。然而,似乎每個磁碟都包含 raid 元數據:

/dev/sda:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 8600bda9:18845be8:02187ecc:1bfad83a

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : e38d46e8 - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sdc:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : fe612c05:f7a45b0a:e28feafe:891b2bda

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : 32bb628e - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sdd:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 1d14616c:d30cadc7:6d042bb3:0d7f6631

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : 62bd5499 - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sde:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : active
   Device UUID : a2babca3:1283654a:ef8075b5:aaf5d209

   Update Time : Mon Jul 14 00:45:07 2014
      Checksum : f78d6456 - correct
        Events : 123123

        Layout : left-symmetric
    Chunk Size : 512K

  Device Role : Active device 3
  Array State : AAAAAAA.A ('A' == active, '.' == missing)


/dev/sdf:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : e67d566d:92aaafb4:24f5f16e:5ceb0db7

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : 9223b929 - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sdg:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 2cee1d71:16c27acc:43e80d02:1da74eeb

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : 7512efd4 - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sdh:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : c239f0ad:336cdb88:62c5ff46:c36ea5f8

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : c08e8a4d - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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


/dev/sdi:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : active
   Device UUID : d06c58f8:370a0535:b7e51073:f121f58c

   Update Time : Mon Jul 14 00:45:07 2014
      Checksum : 77844dcc - correct
        Events : 0

        Layout : left-symmetric
    Chunk Size : 512K

  Device Role : spare
  Array State : AAAAAAA.A ('A' == active, '.' == missing)


/dev/sdj:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : f2de262f:49d17fea:b9a475c1:b0cad0b7

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : dd0acfd9 - correct
        Events : 123132

        Layout : left-symmetric
    Chunk Size : 512K

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

但正如您所見,兩個驅動器(sde、sdi)處於活動狀態(但raid 已停止),sdi 是備用的。雖然 sde 的事件計數比大多數其他驅動器(123123 而不是 123132)略低,但 sdi 的事件計數為 0。所以我認為 sde 幾乎是最新的。但是sdi不…

現在我們在網上讀到硬關機可能會導致這些“踢不新鮮”的消息。確實,我的朋友造成了一兩次硬關機。所以我們按照我們在網上找到的說明,嘗試將 sde 重新添加到數組中:

$ mdadm /dev/md127 --add /dev/sde
mdadm: add new device failed for /dev/sde as 9: Invalid argument

但這失敗了,現在mdadm --examine /dev/sdesde 的事件計數也顯示為 0(+ 現在像 sdi 一樣是備用的):

/dev/sde:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : b8a04dbb:0b5dffda:601eb40d:d2dc37c9
          Name : nasty:stuff  (local to host nasty)
 Creation Time : Sun Mar 16 02:37:47 2014
    Raid Level : raid5
  Raid Devices : 9

Avail Dev Size : 7814035120 (3726.02 GiB 4000.79 GB)
    Array Size : 62512275456 (29808.18 GiB 32006.29 GB)
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
         State : clean
   Device UUID : 689e0030:142122ae:7ab37935:c80ab400

   Update Time : Mon Jul 14 00:45:35 2014
      Checksum : 5e6c4cf7 - correct
        Events : 0

        Layout : left-symmetric
    Chunk Size : 512K

  Device Role : spare
  Array State : AAA.AAA.A ('A' == active, '.' == missing)

我們知道 2 個故障驅動器通常意味著 raid5 的死亡。但是,有沒有辦法將至少 sde 添加到 raid 以便保存數據?

好的,看起來我們現在可以訪問突襲了。至少第一個檢查的文件看起來不錯。所以這就是我們所做的:


kernel.org wiki 上的raid 恢復文章為我們的問題提出了兩種可能的解決方案:

  1. 使用--assemble --force(也被derobert提到)

文章說:

$$ … $$如果事件計數相差小於 50,則驅動器上的資訊可能仍然正常。$$ … $$如果事件計數非常匹配但不完全匹配,請使用“mdadm –assemble –force /dev/mdX”強制 mdadm 組裝數組$$ … $$. 如果驅動器的事件計數遠未結束$$ … $$那個驅動器$$ … $$不應包含在程序集中。

在我們的例子中,驅動器sde的事件差異為 9。所以很有可能--force會起作用。然而,在我們執行--add命令後,事件計數下降到 0,驅動器被標記為備用。

所以我們最好不要使用--force. 2. 重新創建數組

這個解決方案被明確標記為危險,因為如果你做錯了,你可能會失去數據。然而,這似乎是我們唯一的選擇。

這個想法是在現有的 raid 設備上創建一個新的 raid(即覆蓋設備的超級塊),並使用與舊 raid 相同的配置,並明確告訴 mdadm 該 raid 已經存在並且應該假定為乾淨。

由於事件計數差異僅為 9,唯一的問題是我們失去了超級塊,sde因此編寫新的超級塊很有可能讓我們訪問我們的數據……而且它奏效了 :-)


我們的解決方案

注意:此解決方案專門針對我們的問題,可能不適用於您的設置。您應該記下這些筆記,以了解如何完成這些事情。但是您需要研究什麼是最適合您的情況。

備份

我們已經失去了一個超級塊。所以這次我們sd[acdefghij]在進行 raid 之前使用 dd 保存了每個 raid 設備 () 的第一個和最後一個 GB。我們對每個 raid 設備都這樣做了:

# save the first gigabyte of sda
dd if=/dev/sda of=bak_sda_start bs=4096 count=262144

# determine the size of the device
fdisk -l /dev/sda
# In this case the size was 4000787030016 byte.

# To get the last gigabyte we need to skip everything except the last gigabyte.
# So we need to skip: 4000787030016 byte - 1073741824 byte = 3999713288000 byte
# Since we read blocks auf 4096 byte we need to skip 3999713288000/4096=976492502 blocks.
dd if=/dev/sda of=bak_sda_end bs=4096 skip=976492502

收集資訊

重新創建raid 時,使用與舊raid 相同的配置很重要。如果您想使用不同的 mdadm 版本在另一台機器上重新創建陣列,這一點尤其重要。在這種情況下,mdadm 的預設值可能不同,並且可能創建不適合現有團隊的超級塊(請參閱 wiki 文章)。

在我們的例子中,我們使用相同的機器(因此使用相同的 mdadm-version)來重新創建數組。然而,數組首先是由第 3 方工具創建的。所以我們不想在這裡依賴預設值,不得不收集一些關於現有團隊的資訊。

從我們的輸出中mdadm --examine /dev/sd[acdefghij]我們得到了關於 raid 的以下資訊(注意:sdb 是包含作業系統的 ssd 並且不是raid 的一部分):

    Raid Level : raid5
  Raid Devices : 9
 Used Dev Size : 7814034432 (3726.02 GiB 4000.79 GB)
   Data Offset : 2048 sectors
  Super Offset : 8 sectors
        Layout : left-symmetric
    Chunk Size : 512K
  Device Role : Active device 0

Used Dev Size512 字節的塊為單位。你可以檢查一下:

7814034432*512/1000000000 ~= 4000.79

但是 mdadm 需要千比字節的大小:7814034432*512/1024 = 3907017216

重要的是Device Role. 在新的 RAID 中,每個設備都必須具有與以前相同的角色。在我們的例子中:

device  role
------  ----
sda     0
sdc     1
sdd     2
sde     3
sdf     4
sdg     5
sdh     6
sdi     spare
sdj     8

注意:驅動器號(因此順序)可以在重新啟動後更改!

下一步我們還需要佈局和塊大小。

重新創建raid

我們現在可以使用上一步的資訊重新創建陣列:

mdadm --create --assume-clean --level=5 --raid-devices=9 --size=3907017216 \
   --chunk=512 --layout=left-symmetric /dev/md127 /dev/sda /dev/sdc /dev/sdd \
   /dev/sde /dev/sdf /dev/sdg /dev/sdh missing /dev/sdj

以正確的順序傳遞設備很重要!

此外,我們沒有添加sdi,因為它的事件計數太低。所以我們將第 7 個突襲插槽設置為missing. 因此,raid5 包含 9 個設備中的 8 個,並將以降級模式組裝。並且由於它缺少備用設備,因此不會自動開始重建。

然後我們用來--examine檢查新的超級塊是否適合我們的舊超級塊。它確實做到了:-) 我們能夠掛載文件系統並讀取數據。下一步是備份數據,然後重新添加sdi並開始重建。

引用自:https://unix.stackexchange.com/questions/146628