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は拡張が可能になっている。