「LVMって言葉は聞いたことあるけど、pvとvgとlvの関係がよくわからない」
こういった疑問を持つエンジニアは多いです。LVM(Logical Volume Manager)は、物理ディスクを柔軟に管理するLinuxの標準的な仕組みですが、
pvcreate・vgcreate・lvcreate という3つのコマンドの役割と順序を理解しないと、どこで何をしているのか迷子になりがちです。この記事では、pvcreate・vgcreate・lvcreateコマンドを使ってLVMボリュームをゼロから構築する手順を、RHEL 9.4 / Rocky Linux 9 の実環境で確認した出力例とともに解説します。ディスク追加から論理ボリューム作成・フォーマット・マウントまでを一通り体験できる内容です。
この記事のポイント
・pvcreate→vgcreate→lvcreateの3段階でLVMを構築できる
・PV(物理ボリューム)・VG(ボリュームグループ)・LV(論理ボリューム)の役割を理解する
・lvcreateの-Lと-lオプションでサイズ指定方法が異なる
・構築後はmkfsでフォーマット・fstabにUUIDで永続マウントが必須
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
LVM(論理ボリュームマネージャ)とは何か
LVMは、物理ディスクを抽象化して柔軟に管理するためのLinux標準の仕組みです。通常のパーティション管理と何が違うかというと、「後からサイズを変更できること」「複数のディスクをまとめて1つの領域として扱えること」です。LVMを使わない場合、ディスクのパーティションを変更するには一度データを退避する必要がありますが、LVMを使えば稼働中のシステムでもオンラインで拡張できます。本番サーバーでは当たり前に使われており、RedHat系のOSではデフォルトインストール時にLVMが使われています。
LVMには3つの層があります。
| 層 | 名称(略称) | 役割 |
|---|---|---|
| 第1層 | 物理ボリューム(PV) | 実際の物理ディスク・パーティション。pvcreateで初期化する |
| 第2層 | ボリュームグループ(VG) | 複数のPVをまとめたプール。vgcreateで作成する |
| 第3層 | 論理ボリューム(LV) | VGから切り出した論理的な領域。lvcreateで作成する |
事前準備:追加ディスクの確認
1. ディスクの確認(lsblk)
LVM構築の前に、追加したディスクが認識されているか確認します。# 接続されているブロックデバイスを一覧表示 $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 20G 0 disk └─sda1 8:1 0 20G 0 part / sdb 8:16 0 10G 0 disk sdc 8:32 0 10G 0 disk
/dev/sdb と /dev/sdc(各10GB)が追加済みのディスクです。これらにLVMを構築していきます。2. pvs・vgs・lvsで既存LVM構成を確認
作業前に現在のLVM構成を確認しておきます。# 既存の物理ボリューム一覧 $ sudo pvs PV VG Fmt Attr PSize PFree # 既存のボリュームグループ一覧 $ sudo vgs VG #PV #LV #SN Attr VSize VFree # 既存の論理ボリューム一覧 $ sudo lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
Step 1:pvcreateで物理ボリュームを作成する
1. pvcreateコマンドの書式
# 書式 sudo pvcreate [デバイス名] # 例:/dev/sdbをPVとして初期化 sudo pvcreate /dev/sdb # 例:複数のデバイスを一度にPV初期化 sudo pvcreate /dev/sdb /dev/sdc
2. 実際に実行してみる
[root@rocky9-demo ~]# pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created.
3. PVの作成を確認する
[root@rocky9-demo ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 10.00g 10.00g /dev/sdc lvm2 --- 10.00g 10.00g # より詳細な情報を表示 [root@rocky9-demo ~]# pvdisplay /dev/sdb "/dev/sdb" is a new physical volume of "10.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size 10.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 3jWqYb-mK8a-zSXc-7Rp9-oNqd-4U3e-vBf2kL
【重要】pvcreate実行前の注意点
・既存データが消える:pvcreateを実行すると、そのデバイスの既存データは失われます。必ずlsblkとblkidで正しいデバイスを確認してから実行してください・パーティション vs 生ディスク:パーティション(/dev/sdb1)でも生ディスク(/dev/sdb)でもPV化できますが、生ディスクへの直接適用の方が一般的です
・ファイルシステムが存在する場合:すでにマウントされているデバイスにpvcreateを実行しないこと
Step 2:vgcreateでボリュームグループを作成する
1. vgcreateコマンドの書式
# 書式 sudo vgcreate [VG名] [PVデバイス名...] # 例:datavgという名前でVGを作成し、sdbとsdcを追加 sudo vgcreate datavg /dev/sdb /dev/sdc # 例:PE(Physical Extent)サイズを指定して作成(デフォルト4MB) sudo vgcreate -s 8M datavg /dev/sdb
2. 実際に実行してみる
[root@rocky9-demo ~]# vgcreate datavg /dev/sdb /dev/sdc Volume group "datavg" successfully created [root@rocky9-demo ~]# vgs VG #PV #LV #SN Attr VSize VFree datavg 2 0 0 wz--n- <19.99g <19.99g [root@rocky9-demo ~]# vgdisplay datavg --- Volume group --- VG Name datavg System ID Format lvm2 Metadata Areas 2 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 2 Act PV 2 VG Size <19.99 GiB PE Size 4.00 MiB Total PE 5118 Alloc PE / Size 0 / 0 Free PE / Size 5118 / <19.99 GiB VG UUID Kx9mVt-aBc7-dEf3-pQrs-9LmN-2WuX-oYz1kP
Step 3:lvcreateで論理ボリュームを作成する
1. lvcreateコマンドの書式
# 書式(-Lでサイズ指定) sudo lvcreate -L [サイズ] -n [LV名] [VG名] # 書式(-lでPE数またはVG使用率で指定) sudo lvcreate -l [PE数または%FREE] -n [LV名] [VG名] # 例:5GBのLVを作成 sudo lvcreate -L 5G -n datalv datavg # 例:VGの空き領域の100%(全容量)をLVに割り当て sudo lvcreate -l 100%FREE -n datalv datavg # 例:VGの空き領域の50%をLVに割り当て sudo lvcreate -l 50%FREE -n datalv datavg
・-L(大文字L):絶対サイズ指定(例:-L 5G、-L 500M)
・-l(小文字l):PE数またはVG割合で指定(例:-l 100%FREE)
2. 実際に実行してみる
# 8GBのLVを作成 [root@rocky9-demo ~]# lvcreate -L 8G -n datalv datavg Logical volume "datalv" created. # 残り全容量を別のLVに割り当て [root@rocky9-demo ~]# lvcreate -l 100%FREE -n loglv datavg Logical volume "loglv" created. [root@rocky9-demo ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert datalv datavg -wi-a----- 8.00g loglv datavg -wi-a----- <11.99g
/dev/[VG名]/[LV名] または /dev/mapper/[VG名]-[LV名] でアクセスできます。[root@rocky9-demo ~]# ls -la /dev/datavg/ total 0 drwxr-xr-x. 2 root root 80 May 9 10:25 . drwxr-xr-x. 3 root root 200 May 9 10:25 .. lrwxrwxrwx. 1 root root 7 May 9 10:25 datalv -> ../dm-0 lrwxrwxrwx. 1 root root 7 May 9 10:25 loglv -> ../dm-1
Step 4:mkfsでフォーマットしてマウントする
1. ファイルシステムを作成する
LVを作成しただけではまだ使えません。mkfsでファイルシステムをフォーマットします。# XFS形式でフォーマット(RHEL9系のデフォルト) [root@rocky9-demo ~]# mkfs.xfs /dev/datavg/datalv meta-data=/dev/datavg/datalv isize=512 agcount=4, agsize=524288 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=2097152, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, reflink=1 log =internal log bsize=4096 blocks=16384, sectsz=512 = sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # ext4形式でフォーマット(Ubuntu系でよく使われる) # mkfs.ext4 /dev/datavg/loglv
2. マウントポイントを作成してマウントする
# マウントポイントを作成 [root@rocky9-demo ~]# mkdir -p /mnt/data /mnt/log # 一時的にマウント(再起動後に解除される) [root@rocky9-demo ~]# mount /dev/datavg/datalv /mnt/data [root@rocky9-demo ~]# mount /dev/datavg/loglv /mnt/log # マウント確認 [root@rocky9-demo ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 891M 0 891M 0% /dev/shm tmpfs 357M 5.5M 351M 2% /run /dev/sda1 20G 2.1G 18G 11% / /dev/mapper/datavg-datalv 8G 104M 7.9G 2% /mnt/data /dev/mapper/datavg-loglv 12G 128M 12G 2% /mnt/log
3. 永続マウントの設定(fstabへの追記)
再起動後もマウントを維持するには、/etc/fstabに設定を追記します。デバイス名ではなくUUIDを使うのが安全です。# UUIDを確認 [root@rocky9-demo ~]# blkid /dev/datavg/datalv /dev/datavg/datalv: UUID="a4b8c3d2-1e5f-4a7b-9c0d-3e6f8a1b2c4d" BLOCK_SIZE="512" TYPE="xfs" # /etc/fstabに追記(UUIDを使って指定) UUID=a4b8c3d2-1e5f-4a7b-9c0d-3e6f8a1b2c4d /mnt/data xfs defaults 0 0 # fstabの記述をテスト(エラーなく実行できれば設定OK) [root@rocky9-demo ~]# mount -a [root@rocky9-demo ~]# echo $? 0
応用:よく使うLVM管理コマンド
1. LVのサイズを拡張する(lvextend)
運用中にLVのサイズを拡張したい場合、オンラインで実行できます。# datalvを5GB拡張 [root@rocky9-demo ~]# lvextend -L +5G /dev/datavg/datalv Size of logical volume datavg/datalv changed from 8.00 GiB (2048 extents) to 13.00 GiB (3328 extents). Logical volume datavg/datalv successfully resized. # XFSのファイルシステムも拡張(オンライン対応) [root@rocky9-demo ~]# xfs_growfs /mnt/data meta-data=/dev/mapper/datavg-datalv isize=512 agcount=4, agsize=524288 blks ... data blocks changed from 2097152 to 3407872 # ext4の場合はresize2fsを使用 # resize2fs /dev/datavg/datalv
2. VGにPVを追加する(vgextend)
新しいディスクを追加してVGを拡張できます。# 新しいディスク/dev/sddをPV化 [root@rocky9-demo ~]# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created. # datavgにsddを追加 [root@rocky9-demo ~]# vgextend datavg /dev/sdd Volume group "datavg" successfully extended [root@rocky9-demo ~]# vgs VG #PV #LV #SN Attr VSize VFree datavg 3 2 0 wz--n- <29.99g <9.99g
3. LVをVGの空き容量すべてで拡張する
# 空き容量をすべてdatalvに割り当てて拡張 [root@rocky9-demo ~]# lvextend -l +100%FREE -r /dev/datavg/datalv Size of logical volume datavg/datalv changed from 13.00 GiB to <22.99 GiB (5884 extents). Logical volume datavg/datalv successfully resized. Filesystem at /dev/mapper/datavg-datalv is mounted on /mnt/data; on-line growing required. ...
-r(--resizefs)オプションを付けると、lvextendと同時にファイルシステムの拡張も自動で実行されます。トラブルシュート・エラー対処
1. 「Device /dev/sdb excluded by a filter」が出た場合
[root@rocky9-demo ~]# pvcreate /dev/sdb Device /dev/sdb excluded by a filter.
対処法:
# 既存のファイルシステムシグネチャを確認 [root@rocky9-demo ~]# blkid /dev/sdb /dev/sdb: UUID="xxx" TYPE="ext4" # wipefs で既存のシグネチャを消去(データ破壊注意) [root@rocky9-demo ~]# wipefs -a /dev/sdb /dev/sdb: 2 bytes were erased at offset 0x00000438 (ext4): 53 ef # 再度pvcreateを実行 [root@rocky9-demo ~]# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created.
2. 「Can't open /dev/sdb exclusively. Mounted filesystem?」が出た場合
[root@rocky9-demo ~]# pvcreate /dev/sdb Can't open /dev/sdb exclusively. Mounted filesystem?
# マウントを確認 [root@rocky9-demo ~]# df -h | grep sdb /dev/sdb 500M 1.1M 499M 1% /olddata # アンマウントしてからpvcreateを実行 [root@rocky9-demo ~]# umount /olddata [root@rocky9-demo ~]# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created.
3. 「Insufficient free space」でlvcreateが失敗する場合
[root@rocky9-demo ~]# lvcreate -L 30G -n bigvolume datavg Insufficient free space: 7680 extents needed, but only 5118 available.
# 空き容量を確認 [root@rocky9-demo ~]# vgs VG #PV #LV #SN Attr VSize VFree datavg 2 0 0 wz--n- <19.99g <19.99g # VFreeの範囲内でlvcreateを実行 [root@rocky9-demo ~]# lvcreate -l 100%FREE -n datalv datavg Logical volume "datalv" created.
4. 「WARNING: xfs signature detected」の警告が出た場合
[root@rocky9-demo ~]# pvcreate /dev/sdb WARNING: xfs signature detected on /dev/sdb at offset 0. Wipe it? [y/n]: y Wiping xfs signature on /dev/sdb. Physical volume "/dev/sdb" successfully created.
本記事のまとめ
pvcreate・vgcreate・lvcreateの3コマンドでLVMボリュームを構築する手順をまとめます。| やりたいこと | コマンド |
|---|---|
| ディスクをPVとして初期化 | sudo pvcreate /dev/sdb |
| 複数PVをまとめてVGを作成 | sudo vgcreate datavg /dev/sdb /dev/sdc |
| 指定サイズのLVを作成 | sudo lvcreate -L 8G -n datalv datavg |
| VGの空き全容量でLVを作成 | sudo lvcreate -l 100%FREE -n datalv datavg |
| LVをXFSでフォーマット | sudo mkfs.xfs /dev/datavg/datalv |
| LVのサイズを拡張 | sudo lvextend -L +5G -r /dev/datavg/datalv |
| VGにPVを追加して拡張 | sudo vgextend datavg /dev/sdd |
| LVM構成全体を確認 | sudo pvs / sudo vgs / sudo lvs |
lsblkとblkidでデバイスを必ず確認してください。LVMでボリュームを拡張したい場合は、Linux ポート確認の全コマンドと同様に「現状確認→計画→実行」の順で慎重に進めることが現場の基本です。
LVM構築の「なぜ」まで理解できていますか?
pvcreate・vgcreate・lvcreateのコマンドを叩けても、障害時にどのPVが壊れてVGがどう影響を受けるかを説明できないと、本番環境では危険です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:ip routeコマンドでLinuxのルーティングテーブルを確認・設定する方法|静的ルート追加とトラブルシュートも
- 前のページへ:mktempコマンドでシェルスクリプトの一時ファイルを安全に作成する方法|並列処理の衝突防止と自動削除も
- この記事の属するカテゴリ:Linuxtips・ディスク操作へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます