LVMを使ってみたかったのでEC2とEBSでやってみた

EBSとEC2でLVM関連のコマンドを使ってみました。
2022.12.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。CX事業本部Delivery部のえーたん(@eetann092)です。

最近LVM(Logical Volume Manager)の存在を知って試したくなったため、EBSとEC2を使って素振りしました。

本記事は、以下の記事を参考に適度に寄り道した素振りの記録です。

本記事で作成したボリュームグループ(Volume Group)の構成は以下です。

EC2インスタンスの起動

今回使うEC2インスタンスの起動の設定ではEBSボリュームを2つ追加しました。

インスタンスが起動できたら、インスタンスの詳細画面の「接続」ボタンから、お好みの方法でインスタンスに接続します。

情報の確認

以降はインスタンスに接続後の操作です。

まず、最初の時点でのボリュームグループ(volume group)、物理ボリューム(physical volume)、論理ボリューム(logical volume)の確認をします。何も操作していないため、3つとも何も表示されません。

sudo su -
vgs
pvs
lvs

マニュアルを開くとvgs produces formatted output about VGsと書かれているため、vgs,pvs,lvssは複数形を表しているのかな、と筆者は予想しています。

続いて、ブロックデバイスの一覧を表示します。今回扱うのは/dev/xvdb/dev/xvdcの2つです。

lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0   8G  0 disk
xvdc    202:32   0   8G  0 disk

追加したボリュームのデバイス名は、「ストレージ」のタブから確認できます。

上記で確認したデバイス名は/dev/sdb/dev/sdcでしたが、本記事ではそのシンボリックリンク先の/dev/xvdb/dev/xvdcを使いました。

以下、/dev/xvdb/dev/xvdcの両方で操作が同じ場合は片方だけ書きます。

せっかくなので、partedで確認します(gdisk -l /dev/xvdcでもできます)。まだ何も操作していないため、パーティションテーブルはunknownです。

parted /dev/xvdc print
Error: /dev/xvdc: unrecognised disk label
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

パーティションの作成

パーティションを作成します。

gdisk /dev/xvdc

まず、何も無いねと言われます。

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.

パーティションの新規作成では、Hex codeは8e00(Linux LVM)を指定します。

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-16777182, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-16777182, default = 16777182) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'

確認後、書き込みます。

Command (? for help): p
Disk /dev/xvdc: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): B7D400C3-D601-485B-BF71-24A87EEB2F38
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048        16777182   8.0 GiB     8E00  Linux LVM
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/xvdc.
The operation has completed successfully.

もう一度lsblkを実行すると、パーティションxvdb1xvdc1が作成されていることが確認できます。

NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0   8G  0 disk
└─xvdb1 202:17   0   8G  0 part
xvdc    202:32   0   8G  0 disk
└─xvdc1 202:33   0   8G  0 part

partedを実行すると、Name列がLinux LVM、Flags列がlvmになっています。

parted /dev/xvdc print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdc: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name       Flags
 1      1049kB  8590MB  8589MB               Linux LVM  lvm

物理ボリュームの作成

物理ボリューム(physical volume)を作成します。

pvcreate /dev/xvdc1
Physical volume "/dev/xvdc1" successfully created.

物理ボリューム一覧を見ると、/dev/sdb1/dev/sdc1として登録されています。

pvs
  PV         VG Fmt  Attr PSize  PFree
  /dev/sdb1     lvm2 ---  <8.00g <8.00g
  /dev/sdc1     lvm2 ---  <8.00g <8.00g

詳細も見てみます。

pvdisplay
  "/dev/sdb1" is a new physical volume of "<8.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               <8.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               yhS7uN-bebl-wKG1-rRkE-FMs5-XVT4-uZZSPb

  "/dev/sdc1" is a new physical volume of "<8.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name
  PV Size               <8.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               zf6pPJ-nHme-Odbh-VwMW-ZkqS-hvXu-6VH5aS

まだボリュームグループに割り当てていないため、AllocatableNOPE(physical extent)は0です。

ボリュームグループの作成

ボリュームグループexample-groupを作成します。最初に割り当てる物理ボリュームは/dev/xvdb1にします。

