mdadm raid5 の復旧

※CUIでの操作を前提に書いています。
# PCの構成
OS:Ubuntu 18.04.2 LTS

/dev/sda1 : システムパーティション
/dev/md1 : データ用パーティション、raid5、3TB x4 + spare 3TB x1
 - /dev/sdb1 : md1 active device　←　今回破損したHDD
 - /dev/sdc1 : md1 active device
 - /dev/sdd1 : md1 active device
 - /dev/sde1 : md1 active device
 - /dev/sdf1 : md1 spare device

 
# RAID破損の経緯
md1の中身を操作していると、突然cdコマンドが利かなくなり、ディレクトリ移動できなくなる。

再起動すると、OSがエマージェンシーモードでしか立ち上がらなくなる。

ubuntuの入ったbootable usbを用意し、これを起動して、sda1から必要なファイルを抜いてsdaにOSを再インストール。

インストール後、mdadmでraidディスクを調べると…

# 症状
raidパーティション名がmd127となっている。
raidデバイス/dev/mdが存在しない。
md127はマウントできない。
mdadm --detail で見ると、raid5で組んでいたはずのアレイが、raid0と表示され、しかもinactiveとなっている。

```:terminal
$ sudo mdadm --detail /dev/md127

        Version : 1.2
     Raid Level : raid0
  Total Devices : 5
    Persistence : Superblock is persistent

          State : inactive
Working Devices : 5

           Name : xxxx:1
           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 12583

Number  Major  Minor RaidDevice
  -       8      xx      -        /dev/sdf1
  -       8      xx      -        /dev/sde1
  -       8      xx      -        /dev/sdd1
  -       8      xx      -        /dev/sdc1
  -       8      xx      -        /dev/sdb1
```

xxは伏せ字

# 復旧手順
まず、異常のある構成デバイスを探す。（sdb1を例として記載）

```:terminal
$ sudo mdadm --examine /dev/sdb1

        Magic : a92b4efc
      Version : 1.2
  Feature Map : 0x1
   Array UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Name : xxxx:1
Creation Time : Sun Dec 11 21:09:08 2016
   Raid Level : raid5
 Raid Devices : 4
     .
     . (省略)
     .
  Device Role : Active device 3
  Array State : ...A ('A' == active, '.' == missing, 'R' == replacing)
```

Array Stateの行から、sdb1に異常があることがわかる。
sdb1以外の構成デバイスのArray stateはAAAAだった。

raid5なので、HDD１基が壊れても復旧できることを信じ、sdb1以外でアレイを構成する。そのためにmd127を止める。

```:terminal
$ sudo mdadm --stop /dev/md127

mdadm: stopped /dev/md127
```

sdb1以外でassembleする。

```:terminal
$ sudo mdadm --assemble /dev/md127 /dev/sdc1

mdadm: /dev/md127 assembled from 1 drive - not enough to start the array.

$ sudo mdadm --assemble /dev/md127 /dev/sdd1

mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 2 drives - not enough to start the array.

$ sudo mdadm --assemble /dev/md127 /dev/sde1

mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 3 drives - need all 4 to start it (use --run to insist).

$ sudo mdadm --assemble /dev/md127 /dev/sdf1

mdadm: Merging with already-assembled /dev/md/xxxx:1
mdadm: /dev/md/xxxx:1 assembled from 3 drives and 1 spare - need all 4 to start it (use --run to insist).

```
アレイをrunする。

```:terminal
$ sudo mdadm --run /dev/md127

mdadm: started array /dev/md/xxxx:1
```

アレイのdetailを確認する。

```:terminal
$ sudo mdadm --detail /dev/md127

           Version : 1.2
     Creation Time : Sun Dec 11 21:09:08 2016
        Raid Level : raid5
        Array Size : 8781616128 (8374.80 GiB 8992.37 GB)
     Used Dev Size : 2927205367 (2791.60 GiB 2997.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Mon Jul 22 23:26:15 2019
             State : clean, degraded
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

           Name : xxxx:1
           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 12583

Number  Major  Minor RaidDevice State
  0       8      xx      0      active sync  /dev/sdc1
  1       8      xx      1      active sync  /dev/sde1
  3       8      xx      2      active sync  /dev/sdd1
  -       0      0       3      removed
         
  4       8      xx      -      spare  /dev/sdf1
```

この後、何もせずともspare rebuildingが始まり、復旧を完了した。

# おまけ　外した構成デバイスをフォーマットしてraidアレイに戻す
※HDDがハード的に生きていると確認できた場合のみ。

パーティションsdb1を削除し、GPTパーティションテーブルを作成する。

```:terminal
$ sudo fdisk /dev/sdb
```
```:fdisk
コマンド (m でヘルプ): g
新しい GPT ディスクラベル (GUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) を作成しました。
```

sdbにパーティションを作成する。

```:terminal
コマンド (m でヘルプ): n
パーティション番号 (1-128, 既定値 1): 
最初のセクタ (2048-5860533134, 既定値 2048): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-5860533134, 既定値 5860533134): 

新しいパーティション 1 をタイプ Linux filesystem、サイズ 2.7 TiB で作成しました。
パーティション #1 には linux_raid_member 署名が書き込まれています。

署名を削除しますか？ [Y]es/[N]o: Y

署名は write (書き込み)コマンドを実行すると消えてしまいます。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

```
riadアレイにsdb1をaddする。

```:terminal
$ sudo mdadm --manage /dev/md127 --add /dev/sdb1
```

mdadm.confを更新するため、mdadm.confのパーミッションを変更する。
（super userでログインしている場合は不要）

```:terminal
$ sudo chmod 647 /etc/mdadm/mdadm.conf
```

mdadm.confにraidアレイの最新情報を書き込む。

```:terminal
$ sudo mdadm --detail /dev/md127 --brief >> /etc/mdadm/mdadm.conf 
```

最後に、パーミッションを戻す。

```:terminal
$ sudo chmod 644 /etc/mdadm/mdadm.conf
```
mdadm.confに古いアレイの情報がある場合は削除を忘れずに。
mdadm.confでraidアレイのパーティション名を変更すれば、--scanをつかって--assembleし直したときにパーティション名が変わる。

以上。




2022/11/9 追記
またこの記事に助けられた。これで何回目だろう。多分５回目。うちの趣味サーバーはよくクラッシュする。今回はRAID5のチェックを回しながら、サーバー内部のFANの角度を調整していたらSATAケーブルに触れて活電挿抜してしまったらしく、OSがクラッシュした。OS再インストール後にRAIDを復旧してみると、もともとアクティブだったHDD 2枚がbusyでassembleできず、顔面蒼白。誤って触ってしまったSATAカードを交換してみたところ、何故か、HDD 1枚が復活、ギリギリのところで復旧させられた。最後まで諦めない大切さを改めて感じた。本当に焦った。もうRAIDチェックを回しながらPCの蓋は開けない。それと2ポートのSATAカードを使う場合はRAID6で組んだほうがいいのかも。カードが原因でHDD 2枚がお亡くなりになっても復旧できるだろうから。