【Linux】mdadmを用いたソフトウェアRAID構築

RAIDは複数台のHDDまたはSSDを一つのディスクとして,取り扱う技術です.

RAIDの目的は,「ディスクアクセスの高速化」または「データ信頼性の向上」,もしくはその両方です.

本記事では,HDD2台のRAID1を構築する手順を示します.

デバイスはそれぞれ/dev/sda/dev/sdbです.

目次

デバイスの準備

まずは,RAID用のパーティションを作成します

ディスクを削除し,新しいパーティションを作成

今回使用するHDDは16TBです.容量が2TB以上のため,partedを使用して,新たなパーティションを作成します.

まずは,1台目のHDD(/dev/sda)のGPTパーティションを作成します.

手順は下記の通りです.

  1. mklabel gptでGPT化
  2. mkpart ext4 0% 100%でディスク全体をext4でフォーマット
  3. set 1 raid onでRAIDフラグを設定

parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y
(parted) mkpart ext4 0% 100%
(parted) p
Model: ATA TOSHIBA MG08ACA1 (scsi)
Disk /dev/sda: 16.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  16.0TB  16.0TB               ext4

(parted) set 1 raid on
(parted) p
Model: ATA TOSHIBA MG08ACA1 (scsi)
Disk /dev/sda: 16.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  16.0TB  16.0TB               ext4  raid

(parted) quit

/dev/sdbも同様に行います.

この段階で,/dev/sda1および/dev/sdb2のパーティションが作成されています.

RAID構築

ここからソフトウェアRAIDを構築します

ここで紹介するRAIDレベルはRAID1ですが,RAID0などの他のRAIDレベルでも同様の手順で構築できます.

ソフトウェアRAIDの構築とその管理を行うソフトウェアである “mdadm” を用います.

mdadmのインストール

まずmdadmのインストールを行います.

インストール方法はOSに応じて下記のとおりです.

・Ubuntu/Debian系


apt install mdadm

・CentOS/RHEL系


yum install mdadm

RAIDの構築

下記コマンドで,RAIDを構築します.


mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
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/md0 started.

--level= で,RAIDレベルを指定します.

RAIDの状態を確認

cat /proc/mdstatでRAIDの状態を確認できます.


cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active (auto-read-only) raid1 sdb1[1] sda1[0]
      15625745408 blocks super 1.2 [2/2] [UU]
        resync=PENDING
      bitmap: 114/117 pages [456KB], 65536KB chunk
unused devices: <none>

また,さらに詳細な情報を確認するにはmdadm --datail <device>で確認できます.


mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : ---------------------
        Raid Level : raid1
        Array Size : 15625745408 (14901.87 GiB 16000.76 GB)
     Used Dev Size : 15625745408 (14901.87 GiB 16000.76 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : ---------------------
             State : clean, resyncing (PENDING)
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : localhost:0  (local to host localhost)
              UUID : ********:********:********:********6
            Events : 131

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

フォーマット

次に,ディスクを使用可能にするためにフォーマットを行います.(下記コマンドでは,ext4でフォーマット)


mkfs -t ext4 /dev/md0
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 3906436352 4k blocks and 488304640 inodes
Filesystem UUID: ********-********-********-********
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632,
        2560000000, 3855122432

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

現段階でデバイスを確認すると,md0が作成されており,ブロックタイプがraid1を表示されます.


lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                         8:0    0  14.6T  0 disk
└─sda1                      8:1    0  14.6T  0 part
  └─md0                     9:0    0  14.6T  0 raid1
sdb                         8:16   0  14.6T  0 disk
└─sdb1                      8:17   0  14.6T  0 part
  └─md0                     9:0    0  14.6T  0 raid1

マウント

作成したRAIDディスクをマウントし,使用可能な状態にします.

今回は/mnt/raid1をマウント先とします.


mkdir -p /mnt/raid1
mount -t ext4 /dev/md0 /mnt/raid1

下記のようにMounted onにマウント先が表示されれば正常に動作しています.


df -h
Filesystem                     Size  Used Avail Use% Mounted on
...
/dev/md0                        15T   28K   14T   1% /mnt/raid1

再起動時に自動でマウント

再起動を行うとマウント設定がリセットされます.

再度手動で設定を行うのは面倒なため,再起動時に自動でマウントする設定を行います.

/etc/fstabの末尾に下記のように設定を記述します.

/etc/fstab


...
/dev/md0 /mnt/raid1 ext4 defaults 0 0 

再起動時の注意点

ここ重要

再起動時に/dev/md0/dev/md127に勝手に変更されます.

デバイス名が変更されるとマウントに失敗するため,デバイス名の変更を防ぐ必要があります

現在のRAID設定をmdadmの設定ファイル(/etc/mdadm/mdadm.conf)に記述します.


mdadm --detail --scan /dev/md0 >> /etc/mdadm/mdadm.conf

上記コマンドでは,mdadm --detail --scan <device>でデバイスの詳細設定を出力し,そのまま設定ファイルに追記しています.

mdadm --detail --scan <device>では,下記のような情報が出力されます.


mdadm --detail --scan /dev/md0
ARRAY /dev/md0 metadata=1.2 name=localhost:0 UUID=********:********:********:********

下記コマンドで,記述した設定を反映します.


update-initramfs -u

RAID設定を解除する方法

RAID構築後にRAID設定を削除したい場合,下記コマンドです.


mdadm --misc --stop /dev/md0
mdadm --misc --zero-superblock /dev/sda1
mdadm --misc --zero-superblock /dev/sdb1

>> スーパーユーザーなら知っておくべきLinuxシステムの仕組み

リビルド

念のため,HDDが破損した際のリビルドの練習をしておきましょう

HDDが破損した場合,新しいHDDに変更してRAIDを再構築する必要があります.

ここでは,HDDを強制的に引き抜き破損した状態を再現しました.

一つ目のディスクのステータスがremovedと表示されていることが確認できます.


mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : ---------------------
        Raid Level : raid1
        Array Size : 15625745408 (14901.87 GiB 16000.76 GB)
     Used Dev Size : 15625745408 (14901.87 GiB 16000.76 GB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : ---------------------
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : localhost:0  (local to host localhost)
              UUID : ********:********:********:********
            Events : 4594

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       1       8       17        1      active sync   /dev/sdb1

新しいデバイスを追加します.


mdadm --manage /dev/md0 --add /dev/sda1
mdadm: re-added /dev/sda1

デバイスを追加すると,spare rebuildingと表示され,自動的にリビルドされます.


mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : ---------------------
        Raid Level : raid1
        Array Size : 15625745408 (14901.87 GiB 16000.76 GB)
     Used Dev Size : 15625745408 (14901.87 GiB 16000.76 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : ---------------------
             State : clean, degraded, recovering
    Active Devices : 1
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 1

Consistency Policy : bitmap

    Rebuild Status : 0% complete

              Name : localhost:0  (local to host localhost)
              UUID : ********:********:********:********
            Events : 4597

    Number   Major   Minor   RaidDevice State
       0       8        1        0      spare rebuilding   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

進捗率は下記のように表示されるので,100%になるまで待ちます.


...
    Rebuild Status : 11% complete
...

16TBもあるので,1日弱かかりました.

終了すると,statusがactiveと表示されます.


mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : ---------------------
        Raid Level : raid1
        Array Size : 15625745408 (14901.87 GiB 16000.76 GB)
     Used Dev Size : 15625745408 (14901.87 GiB 16000.76 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : ---------------------
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : localhost:0  (local to host localhost)
              UUID : ********:********:********:********
            Events : 20189

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

最後に

本記事では,LinuxにおけるソフトウェアRAIDの設定を紹介しました.

ソフトウェアRAIDは,RAIDカードが不要のため安価というメリットがありますが,信頼性の面ではハードウェアRAIDが圧倒的に勝っています.

より信頼性の高いシステムを構築する際にはRAIDカードを利用したハードウェアRAIDを推奨します.

手頃なRAIDはソフトウェアRAID
安全なものはハードウェアRAID

RAID構築可能なマザーボードもありますが,マザーボードが破損したら修復できないため,かなり危険です.仕組み上,同機種のマザーボードに交換すれば修復が可能なはずですが,出荷ロットによって不具合が起こる可能性が高いです.

>> RAIDコントローラ

よかったらシェアしてね!
目次