Linux software RAIDを拡張する

Linuxでファイルサーバ、またはストレージを構築している場合、software RAIDを使用している人も多いと思われますが、
「mdadmを使用して、1TB HDD×4台のRAID5を3TB HDD×4台に移行したい」という場合、データロストなしでどうやるのかを検証した。

前提

検証作業は、VMware ESXi 5.5上の仮想マシンで実施。
Debian 9.0(stretch)

$ sudo mdadm --version
mdadm - v3.4 - 28th January 2016

16GBの仮想ディスク4台を32GB 4台の構成へ移行するシナリオで実施する。
なお、RAID上にはデータのみであり、OSが入ったディスクは別途存在するものとする。

準備

検証環境の準備作業として、仮想マシン用に16GBのディスクを4台準備し、RAID 5を構成する。
実機であれば、SATAポート数の制約などで拡張時に入れ替えを実施すると思われるが、仮想マシンのためポートはたくさんある。
そこで、最初から16GBと32GBのディスク 4台ずつ、合計8台分を準備、接続しておく。

デバイスの割当ては下記の様になる。
16GB: sdb-sde
32GB: sdf-sdi

まず、ESXi上でvmdkを作成する。

# vmkfstools -d thin -c 16G ./disk-1a.vmdk
# vmkfstools -d thin -c 16G ./disk-2a.vmdk
# vmkfstools -d thin -c 16G ./disk-3a.vmdk
# vmkfstools -d thin -c 16G ./disk-4a.vmdk
# vmkfstools -d thin -c 32G ./disk-1b.vmdk
# vmkfstools -d thin -c 32G ./disk-2b.vmdk
# vmkfstools -d thin -c 32G ./disk-3b.vmdk
# vmkfstools -d thin -c 32G ./disk-4b.vmdk

vmxファイルを編集して、ディスクを割り当てる。

vmxファイルをリロードさせるために、getallvmsでVMの番号を取得する。
取得した番号をreloadで指定すると、vi等で書き換えた内容が反映される(ここは20番だった)。

vim-cmd vmsvc/getallvms
vim-cmd vmsvc/reload 20

続いて、Linux上でRAIDを作成する。
めんどくさがりなので、下記の様にデバイス名を変数化してpartedで各ディスクを初期化する。

DEV=/dev/sdb
sudo parted -s -a optimal ${DEV} mklabel gpt
sudo parted -s -a optimal ${DEV} mkpart primary ext2 0% 100%
sudo parted -s -a optimal ${DEV} set 1 raid on
sudo parted -s -a optimal ${DEV} print

結果、各ドライブにLinux RAID用のパーティションが1つづつ作成される。

$ sudo parted -s -a optimal ${DEV} print
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 17.2GB 17.2GB primary raid

$

次に、mdadmコマンドでRAID 5を作成し、ext4で初期化する。

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=4 /dev/sd[b-e]1
sudo sh -c "mdadm -Ds >> /etc/mdadm/mdadm.conf"
sudo mkfs.ext4 /dev/md0

同期完了まで待つ

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0]
      50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
      [>....................]  recovery =  3.6% (619004/16766976) finish=93.8min speed=2867K/sec

unused devices: <none>
$

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0]
      50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

unused devices: <none>
$

これで検証準備が整った。

RAIDの拡張

いよいよディスクを入れ替えて、RAIDを拡張していく。

ディスクの入れ替え

RAID5のディスクを1台ずつ、別のディスクに入れ替えていく

最初にMDから1台のディスクを切り離す
まず、取り外し対象となるディスクの確認をする。物理ディスクの場合シリアル番号などを確認の上で、物理的な取り外し対象を確認すること。

sudo smartctl -a /dev/sdb

つづいて、RAID上から入れ替えの対象デバイスに故障フラグを立てて、取り外すする。

sudo mdadm /dev/md0 --fail /dev/sdb1
sudo mdadm /dev/md0 --remove /dev/sdb1

続いて、新しいディスクをRAIDに組み込む。実機であれば、ここで停止→ディスク入れ替え→ディスク初期化が行われているはずである。

sudo mdadm --add /dev/md0 /dev/sdb1

ディスクをADDするとすぐに同期が開始される

$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid5 sdf1[5] sde1[4] sdd1[2] sdc1[1]
      50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU]
      [>....................]  recovery =  0.1% (30204/16766976) finish=46.1min speed=6040K/sec

unused devices: <none>
$

あとは、新しいディスクでの同期完了まで待ち。
新しいディスクでの同期が完了したら、別のディスクを入れ替えて繰り返す。

mdデバイスの拡張

一通りディスクを入れ替えたら、いよいよMDデバイス自体を拡張する。
拡張前のArray Sizeは17GBx(4-1)の51GB
Used Dev SizeはRAID5の場合、パリティ+ユーザーデータのため1パーティション分の約17GB程度が使用されている

shogo@debian:~$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Mar 9 22:41:54 2018
Raid Level : raid5
Array Size : 50300928 (47.97 GiB 51.51 GB)
Used Dev Size : 16766976 (15.99 GiB 17.17 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Sat Mar 10 07:51:59 2018
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 512K

Rebuild Status : 2% complete

Name : debian:0 (local to host debian)
UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8
Events : 26

Number Major Minor RaidDevice State
5 8 81 0 spare rebuilding /dev/sdf1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 active sync /dev/sde1
shogo@debian:~$

mdデバイスを拡張

sudo mdadm --grow /dev/md0 --bitmap none
sudo mdadm --grow /dev/md0 --size=max
shogo@debian:~$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Mar 9 22:41:54 2018
Raid Level : raid5
Array Size : 100632576 (95.97 GiB 103.05 GB)
Used Dev Size : 33544192 (31.99 GiB 34.35 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Sat Mar 10 21:09:10 2018
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Resync Status : 54% complete

Name : debian:0 (local to host debian)
UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8
Events : 110

Number Major Minor RaidDevice State
5 8 81 0 active sync /dev/sdf1
6 8 97 1 active sync /dev/sdg1
8 8 129 2 active sync /dev/sdi1
7 8 113 3 active sync /dev/sdh1
shogo@debian:~$


同期(拡張の反映?)が実行される


shogo@debian:~$ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid5 sdi1[8] sdh1[7] sdg1[6] sdf1[5]
100632576 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [=================>...]  resync = 89.9% (30186296/33544192) finish=0.2min speed=199303K/sec

unused devices:
shogo@debian:~$

以上でMDデバイスの拡張が完了した。

md上のパーティション、ファイルシステムの拡張

最後に、MDデバイス上のパーティションやファイルシステムを拡張する。
一般的なファイルシステム拡張と同様に実施すれば良い。

まず、mdデバイスをアンマウントして、ファイルシステムチェックを実行

sudo fsck -f /dev/md0

パーティション拡張前

shogo@debian:~$ sudo parted -s /dev/md0 print
Model: Linux Software RAID Array (md)
Disk /dev/md0: 51.5GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:

Number Start End Size File system Flags
1 0.00B 51.5GB 51.5GB ext4

shogo@debian:~$

パーティション拡張(resize2fs)後

shogo@debian:~$ sudo parted -s /dev/md0 print
Model: Linux Software RAID Array (md)
Disk /dev/md0: 103GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:

Number Start End Size File system Flags
1 0.00B 103GB 103GB ext4

shogo@debian:~$

以上の操作で、Linux Software RAIDは拡張が可能になっている。