Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@hana_shin

RAIDの環境構築手順

1 RAIDとは?

RAID(Redundant Arrays of Independent DISK)は複数のハードディスクを連結して、
1台の仮想的なディスクを構成する技術です。

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

ハードディスクを用意できないため、ループバックデバイスを使用してみます。
ループバックデバイスを使って、お手軽にRAID 1環境を作成してみます。

作成した環境を本番環境で使うということではありません。
あくまで、コマンドの練習用として環境を構築してみます。

2 環境

VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
カーネル版数
[root@server ~]# uname -r
3.10.0-957.el7.x86_64

4 事前準備

4.1 ファイルの作成

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

ファイルの作成
[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  3月 20 08:41 disk1.img
-rw-r--r--. 1 root root 500M  3月 20 08:42 disk2.img

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

ループバックデバイスを作成します。
なお、losetupコマンドの使い方はlosetupコマンドの使い方を参照ください。

ループバックデバイスの作成
[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): 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
-中略-
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
-中略-
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1023966   499.0 MiB   FD00  Linux RAID

5 RAID構築/解除手順

5.1 RAID構築手順

RAIDデバイスを作成します。
-l:RAIDレベルを指定します。RAID 1を作成するので1を指定します。
-n:デバイスの個数を指定します。デバイスを2つ使うので、2を指定します。
Continue creating array?に対して、yと入力します。

RAIDデバイスの作成
[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/loop1stateactive syncになっていることがわかります。

作成したRAIDデバイスの確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 20 09:16:40 2020
        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 : Fri Mar 20 09:16:42 2020
             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 : 84d8221e:c045d7ce:90ca82f3:0f5aaca8
            Events : 17

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

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

ファイルシステムの作成
[root@server ~]# mkfs.xfs /dev/md0
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

作成したファイルシステムを/raidにマウントします。

マウント
[root@server ~]# mkdir /raid
[root@server ~]# mount /dev/md0 /raid
[root@server ~]# df -h /raid
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/md0         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=05227467:815d2cec:ff8c3346:7711aa9e name=server:0
   devices=/dev/loop1,/dev/loop0

5.2 RAID解除手順

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

RAIDデバイスのアンマウント
[root@server ~]# umount /raid

RAIDデバイスを停止します。

RAIDデバイスの停止
[root@server ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0

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

スーパブロックのゼロクリア
[root@server ~]# mdadm --misc --zero-superblock /dev/loop0 /dev/loop1

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

RAIDデバイスの状態確認
[root@server ~]# mdadm -D /dev/md0
mdadm: cannot open /dev/md0: No such file or directory

6 ディスクの交換手順

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

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

-fオプションを指定して、ディスクを故障状態にします。

不良マークの設定
[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0

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

RAIDデバイスの状態確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 20 18:34:03 2020
        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 : Fri Mar 20 18:39:01 2020
             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 : 579beaa2:aced7362:31f30aa6:f19bf6d6
            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

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

-rオプションを指定して、RAIDからディスクを切り離します。

故障ディスクの切り離し
[root@server ~]# mdadm --manage /dev/md0 -r /dev/loop1
mdadm: hot removed /dev/loop1 from /dev/md0

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

RAIDデバイスの状態確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 20 18:34:03 2020
        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 : Fri Mar 20 18:41:15 2020
             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 : 579beaa2:aced7362:31f30aa6:f19bf6d6
            Events : 20

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

6.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

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

-aオプションを指定して、新しく作成したディスクをRAIDに追加します。
/dev/loop2stateactive syncになっていることがわかります。

RAIDにディスク追加
[root@server ~]# mdadm --manage /dev/md0 -a /dev/loop2
mdadm: added /dev/loop2

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

RAIDの状態確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Mar 20 18:34:03 2020
        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 : Fri Mar 20 19:17:54 2020
             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 : 579beaa2:aced7362:31f30aa6:f19bf6d6
            Events : 39

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

7 動作確認

ミラーリングが動作しているかどうか確認してみます。
まず、5.1にしたがって、RAID 1を構成します。
その後、下記手順にしたがって、ミラーリングの動作確認をしてみます。

テスト用データの作成
[root@server ~]# echo 12345 > /raid/test.txt
[root@server ~]# cat /raid/test.txt
12345

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

故障ディスクの切り離し
[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0

[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

/dev/loop1が切り離され、/dev/loop2が追加されたことがわかります。

RAIDの状態確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sun Mar 22 08:29:30 2020
        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 : Sun Mar 22 08:31:50 2020
             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 : 47449c38:2e2c1e5c:6db2e9c0:76753842
            Events : 45

    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だけが残っていることがわかります。

RAIDの状態確認
[root@server ~]# mdadm -D /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sun Mar 22 08:29:30 2020
        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 : Sun Mar 22 08:32:52 2020
             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 : 47449c38:2e2c1e5c:6db2e9c0:76753842
            Events : 48

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

/dev/loop2のみのRAIDからテスト用データを読み出します。
最初に作成したテスト用データが読めていることがわかります。

テスト用データの確認
[root@server ~]# cat /raid/test.txt
12345

8 デバッグ方法

md.c,raid1.cに含まれるpr_debug文が表示されるようにしてみます。
詳細は、DYNAMIC DEBUGの使い方を参照してください。

DYNAMIC_DEBUGの有効化
[root@server ~]# echo 'file drivers/md/md.c +plft' > /sys/kernel/debug/dynamic_debug/control
[root@server ~]# echo 'file drivers/md/raid1.c +plft' > /sys/kernel/debug/dynamic_debug/control

/dev/loop1に不良マークを設定します。

不良マーク設定
[root@server ~]# mdadm --manage /dev/md0 -f /dev/loop1
mdadm: set /dev/loop1 faulty in /dev/md0

pr_debugのメッセージが表示されていることがわかります。

ログの確認
[root@server ~]# journalctl -f
-snip-
 6月 02 21:32:53 server kernel: [12099] md_wakeup_thread:7375: md: waking up MD thread md0_raid1.
 6月 02 21:32:53 server kernel: [11868] md_update_sb:2517: md: updating md0 RAID superblock on device (in sync 1)
 6月 02 21:32:53 server kernel: [11868] md_update_sb:2545: md: loop1 (skipping faulty)
 6月 02 21:32:53 server kernel: [11868] md_update_sb:2533: md: (write) loop0's sb offset: 8

ログの1行目に表示されている[12099] md_wakeup_thread...について確認してみます。
以下は、md.cファイルの抜粋です。
7375行目で実行しているpr_debugのメッセージであることがわかります。

ソース抜粋
7372 void md_wakeup_thread(struct md_thread *thread)
7373 {
7374         if (thread) {
7375                 pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm);
7376                 set_bit(THREAD_WAKEUP, &thread->flags);
7377                 wake_up(&thread->wqueue);
7378         }
7379 }

Z 参考情報

Linux教科書 LPICレベル2 スピードマスター問題集 Version4.5対応
DVD付 CentOS徹底入門 第3版
HDDを2台追加してRAID 1を構成するには
RAID構成のハードディスクセットを取り外すには

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。2021はぜひ行きたい!。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?