hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

RAIDの環境構築手順



1 RAIDとは?

RAID(Redundant Arrays of Independent DISK)は複数のハードディスクを連結して、1台の仮想的なディスクを構築する技術です。冗長化や高速化を目的に使用します。ここでは、RAID1の環境構築、削除を試してみます。

RAIDレベル 概要
RAID 0(ストライピング) 最低2台のディスクが必要。書き込みを複数のディスクに分散する。アクセスの高速化が目的。冗長構成がないため耐障害性なし
RAID 1ミラーリング 最低2台のディスクが必要。2台以上のディスクに同じデータを書き込む。1台が故障しても他のディスクで稼働可能
RAID 4 RAID 0パリティを追加
RAID 5 最低3台のディスクが必要。書き込みを複数のディスクに分散する。パリティも複数ディスクに分散。1台が故障しても他のディスクのパリティを使ってデータ復旧が可能
RAID 10 複数のRAID 1を組み合わせてRAID0を構成する。冗長性と高速化の両立が目的

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 パッケージのインストール

mdadmパッケージをインストールします。

[root@server ~]# yum -y install mdadm

版数を確認します。

[root@server ~]# mdadm --version
mdadm - v4.1 - 2018-10-01

4 RAIDバイスの作成

RAID環境構築の練習をお手軽にするため、使用するデバイスをループバックデバイスで作成します。

4.1 ファイルの作成

ループバックデバイスとして使うファイル(500M)を2つ作成します。なお、ddコマンドの使い方は、ddコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# dd if=/dev/zero of=disk1.img bs=1024 count=512000
[root@server ~]# dd if=/dev/zero of=disk2.img bs=1024 count=512000

作成したファイルを確認します。

[root@server ~]# ls -lh disk*
-rw-r--r--. 1 root root 500M  2月 23 19:32 disk1.img
-rw-r--r--. 1 root root 500M  2月 23 19:32 disk2.img

4.2 ループバックデバイスの作成

ループバックデバイスを作成します。なお、losetupコマンドの使い方は、losetupコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# losetup -f /root/disk1.img
[root@server ~]# losetup -f /root/disk2.img

作成したループバックデバイスを確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

4.3 パーティションタイプ(fd00)の設定

作成したループバックデバイスパーティションタイプを設定します。
/dev/loop0、/dev/loop1に対して、fd00を設定します。下記の★印が入力した内容です。

[root@server ~]# gdisk /dev/loop0
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): n ★
Partition number (1-128, default 1):
First sector (34-1023966, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-1023966, default = 1023966) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): fd00 ★
Changed type of partition to 'Linux RAID'

Command (? for help): w ★

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y ★
OK; writing new GUID partition table (GPT) to /dev/loop0.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

/dev/loop0のパーティションタイプを確認します。FD00になっていることがわかります。

[root@server ~]# gdisk -l /dev/loop0
-snip-
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1023966   499.0 MiB   FD00  Linux RAID

/dev/loop1のパーティションタイプを確認します。FD00になっていることがわかります。

[root@server ~]# gdisk -l /dev/loop1
-snip-
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1023966   499.0 MiB   FD00  Linux RAID

5 RAID環境の構築手順

次の手順にしたがって、RAID1環境を構築してみます。

  • -l:RAIDレベルを指定します。RAID 1を作成するので1を指定します。
  • -n:デバイスの個数を指定します。デバイスを2つ使うので、2を指定します。

Continue creating array?に対して、yと入力します。

[root@server ~]# mdadm -C /dev/md0 -l1 -n2 /dev/loop0 /dev/loop1
mdadm: partition table exists on /dev/loop0
mdadm: partition table exists on /dev/loop0 but will be lost or
       meaningless after creating array
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
mdadm: partition table exists on /dev/loop1
mdadm: partition table exists on /dev/loop1 but will be lost or
       meaningless after creating array
Continue creating array? y ★
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

RAIDバイスの状態を確認します。/dev/loop1のstateがactive syncになっていることがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 19:45:57 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 19:46:00 2022
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : 3479298c:3190d1cd:8cdc260a:8cdb934a
            Events : 17

    Number   Major   Minor   RaidDevice State
       0       7        0        0      active sync   /dev/loop0
       1       7        1        1      active sync   /dev/loop1

作成したRAIDバイスにxfsファイルシステムを作成します。

[root@server ~]# mkfs.xfs /dev/md0
Discarding blocks...Done.
meta-data=/dev/md0               isize=512    agcount=4, agsize=31936 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=127744, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

マウントポイントを作成します。

[root@server ~]# mkdir /raid

作成したマウントポイントにRAIDバイスをマウントします。

[root@server ~]# mount /dev/md0 /raid

RAIDバイスに作成したファイルシステムを確認します。

[root@server ~]# df -hT /raid
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/md0       xfs      496M   26M  471M    6% /raid

設定ファイルを作成します。

[root@server ~]# mdadm -Esv > /etc/mdadm.conf

作成した設定ファイルを確認します。

[root@server ~]# cat /etc/mdadm.conf
ARRAY /dev/md/0  level=raid1 metadata=1.2 num-devices=2 UUID=3479298c:3190d1cd:8cdc260a:8cdb934a name=server:0
   devices=/dev/loop1,/dev/loop0

6 RAID環境の削除手順

RAIDバイスをアンマウントします。

[root@server ~]# umount /raid

