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上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。
[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
と入力します。
[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 : 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デバイスをアンマウントします。
[root@server ~]# umount /raid
RAIDデバイスを停止します。
[root@server ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
スーパブロックの内容をゼロクリアする。
[root@server ~]# mdadm --misc --zero-superblock /dev/loop0 /dev/loop1
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/loop1
のstate
がfaulty
になっていることがわかります。
[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/loop1
のstate
がremoved
になっていることがわかります。
[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/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 : 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
[root@server ~]# mdadm --manage /dev/md0 -a /dev/loop2
/dev/loop1
が切り離され、/dev/loop2
が追加されたことがわかります。
[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
だけが残っていることがわかります。
[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の使い方を参照してください。
[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構成のハードディスクセットを取り外すには
Comments