Linux Software RAID をコマンドラインから組んでみる

# ソフトウェアRAIDを構成する ( mdadm )

## 前提

  基本的に、使用するディスクは、同じメーカー、同じ型番、同じ容量、同じロットのディスクがよい。
  そこまで気にしないなら、同じメーカーで同じ型番、容量のものを選んでおけばいいと思う。



## 使用するコマンド

  cat /proc/mdstat
  mdadm --add /dev/md0 /dev/sdb1
  mdadm --create /dev/md0 --level=raid0 --raid-device=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
  mdadm --detail /dev/md0
  mdadm --detail --scan > /etc/mdadm.conf
  mdadm --fail /dev/md0 /dev/sdb1
  mdadm --misc --stop /dev/md0
  mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
  mdadm --remove /dev/md0 /dev/sdb1


## 使用したディスク

同型のものを3本使用。

```
[root@localhost ~]# hdparm -I /dev/sdb

/dev/sdb:

ATA device, with non-removable media
        Model Number:       OCZ-VERTEX3
        Serial Number:      OCZ-9RIXRBFQ611CG1Q7
        Firmware Revision:  2.15
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
        Used: unknown (minor revision code 0x0110)
        Supported: 8 7 6 5
        Likely used: 8
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63
        --
        CHS current addressable sectors:   16514064
        LBA    user addressable sectors:  117231408
        LBA48  user addressable sectors:  117231408
        Logical  Sector size:                   512 bytes
        Physical Sector size:                   512 bytes
        Logical Sector-0 offset:                  0 bytes
        device size with M = 1024*1024:       57241 MBytes
        device size with M = 1000*1000:       60022 MBytes (60 GB)
        cache/buffer size  = unknown
        Nominal Media Rotation Rate: Solid State Device
Capabilities:
        LBA, IORDY(can be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        Advanced power management level: 254
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
                Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
           *    Advanced Power Management feature set
                Power-Up In Standby feature set
           *    SET_FEATURES required to spinup after power up
           *    48-bit Address feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    WRITE_{DMA|MULTIPLE}_FUA_EXT
           *    64-bit World wide name
           *    IDLE_IMMEDIATE with UNLOAD
                Write-Read-Verify feature set
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Host-initiated interface power management
           *    Phy event counters
           *    unknown 76[14]
           *    unknown 76[15]
           *    DMA Setup Auto-Activate optimization
                Device-initiated interface power management
           *    Software settings preservation
           *    SMART Command Transport (SCT) feature set
           *    SCT Data Tables (AC5)
           *    DOWNLOAD MICROCODE DMA command
           *    SET MAX SETPASSWORD/UNLOCK DMA commands
           *    WRITE BUFFER DMA command
           *    READ BUFFER DMA command
           *    Data Set Management TRIM supported (limit 1 block)
           *    Deterministic read data after TRIM
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
        not     supported: enhanced erase
        2min for SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5e83a97e8aeb67f6
        NAA             : 5
        IEEE OUI        : e83a97
        Unique ID       : e8aeb67f6
Checksum: correct
```



## 環境

```
[root@localhost ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.9 (Santiago)

[root@localhost ~]# uname -a
Linux spkrnish-011091 4.1.12-94.3.9.el6uek.x86_64 #2 SMP Fri Jul 14 20:16:11 PDT 2017 x86_64 x86_64 x86_64 GNU/Linux
```



## 1. ディスクの準備

  fdiskコマンドでパーティションを作成する。
  パーティションのタイプは、fd ( Linux raid 自動検出 ) に設定する。

```
[user@localhost ~]$ su -

[root@localhost ~]# fdisk /dev/sdb

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): p

ディスク /dev/sdb: 60.0 GB, 60022480896 バイト
ヘッド 255, セクタ 63, シリンダ 7297
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0006ee62

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-7297, default 1):
Using default value 1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-7297, default 7297):
Using default value 7297

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdb: 60.0 GB, 60022480896 バイト
ヘッド 255, セクタ 63, シリンダ 7297
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0006ee62

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1        7297    58613121   fd  Linux raid 自動検出

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```


*****
/dev/sdc, /dev/sdd も同様にパーティションを作成する。 
*****



## mdadmコマンドでraidデバイスを作成

  ここでは、raid5で構築する。

```
[root@localhost ~]# mdadm --create /dev/md0 --level=raid5 --raid-device=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: /dev/sdc1 appears to contain an ext2fs file system
       size=58613120K  mtime=Thu Jan  1 09:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
```



## raidデバイスをフォーマット

ここでは、EXT4 でフォーマットする。

```
[root@localhost ~]# mke2fs -t ext4 /dev/md0
mke2fs 1.43-WIP (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
7323648 inodes, 29289984 blocks
1464499 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
894 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
```



## raid構成の確認

```
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0] [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [==>..................]  recovery = 13.9% (8154752/58579968) finish=4.1min speed=200057K/sec

unused devices: <none>

...

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
```


*****
完了
*****



## raid構成情報を/etc/mdadm.confに出力

```
[root@localhost ~]# cat /etc/mdadm.conf
cat: /etc/mdadm.conf: そのようなファイルやディレクトリはありません

[root@localhost ~]# mdadm --detail --scan > /etc/mdadm.conf

[root@localhost ~]# cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=localhost:0 UUID=f49a8674:13777e43:4f3eaade:7aeb9fe6

[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Jul 21 07:41:29 2017
     Raid Level : raid5
     Array Size : 117159936 (111.73 GiB 119.97 GB)
  Used Dev Size : 58579968 (55.87 GiB 59.99 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Fri Jul 21 07:46:27 2017
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost:0  (local to host localhost)
           UUID : f49a8674:13777e43:4f3eaade:7aeb9fe6
         Events : 20

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       3       8       49        2      active sync   /dev/sdd1
```



