お金をかけずにサーバーの勉強をしよう

LVM2でソフトウェアRAID構築

2025年4月29日

メニューへ戻る

Ubuntuで LVM2を使って複数のディスクをまとめてソフトウェアRAIDを組みます。

※Azureについては 2022年7月に 2021年頃の記憶を基に書いています。パブリッククラウドのサービスは改善されていくので最新情報にあたるようにして下さい。

Microsoftのパブリッククラウド Azureで VMを構築した際にストレージのスピードが問題になったことがあります。

Azureには高速ストレージとして PremiumSSDというものがあるのですが、これでも速度が足りませんでした。

私はミドルウェアのライセンス代を低く抑えるために CPU数が 2個や 4個の VMを良く選定していたのですが、このサイズの VMでは接続できるストレージ数・最大スループット・最大IOPSが制限されていて、PremiumSSDが持つ本来のパワーを享受できずヤキモキしていました。

もっとお金を払って大きな VMを使えよって事なんで、仕方がないんですけどね。

Ultra Diskはまだ Azure Backupに対応してなかったので運用上使うことができなかったです。
(今は対応しているだろうか)

そんな経験をしていた過程で PremiumSSDの速度アップの方法を調べていた時に Microsoftのサイトで見つけた方法は、複数の PremiumSSDで RAID0(ディスクストライピング)せよ、というものでした。

Premium SSD自体は RAIDになっていますが、それを OSの機能(またはストレージ用のソフトウェア)で束ねて RAIDを組めってことです。

ストライピングを使う際の稼働率低下(故障率アップ)に触れてないのはどうかなぁと思いましたが、他に方法もないですし、嫌なら RAID0+1にでもしてミラーリングもしとけよってことですね。

Ubuntuのディスク増設」にて、LVM2による論理ボリューム作成をやってますので、ここではその応用で RAID0の論理ボリュームを作ってみます。


1.環境

VMware Workstation Proで作った仮想マシンにインストールした Ubuntu Server 24.04、そこに仮想ハードディスクを 3つ増設します。

Ubuntu Serverのインストールについては「Ubuntu 24.04 Server インストール」に書いています。


2.ディスク増設

増設前のディスクの状態です。
20GBの仮想ハードディスク(/dev/sda)が 1つだけあります。

subro@UbuntuServer2404-1:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                        8:0    0   20G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
└─sda3                      8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0 18.2G  0 lvm  /
sr0                        11:0    1 1024M  0 rom

ディスクを増設するので一旦シャットダウンします。

subro@UbuntuServer2404-1:~$ sudo poweroff

VMware Workstation Proのメニューで Ubuntu Serverの仮想マシンの上で右クリックするとメニューが出ますので、[設定]を選択します。
VMwareディスク増設 1

下の方にある追加を押します。
VMwareディスク増設 2

[ハードディスク]を選択して次へを押します。
VMwareディスク増設 3

[SCSI]を選択して次へを押します。
VMwareディスク増設 4

[仮想ディスクの新規作成]を選択して次へを押します。
VMwareディスク増設 5

[ディスク最大サイズ]を入力し、[仮想ディスクを単一ファイルとして格納]を選択して次へを押します。
VMwareディスク増設 6

完了を押します。
VMwareディスク増設 7

5GBの新規仮想ディスクができました。
OKを押します。
VMwareディスク増設 8

これをあと 2回やって 3つのハードディスクを増設した形にします。 VMwareディスク増設 9

Ubuntu Serverを立ち上げます。

改めて確認します。

subro@UbuntuServer2404-1:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0   20G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
└─sda3                      8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0 18.2G  0 lvm  /
sdb                         8:16   0    5G  0 disk
sdc                         8:32   0    5G  0 disk
sdd                         8:48   0    5G  0 disk
sr0                        11:0    1 1024M  0 rom

ピンク色のディスクが増えています。


3.Physical Volume(PV)作成

それぞれ Physical Volume(PV)として登録します。

subro@UbuntuServer2404-1:~$ sudo pvcreate /dev/sdb /dev/sdc /dev/sdd
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.

できました。

PVの情報を見てみます。

