CentOS複数パーティションでSoftwareRAIDを構築してみる

#はじめに
- CentOSのディスク上で複数パーティションを用意して、RAIDアレイを構築してみる
- 実行環境
 - 対象OS：centos7
 - 対象デバイス：外付けHDD

#RAID用パーティションの作成

#####ディスクの確認
`/dev/vdb`をRAID構築用デバイスとして使用します

```
# fdisk -l
（一部省略）
Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```

#####パーティションの作成
パーティションタイプは「fd」に設定する
※同様に`/dev/vdb2`,`/dev/vdb3`,`/dev/vdb4`も作成しておきます

```
# fdisk /dev/vdb
（一部省略）
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p 
Partition number (1-4, default 1): 1
First sector (2048-83886079, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83886079, default 83886079): 20000000
Partition 1 of type Linux and of size 9.5 GiB is set

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# fdisk -l /dev/vdb
Disk /dev/vdb: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0f36cd1b

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048    20000000     9998976+  fd  Linux raid autodetect
```

#RAIDアレイの作成
`/dev/vdb1`と `/dev/vdb2`がアクティブなデバイス、`/dev/vdb3`がスペアデバイスとして構成されるRAID1(ミラーリング)のRAIDアレイ`/dev/md0`を作成する。
`-C`でmdデバイス名
`-l`でRAIDレベル
`-n`でアクティブなデバイス数
`-x`でスペアデバイス数
を指定する。

```
# mdadm -C /dev/md0 -l 1 -n 2 -x 1 /dev/vdb1 /dev/vdb2 /dev/vdb3
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
```

#RAIDアレイの確認
`/proc/mdstat`ファイルもしくは、mdsatの`-Q`, `-D`オプションでRAID状態を確認する。

```
# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 vdb3[2](S) vdb2[1] vdb1[0]
      9989760 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>

# mdadm -Q /dev/md0 
/dev/md0: 9.53GiB raid1 2 devices, 1 spare. Use mdadm --detail for more detail.

# mdadm -D /dev/md0 
/dev/md0:
           Version : 1.2
     Creation Time : Sun Sep 29 11:43:01 2019
        Raid Level : raid1
        Array Size : 9989760 (9.53 GiB 10.23 GB)
     Used Dev Size : 9989760 (9.53 GiB 10.23 GB)
      Raid Devices : 2
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Sun Sep 29 11:48:47 2019
             State : clean 
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

Consistency Policy : resync

              Name : comsec-cent01:0  (local to host comsec-cent01)
              UUID : bd6006bb:a653fb7d:a884192f:01cd9a65
            Events : 17

    Number   Major   Minor   RaidDevice State
       0     252       17        0      active sync   /dev/vdb1
       1     252       18        1      active sync   /dev/vdb2

       2     252       19        -      spare   /dev/vdb3
```

#RAID構成デバイスの変更（デバイスが故障した時など）
`/dev/vdb2`に不良マークをつける（故障したとする）。
`vdb2`に不良マーク（F）が付き、vdb3がアクティブとなっていることが確認できる。

```
# mdadm --manage /dev/md0 -f /dev/vdb2
mdadm: set /dev/vdb2 faulty in /dev/md0

# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 vdb3[2] vdb2[1](F) vdb1[0]
      9989760 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>
```

故障した`/dev/vdb2`をRAIDアレイから削除する

```
# mdadm --manage /dev/md0 -r /dev/vdb2
mdadm: hot removed /dev/vdb2 from /dev/md0

# cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md0 : active raid1 vdb3[2] vdb1[0]
      9989760 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>
```

新しい`/dev/vdb4`をRAIDアレイに追加する

```
# mdadm --manage /dev/md0 -a /dev/vdb4
mdadm: added /dev/vdb4

# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 vdb4[3](S) vdb3[2] vdb1[0]
      9989760 blocks super 1.2 [2/2] [UU]
      
unused devices: <none>
```

#システム再起動に自動認識する方法
以下の通り、`/etc/mdadm.conf`を作成する。
`mdadm -D --scan`コマンドで現在のアレイ情報が出力されるので、設定ファイルに記載する。

```
# echo "DEVICE partitions" >> /etc/mdadm.conf
# mdadm  -D --scan >> /etc/mdadm.conf 
# cat /etc/mdadm.conf 
DEVICE partitions
ARRAY /dev/md0 metadata=1.2 spares=1 name=comsec-cent01:0 UUID=bd6006bb:a653fb7d:a884192f:01cd9a65
```