## 再起動後に自動マウントさせるため、マウントポイントを設定

```
[root@localhost ~]# ls -l /
合計 93
dr-xr-xr-x.   2 root root  4096  7月 15 10:19 2017 bin
dr-xr-xr-x.   5 root root  4096  7月 21 07:00 2017 boot
drwxr-xr-x.  20 root root  3920  7月 21 07:41 2017 dev
drwxr-xr-x.  64 root root  4096  7月 21 07:56 2017 etc
drwxr-xr-x.   3 root root  4096 11月  1 17:47 2011 home
dr-xr-xr-x.   8 root root  4096  5月 31 10:24 2017 lib
dr-xr-xr-x.   8 root root 12288  7月 15 14:49 2017 lib64
drwx------.   2 root root 16384  5月 31 10:22 2017 lost+found
drwxr-xr-x.   2 root root  4096 11月  1 17:47 2011 media
drwxr-xr-x.   5 root root  4096  7月 15 11:12 2017 mnt
drwxr-xr-x.   2 root root  4096 11月  1 17:47 2011 opt
dr-xr-xr-x. 118 root root     0  7月 21 07:18 2017 proc
dr-xr-x---.   3 root root  4096  7月 15 09:49 2017 root
dr-xr-xr-x.   2 root root 12288  7月 15 14:49 2017 sbin
drwxr-xr-x.   7 root root     0  7月 21 07:18 2017 selinux
drwxr-xr-x.   2 root root  4096 11月  1 17:47 2011 srv
dr-xr-xr-x.  13 root root     0  7月 21 07:59 2017 sys
drwxrwxrwt.   3 root root  4096  7月 21 07:19 2017 tmp
drwxr-xr-x.  13 root root  4096  5月 31 10:23 2017 usr
drwxr-xr-x.  18 root root  4096  5月 31 10:24 2017 var

[root@localhost ~]# mkdir /raid

[root@localhost ~]# vi /etc/fstab
...
/dev/md0                     /raid                   ext4    defaults        0 0
...
```



## 再起動

```
[root@localhost ~]# reboot
```



## マウント確認

```
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       45G  2.7G   40G   7% /
tmpfs                 3.5G     0  3.5G   0% /dev/shm
/dev/sda1             477M  215M  233M  48% /boot
/dev/mapper/VolGroup-lv_home
                      4.3G  8.9M  4.0G   1% /home
/dev/md0              110G   60M  105G   1% /raid  <=== raid5なのでディスク2本分のサイズ
```



## 異常時の確認

### ディスク1本をフェイルさせる

```
[root@localhost ~]# mdadm --fail /dev/md0 /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sdd1[3] sdc1[1](F) <=== sdc1がfaultとなっている
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]

unused devices: <none>
```



### 異常ディスクを除去する

```
[root@localhost ~]# mdadm --remove /dev/md0 /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md0

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sdd1[3]
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]

unused devices: <none>
```



### フェイルさせたディスクを再パーティショニング

```
[root@localhost ~]# mdadm --misc --zero-superblock /dev/sdc1

[root@localhost ~]# fdisk /dev/sdc

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): p

ディスク /dev/sdc: 60.0 GB, 60022480896 バイト
ヘッド 255, セクタ 63, シリンダ 7297
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0008de53

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1        7297    58613121   fd  Linux raid 自動検出

コマンド (m でヘルプ): d
選択した領域 1

コマンド (m でヘルプ): p

ディスク /dev/sdc: 60.0 GB, 60022480896 バイト
ヘッド 255, セクタ 63, シリンダ 7297
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0008de53

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-7297, default 1):
Using default value 1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-7297, default 7297):
Using default value 7297

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): p

ディスク /dev/sdc: 60.0 GB, 60022480896 バイト
ヘッド 255, セクタ 63, シリンダ 7297
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0008de53

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1        7297    58613121   fd  Linux raid 自動検出

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```



### raidデバイスに（仮）新ディスクを追加する

```
[root@localhost ~]# mdadm --add /dev/md0 /dev/sdc1
mdadm: added /dev/sdc1

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[4] sdb1[0] sdd1[3]
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [U_U]
      [>....................]  recovery =  1.5% (918840/58579968) finish=6.2min speed=153140K/sec

unused devices: <none>

...

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[4] sdb1[0] sdd1[3]
      117159936 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
```


*****
交換完了。
この時、raidデバイスのUUIDは変わっていない。
*****


```
[root@localhost ~]# mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 spares=1 name=localhost:0 UUID=f49a8674:13777e43:4f3eaade:7aeb9fe6
```



## raidを解体

```
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       45G  2.7G   40G   7% /
tmpfs                 3.5G     0  3.5G   0% /dev/shm
/dev/sda1             477M  230M  218M  52% /boot
/dev/mapper/VolGroup-lv_home
                      4.3G  8.9M  4.0G   1% /home
/dev/md0              110G   60M  105G   1% /raid

[root@localhost ~]# umount /raid

[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       45G  2.7G   40G   7% /
tmpfs                 3.5G     0  3.5G   0% /dev/shm
/dev/sda1             477M  230M  218M  52% /boot
/dev/mapper/VolGroup-lv_home
                      4.3G  8.9M  4.0G   1% /home

[root@localhost ~]# mdadm --misc --stop /dev/md0
mdadm: stopped /dev/md0

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>

[root@localhost ~]# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1
```


[おわり]