vgcreate example-group /dev/xvdb1
  Volume group "example-group" successfully created

中身を確認します。

vgdisplay
  --- Volume group ---
  VG Name               example-group
  System ID
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               <8.00 GiB
  PE Size               4.00 MiB
  Total PE              2047
  Alloc PE / Size       0 / 0
  Free  PE / Size       2047 / <8.00 GiB
  VG UUID               KtJR3f-BorE-5gTf-jwha-9dn0-Pe5Q-cLZwzf

物理ボリュームの数が1、サイズは8.00 GiB未満(2047 x 4.00 / 1024 ≒ 7.99 GiB)であることが分かります。

/dev/xvdc1もボリュームグループへ追加します。

vgextend example-group /dev/xvdc1
  Volume group "example-group" successfully extended

もう一度ボリュームグループを確認すると、物理ボリュームの数やサイズ(VG Size)や使用できるPE(Free PE / Size)が増えていることが分かります。

vgdisplay
  --- Volume group ---
  VG Name               example-group
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               15.99 GiB
  PE Size               4.00 MiB
  Total PE              4094
  Alloc PE / Size       0 / 0
  Free  PE / Size       4094 / 15.99 GiB
  VG UUID               KtJR3f-BorE-5gTf-jwha-9dn0-Pe5Q-cLZwzf

ただし、まだ論理ボリューム(logical volume)の数は0のままです。

論理ボリュームの作成

「12GiBの論理ボリュームlv-12g」をボリュームグループexample-groupの中に作成します。

lvcreate --size 12G --name lv-12g example-group
  Logical volume "lv-12g" created.

「2GiBの論理ボリュームlv-2g」も作成します。

lvcreate --size 2G --name lv-2g example-group
  Logical volume "lv-2g" created.

詳細を確認すると、パスが/dev/example-group/lv-12g/dev/example-group/lv-2gに割り当てられたことが分かります。

lvdisplay
  --- Logical volume ---
  LV Path                /dev/example-group/lv-12g
  LV Name                lv-12g
  VG Name                example-group
  LV UUID                QcpDK6-syZA-7htj-fzvN-7nHN-u4AZ-DPjwjy
  LV Write Access        read/write
  LV Creation host, time ip-172-31-37-52.ap-northeast-1.compute.internal, 2022-12-11 07:25:02 +0000
  LV Status              available
  # open                 0
  LV Size                12.00 GiB
  Current LE             3072
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/example-group/lv-2g
  LV Name                lv-2g
  VG Name                example-group
  LV UUID                SjEDG8-3t8s-dy6R-IrXw-l3He-3fHN-FIoAey
  LV Write Access        read/write
  LV Creation host, time ip-172-31-37-52.ap-northeast-1.compute.internal, 2022-12-11 07:25:12 +0000
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

ボリュームグループを確認すると、割り当てられたPE(Alloc PE / Size)が増え、余ったPE(Free PE / Size)が減っていることが分かります。

vgdisplay
  --- Volume group ---
  VG Name               example-group
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               15.99 GiB
  PE Size               4.00 MiB
  Total PE              4094
  Alloc PE / Size       3584 / 14.00 GiB
  Free  PE / Size       510 / 1.99 GiB
  VG UUID               KtJR3f-BorE-5gTf-jwha-9dn0-Pe5Q-cLZwzf

これで、冒頭に載せた構成は完成です。

ファイルシステムの作成

先程確認したパスを指定して、ファイルシステムを作成、適当にマウントします。

mkfs -t ext4 /dev/example-group/lv-12g
mkfs -t ext4 /dev/example-group/lv-2g
mkdir /example
mkdir /example/12g /example/2g
mount /dev/example-group/lv-12g /example/12g
mount /dev/example-group/lv-2g /example/2g

論理ボリュームの削除

素振りがしたいだけだったので、残念ですが論理ボリュームlv-2gとはここでお別れです。アンマウントしてから論理ボリュームを削除します。

umount /example/2g/
lvremove example-group/lv-2g
Do you really want to remove active logical volume example-group/lv-2g? [y/n]: y
  Logical volume "lv-2g" successfully removed

