はじめに
通常、物理的なサーバには RAIDカードが搭載されており、RAIDカード側でRAIDを構成します。
しかし、様々な理由でRAIDカードが使用出来ない場合、LinuxOS側でSoftwareRAIDを構成する選択肢があります。
今回は、CentOSでSoftwareRAIDを構成する方法を確認して行きます。
以下の観点で確認して行きます。
- LinuxOS側でSoftwareRAIDを構成する方法
- SoftwareRAIDでXFSファイルシステムを構成
- RAIDを構成したDiskの障害対応
- ブロックデバイスを追加した際に、XFSファイルシステムに拡張する方法
SoftwareRAIDの構成
仮想マシンの準備
まず、検証のためにESXiで仮想マシンを作成し、5GBのHDDを2個接続します。
下記の /dev/sdb, /dev/sdc を fdisk で確認します
[root@sugi-swraid ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@sugi-swraid ~]#
[root@sugi-swraid ~]# fdisk -l /dev/sdc
Disk /dev/sdc: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
mdadm の構成
CentOSでSoftwareRAIDを構成するために mdadm をインストールします
yum install mdadm
依存関係メモ
============================================================================================================================================
Package Arch Version Repository Size
============================================================================================================================================
Installing:
mdadm x86_64 4.0-5.el7 base 428 k
Installing for dependencies:
libreport-filesystem x86_64 2.1.11-38.el7.centos base 39 k
Transaction Summary
============================================================================================================================================
mdadm で mdデバイスを作成する際に、管理をわかりやすくするため、名前を付与します。
名前を付与する場合は、/dev/md/<指定した名前> で device にアクセスすることが出来ます。
/dev/md のディレクトリは、mdデバイスを作成後にマシンを再起動すると自動的に作成されますが、手動で作成することも出来ます。
mkdir /dev/md/
/dev/sdb, /dev/sdc を使用して ソフトウェアRAID として、 /dev/dev/<任意の名前> を作成します
--create で与える名前と、 --name で与える名前は一致しておく必要があります。一致していない場合は、マシンを再起動したときに、--createで指定したデバイスファイルの方が削除されます。
md_name=test-md-one
mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdb /dev/sdc
実行例
[root@sugi-swraid ~]# md_name=test-md-one
[root@sugi-swraid ~]# mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdb /dev/sdc
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/md/test-md-one started.
以下のコマンドで mdadm の構成を保存します
保存しない場合でも動作はしますが、マシン再起動時にmdのデバイスファイルの名前を動的に構成してしまい、fstabなどで静的にマウントを指定することが出来なくなる可能性があります。
例えば、新規作成時は、/dev/md0 だったデバイスファイル名が、再起動すると /dev/md127 に自動的に変更されてしまうことがあります。
mdadm --detail --scan > /etc/mdadm.conf
以下コマンドで md0 を確認することが出来ます
[root@sugi-swraid ~]# mdadm --detail --scan
ARRAY /dev/md/test-md-one metadata=1.2 name=test-md-one UUID=360c38d4:dba3aa34:cea5c0b3:25d3df91
また、以下のコマンドで詳細を確認することが出来ます
[root@sugi-swraid ~]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 17:27:54 2018
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Resync Status : 44% complete
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 7
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
なお、以下コマンドで作成した md を削除することが出来ます
mdadm --stop /dev/md/test-md-one
mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc
rm /etc/mdadm.conf
LVMの構成
mdadm を使用してRAID 1 で構成しているため、mdadm だけでは容量の拡張が出来ません。
そこで、LVMを使用することで、mdadmでRAID1を構成した時にも容量拡張を容易に出来るようにします。
pvcreate /dev/md/test-md-one
vgcreate test-vg /dev/md127
lvcreate -n test-lv01 -l 100%FREE test-vg
以下のように作成されています
[root@sugi-swraid mapper]# pvs
PV VG Fmt Attr PSize PFree
/dev/md127 test-vg lvm2 a-- 4.99g 0
/dev/sda2 cl lvm2 a-- <15.00g 0
[root@sugi-swraid mapper]#
[root@sugi-swraid mapper]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- <15.00g 0
test-vg 1 1 0 wz--n- 4.99g 0
[root@sugi-swraid mapper]#
[root@sugi-swraid mapper]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 13.39g
swap cl -wi-ao---- 1.60g
test-lv01 test-vg -wi-a----- 4.99g
ファイルシステム(XFS)の作成
ファイルシステムを作成します
mkfs.xfs /dev/mapper/test--vg-test--lv01
実行例
[root@sugi-swraid mapper]# mkfs.xfs /dev/mapper/test--vg-test--lv01
meta-data=/dev/mapper/test--vg-test--lv01 isize=512 agcount=4, agsize=327168 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1308672, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
ファイルシステムのマウント
mkdir /mnt/md-fs
mount /dev/mapper/test--vg-test--lv01 /mnt/md-fs
df で確認
/dev/mapper/test--vg-test--lv01はシンボリックリンクになっており、/dev/md2 とリンクされています
[root@sugi-swraid mapper]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 14G 1.6G 12G 12% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.5M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda1 1014M 289M 726M 29% /boot
tmpfs 184M 0 184M 0% /run/user/0
/dev/mapper/test--vg-test--lv01 5.0G 33M 5.0G 1% /mnt/md-fs <----- ここ
fstabの作成
vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Feb 18 13:20:47 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=70d9b6ea-dd71-4528-bcd3-2ba8b2497627 /boot xfs defaults 0 0
/dev/mapper/cl-swap swap swap defaults 0 0
# add
/dev/mapper/test--vg-test--lv01 /mnt/md-fs xfs defaults 0 0
再起動を実施して、mountされているか確認します
[root@sugi-swraid ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 14G 1.6G 12G 12% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.5M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01 5.0G 33M 5.0G 1% /mnt/md-fs <----- ここ
/dev/sda1 1014M 289M 726M 29% /boot
tmpfs 184M 0 184M 0% /run/user/0
SoftwareRAIDを構成したDiskの障害対応
障害時の挙動確認
/dev/md/test-md-one は、 /dev/sdb, sdc で RAID1(ミラーリング)を構成しています。
片方のDiskに障害が発生した際の挙動と、復旧方法を確認します。
まず、下記コマンドで正常に稼働していることを確認します
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 17:46:10 2018
State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 20
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
sdc を ESXi 上から接続を切断します。
mdadm で状態を確認すると、working device が1個となっており、かつ、sdc が表示されていた場所は removed となっています
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
Update Time : Sun Jun 17 18:02:12 2018
State : active, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 21
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
- 0 0 1 removed
SoftwareRAIDを構成しているので、マウントしているファイルシステム上では、正常にI/O を実行することが出来ます
[root@sugi-swraid md-fs]# echo "mieru?" > /mnt/md-fs/test.txt
[root@sugi-swraid md-fs]# cat /mnt/md-fs/test.txt
mieru?
復旧手順
ESXi で同じ容量のデバイスを新規作成し、 /dev/sdc として認識します
mdadm側の構成としては、変わらず片系障害のままです
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 1
Persistence : Superblock is persistent
Update Time : Sun Jun 17 18:02:12 2018
State : active, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 21
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
- 0 0 1 removed
/dev/md/test-md-one に sdc を追加します。
mdadm --add /dev/md/test-md-one /dev/sdc
実行例
[root@sugi-swraid dev]# mdadm --add /dev/md/test-md-one /dev/sdc
mdadm: added /dev/sdc
確認します
/dev/sdc が追加され、rebuilding されていることを確認できます
Rebuild Status に 進捗率も表示されています
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 18:12:48 2018
State : active, degraded, recovering
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1
Consistency Policy : resync
Rebuild Status : 28% complete
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 27
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
2 8 32 1 spare rebuilding /dev/sdc
一定時間後、 sdc が active sync となっていると、正常にrebuild が完了したことを確認できます
[root@sugi-swraid dev]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 17:27:11 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 18:13:49 2018
State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : test-md-one
UUID : 360c38d4:dba3aa34:cea5c0b3:25d3df91
Events : 40
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
2 8 32 1 active sync /dev/sdc
再構築後、mdadmの構成ファイルを更新します
mdadm --detail --scan > /etc/mdadm.conf
ファイルシステムの容量拡張
以下のレイヤーを分けて、ファイルシステムを作成しました。
ブロックデバイス → mdadmでデバイスファイル作成 → LVMでdevicemapperにLVを作成 → XFSでファイルシステムを作成 → Linux OS としてマウント
容量を増やすときには、いくつか選択肢がありますが、今回は、新たにDiskを追加する方式で確認を行います。
上記の構成でいうと、mdadm で新たな RAID 1 のデバイスを作成します。
その後、LVMを介してファイルシステムを 5G → 10G へ拡張します。
ESXiを操作し、5GBのHDDを2個追加します。
/dev/sdd, /dev/sde と認識されています。
現在の設定確認
[root@sugi-swraid ~]# mdadm --detail /dev/md/test-md-one
/dev/md/test-md-one:
Version : 1.2
Creation Time : Sun Jun 17 21:13:05 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 21:28:25 2018
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : test-md-one
UUID : 3324eacd:48732953:9bb57bd7:f2035acd
Events : 19
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
mdadm を使用して、新たな RAID 1 デバイスを作成します
md_name=test-md-two
mdadm --create /dev/md/${md_name} --level=raid1 --name=${md_name} --raid-devices=2 /dev/sdd /dev/sde
確認
[root@sugi-swraid md]# mdadm --detail /dev/md/test-md-two
/dev/md/test-md-two:
Version : 1.2
Creation Time : Sun Jun 17 21:34:05 2018
Raid Level : raid1
Array Size : 5238784 (5.00 GiB 5.36 GB)
Used Dev Size : 5238784 (5.00 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Jun 17 21:34:29 2018
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Resync Status : 35% complete
Name : test-md-two
UUID : 9cdd3b87:8f22ad85:f7bd6fff:64b57c47
Events : 5
Number Major Minor RaidDevice State
0 8 48 0 active sync /dev/sdd
1 8 64 1 active sync /dev/sde
/dev/md/test-md-two を使用して、5GBの RAID 1 デバイスが作成出来ました。
それでは、LVMを使用して、ファイルシステムを5GB→10GBへ拡張します。
pvcreate /dev/md/test-md-two
vgextend test-vg /dev/md126
lvextend -l +100%FREE /dev/test-vg/test-lv01
実行例
[root@sugi-swraid test-vg]# lvextend -l +100%FREE /dev/test-vg/test-lv01
Size of logical volume test-vg/test-lv01 changed from 4.99 GiB (1278 extents) to 9.98 GiB (2556 extents).
Logical volume test-vg/test-lv01 successfully resized.
[root@sugi-swraid test-vg]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 13.39g
swap cl -wi-ao---- 1.60g
test-lv01 test-vg -wi-ao---- 9.98g
LVまで拡張できたので、次にXFSの拡張を行います
そのまえに、まず現在の状態を確認すると、5GB であることが確認出来ます。
[root@sugi-swraid mapper]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 14G 1.6G 12G 12% /
devtmpfs devtmpfs 910M 0 910M 0% /dev
tmpfs tmpfs 920M 0 920M 0% /dev/shm
tmpfs tmpfs 920M 8.5M 912M 1% /run
tmpfs tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01 xfs 5.0G 33M 5.0G 1% /mnt/md-fs <------ ここ
/dev/sda1 xfs 1014M 289M 726M 29% /boot
tmpfs tmpfs 184M 0 184M 0% /run/user/0
xfs_growfs コマンドで拡張します。これは作成したFSに依存します。
今回の場合は、XFSなので、このやり方を使用します。
xfs_growfs /mnt/md-fs
実行例
[root@sugi-swraid test-vg]# xfs_growfs /mnt/md-fs
meta-data=/dev/mapper/test--vg-test--lv01 isize=512 agcount=4, agsize=327168 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1308672, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 1308672 to 2617344
df で確認すると、正しく10GBへ拡張されていることが分かります
[root@sugi-swraid test-vg]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 14G 1.6G 12G 12% /
devtmpfs devtmpfs 910M 0 910M 0% /dev
tmpfs tmpfs 920M 0 920M 0% /dev/shm
tmpfs tmpfs 920M 8.5M 912M 1% /run
tmpfs tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/test--vg-test--lv01 xfs 10G 33M 10G 1% /mnt/md-fs <------ ここ
/dev/sda1 xfs 1014M 289M 726M 29% /boot
tmpfs tmpfs 184M 0 184M 0% /run/user/0
参考URL
サーバ再起動時の device file 名について
mdadm の拡張