softwareRAID上にCentOS7をインストールしたらHDD交換時にハマった件

softwareRAIDで作成したディスクにCentOS7をインストールしたら、HDDを交換しようとした時にハマってしまったので、その時の顛末を備忘録として残して置きます。

### 構成について

構成としてはASROCK製のJ4205-ITXというmini-ITX規格のマザーボードをATXタイプのケースに入れて使っています。
これはファイルサーバーとして使うために大容量のHDDを複数台詰みたいのと、24時間可動させるので省電力かつファンレスなマザーボードを使いたいからという理由からです。

いままではSATA接続の容量3TBの3.5インチHDDを2台接続して使っていました。

毎週末にワンコの写真を撮ったり、月に1,2度ペースでバイクレースの写真を撮ったものを保存していたら、あっという間に空き容量が無くなってしまったので6TB容量のHDDを2台用意して、今使っているHDDと入れ替えることにしました。

ちなみに、現行環境としては/boot,/boot_efi,/をすべてLinux標準のsoftwareRAIDでRAID1で構成したパーテーション上にファイルシステムを作成して使用していました。

当初、予定していた手順は

1.OSを停止。
2.HDDを1台だけ6TBのHDDに入れ替える。
3.OSを起動。
4.交換したHDDにパーテーションを切る。
5.新しく切ったパーテーションを追加する。
6.同期が完了するのを待つ。
7.OSを停止。
8.もう1台のHDDも6TB容量のHDDに交換する。
9.交換したHDDにパーテーションを切る。
10.新しく切ったパーテーションを追加する。
11.同期が完了するのを待つ。
12.アレイの拡張する。
13.ファイルシステムの拡張を行う。
14。空き容量が増えるヽ(｀▽´)/

でした。

### ディスクを外したらOSの起動が止まってしまう。

早速、予定通りにHDDを入れ替えてサーバの電源をいれたらOSの起動途中で停止してしまいました。

過去に同じような構成で使っていた時は、上記の手順で問題なく入れ替えできていたんですけどね。

いちど失敗した時は、新しく追加したHDDのMBRにgrubのインストールをしていなかったのが原因だったので、UEFIの設定をみてみましたがどう設定してもうまくいきません。
そこでVMwarePlayerを使用して環境を再現して検証してみたら、するとやはり2台目のHDDを削除すると同じ様に起動途中で停止してしまいます。

どうやらCentOS7で使われているsoftwareRAIDが悪さをしているようです。

### 事前に故障として記録してしまう
検証を繰り返していると実際にHDDは故障していなくても、mdadmコマンドで2台目のHDDを強制的に故障状態として記録してアレイから外した状態にしてからOSを再起動すると無事に立ち上がることが分かりました。

まずは現在どのデバイスがRAIDに参加しているのか確認して
```
cat /proc/mdstat
```

外す予定のディスクを故障として記録してしまいます。
```
mdadm --manage /dev/md125 --fail /dev/sdb1
mdadm --manage /dev/md126 --fail /dev/sdb2
mdadm --manage /dev/md127 --fail /dev/sdb3
```

ということで、故障状態に設定にした後にOSを停止してHDDを入れ替えて起動。

### 入れ替え作業
無事に起動したら、残したHDDのパーテーションテーブルを参考にして、新しいHDDのパーテーションを切ります。

```
gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D507870E-A057-4A5A-8061-72F3F99B5D20
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          507903   247.0 MiB   FD00  Linux RAID
   2          507904          759807   123.0 MiB   FD00  Linux RAID
   3          759808        41940991   19.6 GiB    FD00  Linux RAID

```
*参考の為に仮想環境で実行した結果を載せておきます。

```
gdisk /dev/sdb
```
パーテーションタイプは元のHDDと同様にFD00にします。

パーテーションが切り終わったら、

```
cat /proc/mdstat
```
レイドアレイの状況を確認して、アレイにパーテーションを追加していきます。

```
mdadm -a /dev/md125 /dev/sdb1
mdadm -a /dev/md126 /dev/sdb2
mdadm -a /dev/md127 /dev/sdb3
```
この時に容量の少ないアレイから順に実施しておくと精神的に安心できそうです。
（一度に再構築されるアレイはひとつづつみたいなので）
追加が終わったらアレイの同期が完了するのを待ちます。

```
cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 sda1[3] sdb1[1]
      251904 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md126 : active raid1 sdb2[1] sda2[3]
      125888 blocks super 1.0 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk


md127 : active raid1 sdb3[1] sda3[3]
      20573184 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>
```

### 空き容量の拡張
完了後に、アレイの拡張を行います。
ルートパーティションに割り当てられているアレイを指定して以下のコマンドを実行します。

```
mdadm --grow /dev/md127 -z max
cat /proc/mdstat
```
アレイの拡張が終わるのをまって、続いてファイルシステムの拡張を行います。

```
xfs_growfs /
```
ちなみに、xfsは拡張のみ対応で、縮小は出来ないので注意してください。

最後に、ファイルシステムの空き容量が増えているのを確認しましょう。

```
df -h
```
### さらなる課題

しかし、今回の様に事前に取り外すことが分かっている場合は良いけど、実際には故障してから交換すること方が普通だと思うので、さらに調査しました。
以下の手順で起動できるようになることが分かりました。

### 起動できるようにする
2台目のHDDが見つからずにinactiveになっているアレイを停止する。

```
mdadm --stop --scan
```
HDD単体でアレイを組み直す。

```
mdadm --assemble /dev/md125 /dev/sda1
mdadm --assemble /dev/md126 /dev/sda2
mdadm --assemble /dev/md127 /dev/sda3
```
単体にしたアレイを起動する。

```
mdadm --run /dev/md125
mdadm --run /dev/md126
mdadm --run /dev/md127
```
この状態で再起動すれば単体で作られたRAIDアレイをマウントして起動してくれるようになります。

### とりあえず起動した
しかし、ディスク単体で冗長化されていないので同容量かより大容量のHDDを用意して追加してあげたいところです。さらに言えば、交換用のHDDも準備しておきたいですが、amazonプライム会員なら、お急ぎ便を使うと早ければ当日、遅くても翌日には配送して貰えるのであえて用意する意義も少ないですけどね。