subro@UbuntuServer2404-1:~$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               ubuntu-vg
  PV Size               <18.23 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4665
  Free PE               0
  Allocated PE          4665
  PV UUID               35HoZS-aKFY-VO64-65HW-xqh0-nVNH-sM4T3l

  "/dev/sdb" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               2t24Ax-84OR-ZXA8-yG40-fLAM-brgW-qAHw6r

  "/dev/sdc" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               mc0Y9h-knQC-RwcY-94Wl-7wrV-2Imu-KmcPF9

  "/dev/sdd" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               U794IU-9EuS-2TKy-AGAU-8jgz-DZ9D-KRCY3Q

PVができました。


4.Volume Group(VG)作成

上で作った 3つのPVを同じ Volume Group(VG)に所属させます。
VGの名前は [raid-group] にしました。

subro@UbuntuServer2404-1:~$ sudo vgcreate raid-group /dev/sdb /dev/sdc /dev/sdd
  Volume group "raid-group" successfully created

[raid-group]VGができました。

情報を見てみます。

subro@UbuntuServer2404-1:~$ sudo vgdisplay raid-group
  --- Volume group ---
  VG Name               raid-group
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <14.99 GiB
  PE Size               4.00 MiB
  Total PE              3837
  Alloc PE / Size       0 / 0
  Free  PE / Size       3837 / <14.99 GiB
  VG UUID               reXTsK-3FGl-985E-v9SP-BVN8-7obc-tTeQlP

[raid-group]VGには 4MBの PEが 3,837個(≒15GB)あります。

[Cur PV](多分 Current PV)・[Act PV](多分 Active PV)が 3になってますのでれで良さげです。


4.Logical Volume(LV)作成(RAID作成)

Logical Volume(LV)作成が RAID構築と同義で、RAID0・RAID1・RAID4・RAID5・RAID6・RAID10を作ることができます。

[raid-group]VGから領域を得て RAID0構成の LVを作成します。

サイズの指定は領域をキッチリ使いたかったので、上の [Total PE]の数値を
[--extents PE数]オプションで指定しています。
LVの名前は [lv-raid0] にしました。

subro@UbuntuServer2404-1:~$ sudo lvcreate --type raid0 --stripes 3 --extents 3837 --name lv-raid0 raid-group
  Using default stripesize 64.00 KiB.
  Logical volume "lv-raid0" created.

[lv-raid0]LVができました。

情報を見てみます。

subro@UbuntuServer2404-1:~$ sudo lvdisplay /dev/raid-group/lv-raid0
   --- Logical volume ---
  LV Path                /dev/raid-group/lv-raid0
  LV Name                lv-raid0
  VG Name                raid-group
  LV UUID                j7yHUT-U2tx-D1TP-VKQi-0590-FcpR-pwUqAq
  LV Write Access        read/write
  LV Creation host, time UbuntuServer2404-1, 2025-04-29 08:11:40 +0900
  LV Status              available
  # open                 0
  LV Size                <14.99 GiB
  Current LE             3837
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     768
  Block device           252:4

3つ合わせて概ね 15GBのサイズになっています。


5.LVのフォーマットとマウント

あとはもう「Ubuntuのディスク増設」で LVをマウントしたのと同じなので端折りながら。

一応ディスクのできあがりを見てみましょう。

subro@UbuntuServer2404-1:~$ lsblk
NAME                             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                                8:0    0   20G  0 disk
├─sda1                             8:1    0    1M  0 part
├─sda2                             8:2    0  1.8G  0 part /boot
└─sda3                             8:3    0 18.2G  0 part
  └─ubuntu--vg-ubuntu--lv        252:0    0 18.2G  0 lvm  /
sdb                                8:16   0    5G  0 disk
└─raid--group-lv--raid0_rimage_0 252:1    0    5G  0 lvm
  └─raid--group-lv--raid0        252:4    0   15G  0 lvm
sdc                                8:32   0    5G  0 disk
└─raid--group-lv--raid0_rimage_1 252:2    0    5G  0 lvm
  └─raid--group-lv--raid0        252:4    0   15G  0 lvm
sdd                                8:48   0    5G  0 disk
└─raid--group-lv--raid0_rimage_2 252:3    0    5G  0 lvm
  └─raid--group-lv--raid0        252:4    0   15G  0 lvm
sr0                               11:0    1 1024M  0 rom

[lv-raid0]LVを ext4のファイルシステム用にフォーマットします。

