Linux LVMディスク拡張を徹底解説|PV・VG・LV拡張からオンライン容量拡張まで

はじめに

 Linuxサーバを運用していると、避けて通れないのが「ディスク容量不足」です。ログファイルの増加、データベース容量の拡大、アプリケーションの肥大化などにより、サーバのストレージ使用量は継続的に増えていきます。物理パーティションのみで運用している場合、容量拡張は簡単ではありません。パーティション再作成や停止作業が必要になることもあります。

 そこで活躍するのが LVM(Logical Volume Manager)です。LVMを利用すると、物理ディスクを柔軟に管理できるようになり、オンラインで容量拡張を実施できるようになります。現在のLinuxサーバ運用では、LVMは非常に一般的な構成となっています。

本記事では、以下の内容を体系的に解説します。

  • LVMの基本構成
  • ディスク追加手順
  • LVM容量拡張の流れ
  • ext4 / XFS の違い
  • オンライン拡張の仕組み

Linux初心者でも理解できるよう、概念から実践まで順番に解説していきます。

LVMの概要

LVM(Logical Volume Manager)は、Linuxでストレージを柔軟に管理するための仕組みです。

通常のパーティション管理では、ディスクサイズを後から変更するのは簡単ではありません。しかしLVMを利用すると、複数ディスクをまとめたり、論理的に容量を割り当てたりできます。

例えば以下のような運用が可能になります。

  • 後から容量を追加する
  • 複数ディスクを1つの領域として扱う
  • オンラインで拡張する
  • スナップショットを取得する

特に「停止時間を最小化しながら容量拡張できる」という点は、運用上非常に大きなメリットです。

LVMの基本構成

LVMは以下の3階層で構成されています。

PV(Physical Volume)

LVMで管理する物理ディスクやパーティションです。

例えば以下がPVになります。

  • /dev/sdb
  • /dev/sdc1

PVはLVM管理用のメタデータを持つ領域になります。

VG(Volume Group)

複数のPVをまとめたストレージプールです。VGは「容量の集合体」と考えると理解しやすいです。

例えば以下のような構成です。

  • sdb 100GB
  • sdc 100GB

これらをVGにまとめると、200GBの容量プールとして扱えます。

LV(Logical Volume)

VGから切り出される論理ボリュームです。実際には、このLVにファイルシステムを作成して利用します。Linuxから見ると、LVは通常のブロックデバイスとして扱われます。

例えば以下のように見えます。

  • /dev/vg_data/lv_root
  • /dev/vg_data/lv_home

LVM構成イメージ

LVMは以下のような構造になります。この構造を理解することが、LVM運用の第一歩です。

LVMディスク拡張

LVMのディスク拡張は、以下の順番で実施します。

  1. OSへディスク追加
  2. PV作成
  3. VGへ追加
  4. LV拡張
  5. ファイルシステム拡張

この順番は非常に重要です。

特に初心者が間違えやすいのは、「LVを拡張しただけではOS上の容量は増えない」という点です。ファイルシステム拡張まで実施して初めて、OSから利用可能になります。

今回はルート(/)パーティションの容量を拡張してみます。ルートパーティションの拡張に失敗すると、最悪のケースはシステムが起動不能になる可能性があるので、操作は慎重に実施することを推奨します。事前にスナップショットを取得しておくと良いでしょう。

拡張前のLVM構成の確認

まずは現在のディスク構成を確認します。

