mdadm(SoftwareRAID) の構築と運用  CentOS7

# はじめに

通常、物理的なサーバには RAIDカードが搭載されており、RAIDカード側でRAIDを構成します。
しかし、様々な理由でRAIDカードが使用出来ない場合、LinuxOS側でSoftwareRAIDを構成する選択肢があります。
今回は、CentOSでSoftwareRAIDを構成する方法を確認して行きます。

以下の観点で確認して行きます。



- LinuxOS側でSoftwareRAIDを構成する方法
- SoftwareRAIDでXFSファイルシステムを構成
- RAIDを構成したDiskの障害対応
- ブロックデバイスを追加した際に、XFSファイルシステムに拡張する方法



# SoftwareRAIDの構成

## 仮想マシンの準備

まず、検証のためにESXiで仮想マシンを作成し、5GBのHDDを2個接続します。

下記の /dev/sdb, /dev/sdc を fdisk で確認します

```
[root@sugi-swraid ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 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

[root@sugi-swraid ~]# 
[root@sugi-swraid ~]# fdisk -l /dev/sdc

Disk /dev/sdc: 5368 MB, 5368709120 bytes, 10485760 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

```



## mdadm の構成

CentOSでSoftwareRAIDを構成するために mdadm をインストールします

```
yum install mdadm
```





依存関係メモ

```
============================================================================================================================================
 Package                                 Arch                      Version                                    Repository               Size
============================================================================================================================================
Installing:
 mdadm                                   x86_64                    4.0-5.el7                                  base                    428 k
Installing for dependencies:
 libreport-filesystem                    x86_64                    2.1.11-38.el7.centos                       base                     39 k

Transaction Summary
============================================================================================================================================
```



mdadm で mdデバイスを作成する際に、管理をわかりやすくするため、名前を付与します。
名前を付与する場合は、/dev/md/<指定した名前> で device にアクセスすることが出来ます。
/dev/md のディレクトリは、mdデバイスを作成後にマシンを再起動すると自動的に作成されますが、手動で作成することも出来ます。

```
mkdir /dev/md/
```



/dev/sdb, /dev/sdc を使用して ソフトウェアRAID として、 /dev/dev/<任意の名前> を作成します

--create で与える名前と、 --name で与える名前は一致しておく必要があります。一致していない場合は、マシンを再起動したときに、--createで指定したデバイスファイルの方が削除されます。

```
md_name=test-md-one
mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdb /dev/sdc
```



実行例

```
[root@sugi-swraid ~]# md_name=test-md-one
[root@sugi-swraid ~]# mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdb /dev/sdc
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/test-md-one started.
```





以下のコマンドで mdadm の構成を保存します
保存しない場合でも動作はしますが、マシン再起動時にmdのデバイスファイルの名前を動的に構成してしまい、fstabなどで静的にマウントを指定することが出来なくなる可能性があります。

例えば、新規作成時は、/dev/md0 だったデバイスファイル名が、再起動すると /dev/md127 に自動的に変更されてしまうことがあります。

```
mdadm --detail --scan > /etc/mdadm.conf
```



以下コマンドで md0 を確認することが出来ます

```
[root@sugi-swraid ~]# mdadm --detail --scan
ARRAY /dev/md/test-md-one metadata=1.2 name=test-md-one UUID=360c38d4:dba3aa34:cea5c0b3:25d3df91
```



また、以下のコマンドで詳細を確認することが出来ます

```
[root@sugi-swraid ~]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 17:27:54 2018
             State : clean, resyncing 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

     Resync Status : 44% complete

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 7

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
```



なお、以下コマンドで作成した md を削除することが出来ます　

```
mdadm --stop /dev/md/test-md-one
mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc
rm /etc/mdadm.conf
```



# LVMの構成

mdadm を使用してRAID 1 で構成しているため、mdadm だけでは容量の拡張が出来ません。
そこで、LVMを使用することで、mdadmでRAID1を構成した時にも容量拡張を容易に出来るようにします。

```
pvcreate /dev/md/test-md-one
vgcreate test-vg /dev/md127
lvcreate -n test-lv01 -l 100%FREE test-vg
```



以下のように作成されています

```
[root@sugi-swraid mapper]# pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/md127 test-vg lvm2 a--    4.99g    0 
  /dev/sda2  cl      lvm2 a--  <15.00g    0 
[root@sugi-swraid mapper]# 
[root@sugi-swraid mapper]# vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  cl        1   2   0 wz--n- <15.00g    0 
  test-vg   1   1   0 wz--n-   4.99g    0 
[root@sugi-swraid mapper]# 
[root@sugi-swraid mapper]# lvs
  LV        VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root      cl      -wi-ao---- 13.39g                                                    
  swap      cl      -wi-ao----  1.60g                                                    
  test-lv01 test-vg -wi-a-----  4.99g        
```