subro@UbuntuServer2404-1:~$ sudo mkfs.ext4 /dev/raid-group/lv-raid0
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 3929088 4k blocks and 983040 inodes
Filesystem UUID: 991dff29-4c84-47ff-b397-3af1cd82fbc4
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

できました。

マウントポイントを作ります。

subro@UbuntuServer2404-1:~$ sudo mkdir /data

何も出ませんができているはずです。

UUIDを使ってマウントするため、[lv-raid0]LVのブロックデバイスとしての UUIDを確認しにいきます。

subro@UbuntuServer2404-1:~$ sudo lvdisplay raid-group/lv-raid0
  --- Logical volume ---
  LV Path                /dev/raid-group/lv-raid0
  LV Name                lv-raid0
  VG Name                raid-group
  LV UUID                j7yHUT-U2tx-D1TP-VKQi-0590-FcpR-pwUqAq
  LV Write Access        read/write
  LV Creation host, time UbuntuServer2404-1, 2025-04-29 08:11:40 +0900
  LV Status              available
  # open                 0
  LV Size                <14.99 GiB
  Current LE             3837
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     768
  Block device           252:4

[LV Path]は [/dev/raid-group/lv-raid0] でした。

blkidコマンド(locate/print block device attributes)で UUIDを確認できます。
新しいデバイスのUUIDを見る時は root権限で実行します。

subro@UbuntuServer2404-1:~$ sudo blkid /dev/raid-group/lv-raid0
/dev/raid-group/lv-raid0: UUID="991dff29-4c84-47ff-b397-3af1cd82fbc4" BLOCK_SIZE="4096" TYPE="ext4"

ピンク色のところが UUIDです。

UUIDが分かったので [/etc/fstab]ファイルを編集します。
一番下の行を追加しました。


# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-12lIizcyjCcyAF32oksfsr29gHTlOR3hUP0KZ9l3rlsdM0R8j05Yc9hVfA82VxTq / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/bc1cfd06-4015-4d64-a94d-a5deb53905bc /boot ext4 defaults 0 1
/swap.img       none    swap    sw      0       0
UUID=991dff29-4c84-47ff-b397-3af1cd82fbc4 /data ext4 defaults 0 1

systemctl daemon-reloadコマンドで変更内容を読み込ませます。

subro@UbuntuServer2404-1:~$ sudo systemctl daemon-reload

マウントします。

subro@UbuntuServer2404-1:~$ sudo systemctl start /data

dfコマンドで確認してみます。

subro@UbuntuServer2404-1:~$ df
Filesystem                        1K-blocks    Used Available Use% Mounted on
tmpfs                                808360    1476    806884   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  18631360 7446556  10213028  43% /
tmpfs                               4041800       0   4041800   0% /dev/shm
tmpfs                                  5120       0      5120   0% /run/lock
/dev/sda2                           1790136  280092   1400784  17% /boot
tmpfs                                808360      12    808348   1% /run/user/1000
/dev/mapper/raid--group-lv--raid0  15363016      24  14560792   1% /data

マウントされています。

動作確認します。

subro@UbuntuServer2404-1:~$ cd /data

subro@UbuntuServer2404-1:/data$ sudo touch aaa

subro@UbuntuServer2404-1:/data$ ls -l
合計 16
-rw-r--r-- 1 root root     0  4月 29 08:52 aaa
drwx------ 2 root root 16384  4月 29 08:22 lost+found

良さげです。

LVM2でのソフトウェアRAID構築は以上になります。


==========
昨今はオンプレなら RAIDになっているエンタープライズレベルの外部ストレージを使うし、クラウドならストレージは元々 RAIDになっているしで、ソフトウェア RAIDを作るなんて 15年以上前に安価で RAIDになっていない外部ストレージを導入して以来でした。

でもソフトウェアRAIDの考え方が当時の HP-UXと全く同じでしたので、根っこの技術は同じものなのでしょう。

「もうソフト RAIDなど…」と思っていましたが、最新のパブリッククラウドで要件が復活するなんて思いもしませんでしたね。

Linux環境では、一旦 PV/VG/LV という観念を理解してしまえば、ソフト RAIDの構築は簡単でした。
あ、RAIDそのものの仕組みの理解は前提になっていますので、念の為。

しかし Linuxもフリーなのにここまで機能があるとは大したものと思いますね。