RAIDバイスを停止します。

[root@server ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

RAIDバイスの状態を確認します。

[root@server ~]# mdadm -D /dev/md0
mdadm: cannot open /dev/md0: No such file or directory

スーパブロックの内容をゼロクリアします。

[root@server ~]# mdadm --misc --zero-superblock /dev/loop0 /dev/loop1

ループバックデバイスを削除します。

[root@server ~]# losetup -d /dev/loop0
[root@server ~]# losetup -d /dev/loop1

7 ディスクの交換手順

5.1でRAID1の環境を作成した後、次の手順にしたがって、ディスクを交換してみます。

7.1 不良マークの設定(-f)

"-f"は不良マークをつけるオプションです。不良マークをつけることで、ディスクを故障状態にします。

[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0

RAIDバイスの状態を確認します。/dev/loop1のstateがfaultyになっていることがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 19:45:57 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 19:53:23 2022
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 1
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : 3479298c:3190d1cd:8cdc260a:8cdb934a
            Events : 19

    Number   Major   Minor   RaidDevice State
       0       7        0        0      active sync   /dev/loop0
       -       0        0        1      removed

       1       7        1        -      faulty   /dev/loop1

7.2 故障ディスクの切り離し(-r)

”-r”は、RAIDからディスクを切り離すオプションです。

[root@server ~]# mdadm --manage /dev/md0 -r /dev/loop1
mdadm: hot removed /dev/loop1 from /dev/md0

RAIDバイスの詳細状態を確認します。/dev/loop1のstateがremovedになっていることがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 19:45:57 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 19:54:48 2022
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : 3479298c:3190d1cd:8cdc260a:8cdb934a
            Events : 20

    Number   Major   Minor   RaidDevice State
       0       7        0        0      active sync   /dev/loop0
       -       0        0        1      removed

7.3 新しいディスクの作成

ループバックデバイスに使うファイルを作成します。

[root@server ~]# dd if=/dev/zero of=disk3.img bs=1024 count=512000

ループバックデバイスを作成します。

[root@server ~]# losetup -f /root/disk3.img

パーティションタイプを設定します。

[root@server ~]# gdisk /dev/loop2

7.4 ディスクの追加(-a)

"-a"は、ディスクをRAIDに追加するオプションです。/dev/loop2のstateがactive syncになっていることがわかります。

[root@server ~]# mdadm --manage /dev/md0 -a /dev/loop2
mdadm: added /dev/loop2

RAIDバイスの詳細状態を確認します。/dev/loop2のstateがactive syncになっていることがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 19:45:57 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 19:59:37 2022
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : 3479298c:3190d1cd:8cdc260a:8cdb934a
            Events : 39

    Number   Major   Minor   RaidDevice State
       0       7        0        0      active sync   /dev/loop0
       2       7        2        1      active sync   /dev/loop2

8 ミラーリングの動作確認

ミラーリングの動作確認をしてみます。
まず、5.1にしたがって、RAID 1の環境を構成します。そして、RAIDバイスにテストデータを書き込みます。

[root@server ~]# echo 12345 > /raid/test.txt
[root@server ~]# cat /raid/test.txt
12345

/dev/loop1に不良マークをつけて、故障状態にします。

[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0

RAIDから/dev/loop1を切り離します。

[root@server ~]#  mdadm --manage /dev/md0 -r /dev/loop1
mdadm: hot removed /dev/loop1 from /dev/md0

新規ディスクを作成します。

[root@server ~]# dd if=/dev/zero of=disk3.img bs=1024 count=512000
[root@server ~]# losetup -f /root/disk3.img
[root@server ~]# gdisk /dev/loop2

RAIDに新規ディスクを追加します。

[root@server ~]# mdadm --manage /dev/md0 -a /dev/loop2
mdadm: added /dev/loop2

RAIDの状態を確認します。/dev/loop1が切り離され、/dev/loop2が追加されたことがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 20:04:56 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 20:08:44 2022
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : de9b1a76:5665f2cd:a9c25959:bbad8834
            Events : 49

    Number   Major   Minor   RaidDevice State
       0       7        0        0      active sync   /dev/loop0
       2       7        2        1      active sync   /dev/loop2

RAIDから/dev/loop0を切り離します。

[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop0
mdadm: set /dev/loop0 faulty in /dev/md0
[root@server ~]# mdadm --manage /dev/md0 -r /dev/loop0
mdadm: hot removed /dev/loop0 from /dev/md0

/dev/loop0が切り離され、/dev/loop2だけが残っていることがわかります。

[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Wed Feb 23 20:04:56 2022
        Raid Level : raid1
        Array Size : 510976 (499.00 MiB 523.24 MB)
     Used Dev Size : 510976 (499.00 MiB 523.24 MB)
      Raid Devices : 2
     Total Devices : 1
       Persistence : Superblock is persistent

       Update Time : Wed Feb 23 20:09:59 2022
             State : clean, degraded
    Active Devices : 1
   Working Devices : 1
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : server:0  (local to host server)
              UUID : de9b1a76:5665f2cd:a9c25959:bbad8834
            Events : 54

    Number   Major   Minor   RaidDevice State
       -       0        0        0      removed
       2       7        2        1      active sync   /dev/loop2

RAIDバイスに書き込んだテストデータを読み出します。テストデータが読めることがわかります。

[root@server ~]# cat /raid/test.txt
12345

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