mdadmで運用しているraid5のディスク交換

# 環境
CentOS Linux release 7.7.1908 (Core)
mdadm - v4.1 - 2018-10-01
3TB HDD x 4台 で raid5 を構築済み

# 目標
この内の1台を 6TB の HDD に置き換える。
※ゆくゆくは残りも全て 6TB HDD に置き換えて容量増加を図る。

# 事前確認
### /dev/md0 のファイルシステムを確認
`# df -T` -> ext3 であることを確認。
### 現在のraid状態
`# mdadm --detail /dev/md0` -> sdb1,sdc1,sdd1,sde1 の4台で構成されていることを確認。今回は正常だがもし故障などしていればここでFailed Devicesとして表示されるはず。
### マウントされているデバイスのパーティション情報を表示
`# fdisk -l` -> 全部出る。
`# fdisk -l /dev/sdb1` -> GPTフォーマットであることを確認。
### SMART情報確認
`# smartctl -a /dev/sdb1` -> hddのモデル名やシリアル番号などを確認。

# 交換
### mdadm で、取り外したいディスクに故障マークを付けてから切り離し
`# mdadm --fail /dev/md0 /dev/sdb1` -> md0 の sdb1 を故障とする
`# mdadm --remove /dev/md0 /dev/sdb1` -> md0 の sdb1 を切り離す
### 縮退していることを確認

```
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[4] sdd1[2] sdc1[1]
      8790398976 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]
      bitmap: 1/22 pages [4KB], 65536KB chunk

unused devices: <none>
```

### マシンをシャットダウンして sdb1 のディスクを 新規ディスクと入れ替える
モデル名、シリアル番号を確認して間違えないように。

### マシンを起動して新規ディスクのデバイス名を確認
`# fdisk -l` -> １つだけ6TBの表示。どうやら/dev/sdb のままらしい。
`# smartctl -a /dev/sdb` -> モデル名、シリアルが交換したものと一致。

### 新規ディスクをフォーマット

```
# parted /dev/sdb
GNU Parted 3.1
/dev/sdb を使用
GNU Parted へようこそ！ コマンド一覧を見るには 'help' と入力してください。
(parted) mklabel gpt
(parted) unit GB
(parted) mkpart primary ext3 0% 100%
(parted) set 1 raid on
(parted) p
モデル: ATA WDC WD60EZAZ-00S (scsi)
ディスク /dev/sdb: 6001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    0.00GB  6001GB  6001GB                    primary  raid

(parted) q
```
mklabel gpt … ラベルを gpt に。
unit GB … デフォルトの単位を GB に。
mkpart primary ext3 0% 100% … 全領域をext3でプライマリとするパーティションを作成。
set 1 raid on … 指定したパーティションに raid フラグを設定。
p … print
q … quit

### 新規ディスクを raid に編入

```
# mdadm --add /dev/md0 /dev/sdb1
mdadm: added /dev/sdb1
```
応答が返ってくるのがちょっとだけ時間がかかる。信じて待つ。

### 再構築が完了するのを待つ

```
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[5] sde1[4] sdd1[2] sdc1[1]
      8790398976 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]
      [>....................]  recovery =  0.0% (1152640/2930132992) finish=4674.6min speed=10442K/sec
      bitmap: 0/22 pages [0KB], 65536KB chunk

unused devices: <none>
```
4674分… 78時間…!?
信じて待つ。

##### (2022.04.02追記)構築速度を上げる方法

どうやら speed_limit_min という設定に引っ張られるらしい。
動的に変更してやると構築速度が向上する。

```
# cat /proc/sys/dev/raid/speed_limit_min
1000
# echo 100000 > /proc/sys/dev/raid/speed_limit_min
# cat /proc/sys/dev/raid/speed_limit_min
100000
```
システムを再起動すると元に戻る。恒久設定は /etc/sysctl.conf に書き込む
```
# vi /etc/sysctl.conf 
(以下の行を追加)
dev.raid.speed_limit_min=100000
```



# 今後

同様にして sdc sdd sde も 6TB HDD に入れ替え。
全ディスクが 6TB HDD になったら 容量を拡張する。

```
# mdadm --grow /dev/md0 --size=max
# resize2fs -p /dev/md0
```
でいけるらしい(未確認)。

##### (2022.04.09追記)全ディスクを交換し終えたので拡張を実施

```
# mdadm --grow /dev/md0 --size=max
mdadm: component size of /dev/md0 has been set to 5860388864K
#
```
プロンプトはすぐ戻ってくるが、裏で再構築が走る。
50%から開始されたのは 3TB->6TB での追加領域のみの構築だからか？
```
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdb1[5] sde1[4] sdd1[7] sdc1[6]
      17581166592 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [==========>..........]  resync = 50.5% (2964709248/5860388864) finish=680.4min speed=70929K/sec
      bitmap: 11/22 pages [44KB], 131072KB chunk

unused devices: <none>
```
再構築が完了してもまだ容量は増えない。
```
# df -h | grep md0
/dev/md0                  8.2T  7.7T   40G  100% /data
```
ext3なので /dev/md0 に対して resize2fs を実施することで拡張を試みる … が怒られる。
New size too large to be expressed in 32 bits

ファイルシステムを ext3->ext4 にすることで解決を図る (別記事にしました)。

https://qiita.com/t_mozomozo/items/665bde55e2db22911039