# ファイルシステム(XFS)の作成

ファイルシステムを作成します

```
mkfs.xfs /dev/mapper/test--vg-test--lv01
```

実行例

```
[root@sugi-swraid mapper]# mkfs.xfs /dev/mapper/test--vg-test--lv01
meta-data=/dev/mapper/test--vg-test--lv01 isize=512    agcount=4, agsize=327168 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1308672, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```



ファイルシステムのマウント

```
mkdir /mnt/md-fs
mount /dev/mapper/test--vg-test--lv01 /mnt/md-fs
```



df で確認

/dev/mapper/test--vg-test--lv01はシンボリックリンクになっており、/dev/md2 とリンクされています

```
[root@sugi-swraid mapper]# df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/cl-root               14G  1.6G   12G  12% /
devtmpfs                         910M     0  910M   0% /dev
tmpfs                            920M     0  920M   0% /dev/shm
tmpfs                            920M  8.5M  912M   1% /run
tmpfs                            920M     0  920M   0% /sys/fs/cgroup
/dev/sda1                       1014M  289M  726M  29% /boot
tmpfs                            184M     0  184M   0% /run/user/0
/dev/mapper/test--vg-test--lv01  5.0G   33M  5.0G   1% /mnt/md-fs   <----- ここ
```



fstabの作成

```
vim /etc/fstab
```



```
#
# /etc/fstab
# Created by anaconda on Sun Feb 18 13:20:47 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=70d9b6ea-dd71-4528-bcd3-2ba8b2497627 /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

# add
/dev/mapper/test--vg-test--lv01   /mnt/md-fs              xfs     defaults        0 0
```



再起動を実施して、mountされているか確認します

```
[root@sugi-swraid ~]# df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/cl-root               14G  1.6G   12G  12% /
devtmpfs                         910M     0  910M   0% /dev
tmpfs                            920M     0  920M   0% /dev/shm
tmpfs                            920M  8.5M  912M   1% /run
tmpfs                            920M     0  920M   0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01  5.0G   33M  5.0G   1% /mnt/md-fs    <----- ここ
/dev/sda1                       1014M  289M  726M  29% /boot
tmpfs                            184M     0  184M   0% /run/user/0
```



# SoftwareRAIDを構成したDiskの障害対応

## 障害時の挙動確認

/dev/md/test-md-one は、 /dev/sdb, sdc で RAID1(ミラーリング)を構成しています。

片方のDiskに障害が発生した際の挙動と、復旧方法を確認します。

まず、下記コマンドで正常に稼働していることを確認します

```
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 17:46:10 2018
             State : active 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 20

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
```



sdc を ESXi 上から接続を切断します。