[root@localhost ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0   20G  0 disk
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   19G  0 part
  ├─almalinux-root 253:0    0   17G  0 lvm  /
  └─almalinux-swap 253:1    0    2G  0 lvm  [SWAP]
sr0                 11:0    1 1024M  0 rom
[root@localhost ~]#

以下を確認します。

  • 物理ディスク
  • パーティション
  • LVM構成
  • マウントポイント

本例では以下の通りとなっていることが確認できます。

  • 物理ディスク:sda
  • パーティション:sda1、sda2
  • LVM構成:sda2がLVM構成となっている
  • マウントポイント:/(ルート)

続いて、ファイルシステムのディスク容量を確認します。
マウントポイント / (ルート)のSize(上限容量)が17GB、Used(使用量)が12G、Use%(使用率)が67%となっていることが確認できます。

[root@localhost ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    4.0M     0  4.0M   0% /dev
tmpfs                       1.8G     0  1.8G   0% /dev/shm
tmpfs                       732M  8.6M  723M   2% /run
/dev/mapper/almalinux-root   17G   12G  5.7G  67% /
/dev/sda1                   960M  339M  622M  36% /boot
tmpfs                       366M     0  366M   0% /run/user/0
tmpfs                       366M     0  366M   0% /run/user/1000
[root@localhost ~]#

PVを確認します。概要はpvsコマンド、詳細はpvdisplayコマンドで確認できます。
/dev/sda2 だけでVG almalinux を構成していることが分かります。

[root@localhost ~]# pvs
  PV         VG        Fmt  Attr PSize    PFree
  /dev/sda2  almalinux lvm2 a--   <19.00g    0
[root@localhost ~]#
[root@localhost ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               almalinux
  PV Size               <19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               uHGhXs-QQ0q-fVT1-tBp8-y5nq-MOeo-NnMhtG

[root@localhost ~]#

VGを確認します。概要はvgsコマンド、詳細はvgdisplayコマンドで確認できます。

[root@localhost ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  almalinux   1   2   0 wz--n- 18.99g    0
[root@localhost ~]#
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               almalinux
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.00 GiB
  PE Size               4.00 MiB
  Total PE              4863
  Alloc PE / Size       4863 / <19.00 GiB
  Free  PE / Size       0 / 0
  VG UUID               sZz12c-7Q2h-OC0n-b3xV-LgX5-QLlE-jm4JJf

[root@localhost ~]#

almalinuxというVGがLVMで作られていることが分かります。

LVを確認します。概要はlvsコマンド、詳細はlvdisplayコマンドで確認できます。

[root@localhost ~]# lvs
  LV   VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root almalinux -wi-ao---- 16.99g
  swap almalinux -wi-ao----  2.00g
[root@localhost ~]#
[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/almalinux/swap
  LV Name                swap
  VG Name                almalinux
  LV UUID                2DL5Gj-cXef-nxev-5tgF-bcyp-06FD-XpfddE
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2026-01-31 10:23:25 +0900
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/almalinux/root
  LV Name                root
  VG Name                almalinux
  LV UUID                2bHqZO-vC7W-zv06-NRsw-jyY9-NU8o-OKR4qG
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2026-01-31 10:23:26 +0900
  LV Status              available
  # open                 1
  LV Size                <17.00 GiB
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

[root@localhost ~]#

rootとswap領域のLVがあることが分かります。

新しいディスクをOSへ追加する

今回はVirtualBoxを利用して検証します。
VirtualBoxの設定画面から新しい仮想ディスクを追加します。

対象のVMを選択して、”Setting”を押下します。

“Storage”を押下して、Controller: SATAのディスク追加アイコンをクリック。

例えば以下のように1 GBのディスクを追加してみます。

クラウド環境やVMwareでも基本的な流れは同じです。

OS側でlsblkコマンドを実行し、追加したディスクが認識されていることを確認します。

[root@localhost ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0   20G  0 disk
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   19G  0 part
  ├─almalinux-root 253:0    0   17G  0 lvm  /
  └─almalinux-swap 253:1    0    2G  0 lvm  [SWAP]
sdb                  8:16   0    1G  0 disk
sr0                 11:0    1 1024M  0 rom
[root@localhost ~]#

sdbが追加されていることが確認できています。

PV(Physical Volume)の作成

pvcreateコマンドを実行し、追加したディスクsdbをLVM管理下へ登録します。

[root@localhost ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
[root@localhost ~]#

以下の通り、sdbがPVとして認識されたことが確認できます。この時点ではまだVGには所属していません。

[root@localhost ~]# pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda2  almalinux lvm2 a--  18.66g    0
  /dev/sdb             lvm2 ---   1.00g 1.00g
[root@appserver-dev ~]#
[root@appserver-dev ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               almalinux
  PV Size               19.66 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5033
  Free PE               0
  Allocated PE          5033
  PV UUID               sqZLlZ-faAN-YQzp-7bMJ-EBZk-pHTO-MGumn6

  "/dev/sdb" is a new physical volume of "1.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name
  PV Size               1.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               t1a80d-8NAe-trBY-BjyM-qfML-5jOa-rbmYYf

[root@appserver-dev ~]#

※各PVには下記の通りUUIDが付与されます。LVMはUUIDベースで管理されるため、デバイス名変更に比較的強い設計になっています。
PV UUID t1a80d-8NAe-trBY-BjyM-qfML-5jOa-rbmYYf

VG(Volume Group)へ追加

追加したPVをVGへ組み込みます。事前に追加するVGの名前を確認しておいてください。下記の例ではalmalinuxがVG名となります。

[root@localhost ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  almalinux   1   2   0 wz--n- 18.66g    0
[root@appserver-dev ~]#

それでは、vgextendコマンドで先ほど作成したPVをVGに組み込みます。

[root@localhost ~]# vgextend almalinux /dev/sdb
  Volume group "almalinux" successfully extended
[root@appserver-dev ~]#

vgs、vgdisplayコマンドで結果を確認してみましょう。
vgsの結果から、Vsizeが19.66g 、VFreeが1020.00mに拡張されていることが分かります。また、vgdisplayの結果から、Free PEが1020.00 MiB確保されたことが確認できます。

[root@localhost ~]# vgs
  VG        #PV #LV #SN Attr   VSize   VFree
  almalinux   2   2   0 wz--n- <19.66g 1020.00m
[root@appserver-dev ~]#
[root@appserver-dev ~]# vgdisplay
  --- Volume group ---
  VG Name               almalinux
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <20.66 GiB
  PE Size               4.00 MiB
  Total PE              5288
  Alloc PE / Size       5033 / 19.66 GiB
  Free  PE / Size       255 / 1020.00 MiB
  VG UUID               mTIEZi-Qobe-zo2c-fWic-5uOq-Qh76-kgwpbc

[root@appserver-dev ~]#

※LVM内部では、PE(Physical Extent)という単位で容量管理されます。これはLVM内部の管理ブロックです。例えば4MB単位で管理されるケースがあります。LVMはこのPEを組み合わせてLVを構築しています。

LV(Logical Volume)を拡張

lvextendコマンドによりLVを拡張します。拡張サイズを指定することもできますが、今回は追加したディスクすべての容量を /dev/almalinux/root に追加します。

[root@localhost ~]# lvextend -l +100%FREE /dev/almalinux/root
  Size of logical volume almalinux/root changed from 17.59 GiB (4504 extents) to <18.59 GiB (4759 extents).
  Logical volume almalinux/root successfully resized.
[root@appserver-dev ~]#

※拡張サイズを指定する場合は、以下のようにコマンドを実行してください。
lvextend -L +512M /dev/almalinux/root

それでは拡張後のLVを確認してみましょう。
lvsの結果より、LV rootのLSizeが18.59gに拡張されていることが確認できます。
また、lvdisplayの結果からも LV Size が18.59 GiBに拡張されていることが確認できます。

[root@localhost ~]# lvs
  LV   VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root almalinux -wi-ao---- <18.59g
  swap almalinux -wi-ao----  <2.07g
[root@appserver-dev ~]#
[root@appserver-dev ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/almalinux/swap
  LV Name                swap
  VG Name                almalinux
  LV UUID                QXtGd3-CHQC-qnFx-N3tA-cg0e-lOmc-ZpmZhB
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2025-05-18 08:42:57 +0900
  LV Status              available
  # open                 2
  LV Size                <2.07 GiB
  Current LE             529
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/almalinux/root
  LV Name                root
  VG Name                almalinux
  LV UUID                dz0gNJ-jskZ-8GLe-2ds5-H88M-nKyV-ONCN8f
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2025-05-18 08:42:58 +0900
  LV Status              available
  # open                 1
  LV Size                <18.59 GiB
  Current LE             4759
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

[root@appserver-dev ~]#

LVMの大きなメリットは、マウント中でも容量拡張できることです。物理ディスクと論理ボリュームが分離されていることにより、ファイルシステムから直接物理ディスクを見ていないためにオンライン状態(マウントしたままの拡張)での拡張が可能となります。これにより運用中でも柔軟に拡張を行うことができます。

ファイルシステムの拡張

ファイルシステムの種類によって拡張のコマンドが変わってきます。ここではXFSの拡張をします。

[root@localhost ~]# xfs_growfs /
meta-data=/dev/mapper/almalinux-root isize=512    agcount=4, agsize=1153024 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=4612096, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 4612096 to 4873216
[root@appserver-dev ~]#

以下の通り、ルート(/)パーティションの容量が18GBに拡張されたことが確認できました。

[root@localhost ~]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    4.0M     0  4.0M   0% /dev
tmpfs                       1.8G     0  1.8G   0% /dev/shm
tmpfs                       732M  8.6M  723M   2% /run
/dev/mapper/almalinux-root   18G   12G  6.7G  63% /
/dev/sda1                   960M  339M  622M  36% /boot
tmpfs                       366M     0  366M   0% /run/user/0
tmpfs                       366M     0  366M   0% /run/user/1000
[root@localhost ~]#

※XFSの場合は拡張したファイルシステムを縮小することはできません。どうしても縮小するときは再作成が必要となりますのでご留意ください。
※ext4の場合は、”resize2fs /” を実行することで拡張が可能です。

まとめ

本記事では、LVM(Logical Volume Manager)の基本構成から、実際のディスク追加・容量拡張手順までを解説しました。

LVMでは、以下の3階層でストレージを管理します。

  • PV(Physical Volume)
  • VG(Volume Group)
  • LV(Logical Volume)

この構造により、物理ディスクとファイルシステムを分離し、柔軟なストレージ運用が可能になります。

実際の拡張手順としては、以下の流れで作業を実施しました。

  1. OSへディスク追加
  2. pvcreate によるPV作成
  3. vgextend によるVGへの追加
  4. lvextend によるLV拡張
  5. xfs_growfs / resize2fs によるファイルシステム拡張

また、LVMの大きな特徴として、オンライン状態のまま容量拡張できる点があります。これは、LVMが物理ディスクとファイルシステムの間を抽象化しているためです。現在のLinuxサーバ運用では、停止時間を最小化するためにLVMは非常に重要な技術となっています。

Linuxサーバを運用する上で、LVMは非常に頻繁に利用される重要技術です。本記事が、LVMの理解や実際の運用・検証の助けになれば幸いです。

コメント