ボリュームグループを確認すると、論理ボリュームと割り当てられたPE(Alloc PE / Size)が減っています。その代わり、余っているPE(Free PE / Size)が増えました。

vgdisplay
  --- Volume group ---
  VG Name               example-group
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               15.99 GiB
  PE Size               4.00 MiB
  Total PE              4094
  Alloc PE / Size       3072 / 12.00 GiB
  Free  PE / Size       1022 / 3.99 GiB
  VG UUID               KtJR3f-BorE-5gTf-jwha-9dn0-Pe5Q-cLZwzf

論理ボリュームの拡張

せっかくなので余ったPEを論理ボリュームlv-12gに割り当てます。resizefsオプションを使って、ファイルシステムのサイズも合わせて拡張しておきます。

lvresize --extents +1022 --resizefs --verbose example-group/lv-12g

趣味でverboseオプションをつけて出力が長くなったため、折りたたみの中に書いておきました。

クリックで展開できます
    Executing: /usr/sbin/fsadm --verbose check /dev/example-group/lv-12g
fsadm: "ext4" filesystem found on "/dev/mapper/example--group-lv--12g".
fsadm: Skipping filesystem check for device "/dev/mapper/example--group-lv--12g" as the filesystem is mounted on /example/12g
    /usr/sbin/fsadm failed: 3
    Archiving volume group "example-group" metadata (seqno 11).
    Extending logical volume example-group/lv-12g to 15.99 GiB
  Size of logical volume example-group/lv-12g changed from 12.00 GiB (3072 extents) to 15.99 GiB (4094 extents).
    Loading table for example--group-lv--12g (253:0).
    Suspending example--group-lv--12g (253:0) with device flush
    Resuming example--group-lv--12g (253:0).
    Creating volume group backup "/etc/lvm/backup/example-group" (seqno 12).
  Logical volume example-group/lv-12g successfully resized.
    Executing: /usr/sbin/fsadm --verbose resize /dev/example-group/lv-12g 16769024K
fsadm: "ext4" filesystem found on "/dev/mapper/example--group-lv--12g".
fsadm: Device "/dev/mapper/example--group-lv--12g" size is 17171480576 bytes
fsadm: Parsing tune2fs -l "/dev/mapper/example--group-lv--12g"
fsadm: Resizing filesystem on device "/dev/mapper/example--group-lv--12g" to 17171480576 bytes (3145728 -> 4192256 blocks of 4096 bytes)
fsadm: Executing resize2fs /dev/mapper/example--group-lv--12g 4192256
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/mapper/example--group-lv--12g is mounted on /example/12g; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/mapper/example--group-lv--12g is now 4192256 blocks long.

余っているPE(Free PE / Size)が0になりました。

vgdisplay
  --- Volume group ---
  VG Name               example-group
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               15.99 GiB
  PE Size               4.00 MiB
  Total PE              4094
  Alloc PE / Size       4094 / 15.99 GiB
  Free  PE / Size       0 / 0
  VG UUID               KtJR3f-BorE-5gTf-jwha-9dn0-Pe5Q-cLZwzf

最後にもう一度ブロックデバイスの一覧を表示すると、論理ボリュームのデバイスも表示されます。

lsblk
NAME                       MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda                       202:0    0   8G  0 disk
└─xvda1                    202:1    0   8G  0 part /
xvdb                       202:16   0   8G  0 disk
└─xvdb1                    202:17   0   8G  0 part
  └─example--group-lv--12g 253:0    0  16G  0 lvm  /example/12g
xvdc                       202:32   0   8G  0 disk
└─xvdc1                    202:33   0   8G  0 part
  └─example--group-lv--12g 253:0    0  16G  0 lvm  /example/12g

最後に

本記事では載せませんでしたが、manコマンドでマニュアルを見るとLVM関連のコマンドのオプションは豊富であることが分かります。また、EXAMPLESセクションにはたくさんの例が、SEE ALSOセクションにはたくさんの関連コマンドが載っているので、ぜひ読んでみてください。

試し終わったら、使用したリソースの停止や削除を忘れないようにしましょう。