![swraid-000.png](https://qiita-image-store.s3.amazonaws.com/0/104247/6d708450-d55c-c118-67b9-c1bc8ec92e5e.png)



mdadm で状態を確認すると、working device が1個となっており、かつ、sdc が表示されていた場所は　removed となっています

```
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 18:02:12 2018
             State : active, degraded 
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 21

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       -       0        0        1      removed
```



SoftwareRAIDを構成しているので、マウントしているファイルシステム上では、正常にI/O を実行することが出来ます

```
[root@sugi-swraid md-fs]# echo "mieru?" > /mnt/md-fs/test.txt
[root@sugi-swraid md-fs]# cat /mnt/md-fs/test.txt
mieru?
```





## 復旧手順

ESXi で同じ容量のデバイスを新規作成し、 /dev/sdc として認識します

mdadm側の構成としては、変わらず片系障害のままです

```
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 18:02:12 2018
             State : active, degraded 
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 21

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       -       0        0        1      removed
```



/dev/md/test-md-one に sdc を追加します。

```
mdadm --add /dev/md/test-md-one /dev/sdc
```

実行例

```
[root@sugi-swraid dev]# mdadm --add /dev/md/test-md-one /dev/sdc
mdadm: added /dev/sdc
```



確認します

/dev/sdc が追加され、rebuilding されていることを確認できます
Rebuild Status に 進捗率も表示されています

```
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 18:12:48 2018
             State : active, degraded, recovering 
    Active Devices : 1
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 1

Consistency Policy : resync

    Rebuild Status : 28% complete

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 27

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       32        1      spare rebuilding   /dev/sdc
```



一定時間後、 sdc が active sync となっていると、正常にrebuild が完了したことを確認できます

```
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 17:27:11 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 18:13:49 2018
             State : active 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : test-md-one
              UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
            Events : 40

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       32        1      active sync   /dev/sdc
```



再構築後、mdadmの構成ファイルを更新します

```
mdadm --detail --scan > /etc/mdadm.conf
```



# ファイルシステムの容量拡張

以下のレイヤーを分けて、ファイルシステムを作成しました。

ブロックデバイス → mdadmでデバイスファイル作成 → LVMでdevicemapperにLVを作成 → XFSでファイルシステムを作成 → Linux OS としてマウント

容量を増やすときには、いくつか選択肢がありますが、今回は、新たにDiskを追加する方式で確認を行います。
上記の構成でいうと、mdadm で新たな RAID 1 のデバイスを作成します。
その後、LVMを介してファイルシステムを 5G → 10G へ拡張します。

ESXiを操作し、5GBのHDDを2個追加します。
/dev/sdd, /dev/sde と認識されています。



現在の設定確認

```
[root@sugi-swraid ~]# mdadm --detail /dev/md/test-md-one 
/dev/md/test-md-one:
           Version : 1.2
     Creation Time : Sun Jun 17 21:13:05 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 21:28:25 2018
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : test-md-one
              UUID : 3324eacd:48732953:9bb57bd7:f2035acd
            Events : 19

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
```



mdadm を使用して、新たな RAID 1 デバイスを作成します

```
md_name=test-md-two
mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdd /dev/sde
```



確認

```
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-two
/dev/md/test-md-two:
           Version : 1.2
     Creation Time : Sun Jun 17 21:34:05 2018
        Raid Level : raid1
        Array Size : 5238784 (5.00 GiB 5.36 GB)
     Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jun 17 21:34:29 2018
             State : clean, resyncing 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

     Resync Status : 35% complete

              Name : test-md-two
              UUID : 9cdd3b87:8f22ad85:f7bd6fff:64b57c47
            Events : 5

    Number   Major   Minor   RaidDevice State
       0       8       48        0      active sync   /dev/sdd
       1       8       64        1      active sync   /dev/sde
```



/dev/md/test-md-two を使用して、5GBの RAID 1 デバイスが作成出来ました。
それでは、LVMを使用して、ファイルシステムを5GB→10GBへ拡張します。

```
pvcreate /dev/md/test-md-two
vgextend test-vg /dev/md126
lvextend -l +100%FREE /dev/test-vg/test-lv01
```



実行例

```
[root@sugi-swraid test-vg]# lvextend -l +100%FREE /dev/test-vg/test-lv01
  Size of logical volume test-vg/test-lv01 changed from 4.99 GiB (1278 extents) to 9.98 GiB (2556 extents).
  Logical volume test-vg/test-lv01 successfully resized.
[root@sugi-swraid test-vg]# lvs
  LV        VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root      cl      -wi-ao---- 13.39g                                                    
  swap      cl      -wi-ao----  1.60g                                                    
  test-lv01 test-vg -wi-ao----  9.98g    
```





LVまで拡張できたので、次にXFSの拡張を行います
そのまえに、まず現在の状態を確認すると、5GB であることが確認出来ます。

```
[root@sugi-swraid mapper]# df -hT
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/mapper/cl-root             xfs        14G  1.6G   12G  12% /
devtmpfs                        devtmpfs  910M     0  910M   0% /dev
tmpfs                           tmpfs     920M     0  920M   0% /dev/shm
tmpfs                           tmpfs     920M  8.5M  912M   1% /run
tmpfs                           tmpfs     920M     0  920M   0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01 xfs       5.0G   33M  5.0G   1% /mnt/md-fs   <------ ここ
/dev/sda1                       xfs      1014M  289M  726M  29% /boot
tmpfs                           tmpfs     184M     0  184M   0% /run/user/0
```



xfs_growfs コマンドで拡張します。これは作成したFSに依存します。
今回の場合は、XFSなので、このやり方を使用します。

```
xfs_growfs /mnt/md-fs
```



実行例

```
[root@sugi-swraid test-vg]# xfs_growfs /mnt/md-fs
meta-data=/dev/mapper/test--vg-test--lv01 isize=512    agcount=4, agsize=327168 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1308672, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1308672 to 2617344
```





df で確認すると、正しく10GBへ拡張されていることが分かります

```
[root@sugi-swraid test-vg]# df -hT
Filesystem                      Type      Size  Used Avail Use% Mounted on
/dev/mapper/cl-root             xfs        14G  1.6G   12G  12% /
devtmpfs                        devtmpfs  910M     0  910M   0% /dev
tmpfs                           tmpfs     920M     0  920M   0% /dev/shm
tmpfs                           tmpfs     920M  8.5M  912M   1% /run
tmpfs                           tmpfs     920M     0  920M   0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01 xfs        10G   33M   10G   1% /mnt/md-fs   <------ ここ
/dev/sda1                       xfs      1014M  289M  726M  29% /boot
tmpfs                           tmpfs     184M     0  184M   0% /run/user/0
```





# 参考URL

https://qiita.com/mken/items/659edf3257cc2f1211a5



サーバ再起動時の device file 名について

https://bugzilla.redhat.com/show_bug.cgi?id=606481



mdadm の拡張

http://piro791.blog.so-net.ne.jp/2008-11-07

https://mo.kerosoft.com/0200