LVMとパーティション管理の実践 - ストレージの柔軟な運用

LVMとパーティション管理の実践 - ストレージの柔軟な運用

LVM とは何か — なぜ使うのか

LVM(Logical Volume Manager)は物理ディスクを仮想的なボリュームとして抽象化し、容量の動的拡張・スナップショット・複数ディスクの統合を可能にする仕組み。通常のパーティションは一度切ると変更が難しいが、LVM はダウンタイムなしで容量を増減できる。

結論:「ディスクを追加してオンラインで容量を増やしたい」「定期バックアップ前にスナップショットを取りたい」というユースケースに LVM を使う。

LVM が向いているケース

  • 本番稼働中のサーバで /var/home の容量が逼迫している
  • 将来的にディスク追加が見込まれるシステム
  • DB やコンテナ環境でスナップショットバックアップを使いたい

LVM の 3 層構造を理解する

LVM は 3 つの抽象レイヤーで構成される。

コンポーネント 役割
物理層 PV(Physical Volume) 実際のディスク / パーティション
中間層 VG(Volume Group) PV をまとめたストレージプール
論理層 LV(Logical Volume) VG から切り出した仮想パーティション
/dev/sdb  /dev/sdc  ←── PV(物理ボリューム)
       ↘      ↙
      vg_data      ←── VG(ボリュームグループ)
       ↓     ↓
  lv_app  lv_logs  ←── LV(論理ボリューム)

1 つの VG に複数の PV をまとめられるため、ディスクをまたいだ単一ボリュームを作れる。LV のサイズは VG の空き容量の範囲で自由に変更できる。

現在の LVM 状態を確認する

操作前に必ず現状を把握する。pvs / vgs / lvs が基本コマンド。

sudo pvs
  PV         VG      Fmt  Attr PSize   PFree
  /dev/sdb   vg_data lvm2 a--  100.00g 50.00g
sudo vgs
  VG      #PV #LV #SN Attr   VSize   VFree
  vg_data   1   1   0 wz--n- 100.00g 50.00g
sudo lvs
  LV     VG      Attr       LSize  Pool Origin Data%
  lv_app vg_data -wi-ao---- 50.00g

詳細が必要な場合は pvdisplay / vgdisplay / lvdisplay を使う。

sudo pvdisplay /dev/sdb
sudo vgdisplay vg_data
sudo lvdisplay /dev/vg_data/lv_app

LVM を新規に構築する

1. 物理ボリューム(PV)の作成

sudo pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

2. ボリュームグループ(VG)の作成

sudo vgcreate vg_data /dev/sdb
  Volume group "vg_data" successfully created

複数ディスクをまとめてプールにする場合:

sudo vgcreate vg_data /dev/sdb /dev/sdc

3. 論理ボリューム(LV)の作成

# サイズを指定して作成
sudo lvcreate -L 50G -n lv_app vg_data

# VG の空き容量をすべて使う
sudo lvcreate -l 100%FREE -n lv_app vg_data

4. ファイルシステムの作成とマウント

sudo mkfs.ext4 /dev/vg_data/lv_app
sudo mkdir -p /mnt/app
sudo mount /dev/vg_data/lv_app /mnt/app

再起動後も自動マウントするには fstab に追記する。

# UUID を確認
sudo blkid /dev/vg_data/lv_app
/dev/vg_data/lv_app: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"

/etc/fstab に以下を追記:

UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/app ext4 defaults 0 2

論理ボリュームを拡張する

LVM 最大の利点:マウントしたまま(オンラインで)容量を拡張できる

VG に空きがある場合 — 最も簡単

# 10GB 追加し、ファイルシステムも同時に拡張(-r で resize2fs を自動実行)
sudo lvextend -L +10G -r /dev/vg_data/lv_app
  Size of logical volume vg_data/lv_app changed from 50.00 GiB (12800 extents) to 60.00 GiB (15360 extents).
  Logical volume vg_data/lv_app successfully resized.
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/vg_data/lv_app is mounted on /mnt/app; on-line resizing required
The filesystem on /dev/vg_data/lv_app is now 15728640 blocks long.

-r を使わない場合は lvextend 後に手動でファイルシステムを拡張する。

sudo lvextend -L +10G /dev/vg_data/lv_app
sudo resize2fs /dev/vg_data/lv_app   # ext4
# sudo xfs_growfs /mnt/app           # XFS の場合

XFS は 縮小できない。拡張のみ対応。ext4 は resize2fs で縮小も可能だが、オフライン(アンマウント)が必要。

VG の空きが足りない場合 — 新しいディスクを追加

# 1. 新ディスクを PV として初期化
sudo pvcreate /dev/sdc

# 2. 既存 VG に追加
sudo vgextend vg_data /dev/sdc

# 3. VG の空き容量が増えたことを確認
sudo vgs vg_data

# 4. LV を拡張
sudo lvextend -L +100G -r /dev/vg_data/lv_app

拡張前の確認コマンド

# VG の空き容量
sudo vgs vg_data
# LV の現在サイズ
sudo lvs /dev/vg_data/lv_app
# ファイルシステムの使用状況
df -h /mnt/app

スナップショットを作成・活用する

スナップショットはある時点の LV の状態を保持するコピー。更新前のバックアップや安全なシステム変更に使う。

# 元 LV: /dev/vg_data/lv_app
# スナップショット名: lv_app_snap(5GB を確保)
sudo lvcreate -L 5G -s -n lv_app_snap /dev/vg_data/lv_app

スナップショットをマウントして参照:

sudo mkdir -p /mnt/app_snap
sudo mount -o ro /dev/vg_data/lv_app_snap /mnt/app_snap

スナップショットから復元(元の LV を上書き):

sudo umount /mnt/app
sudo lvconvert --merge /dev/vg_data/lv_app_snap
# マージ後スナップショットは自動削除される

スナップショットのサイズが満杯になると無効化される。元 LV への書き込み量を見積もって余裕を持ったサイズを確保すること。

# スナップショットの使用率を確認(Data% 列)
sudo lvs /dev/vg_data/lv_app_snap

論理ボリュームと VG を削除する

# 1. アンマウント
sudo umount /mnt/app

# 2. LV 削除
sudo lvremove /dev/vg_data/lv_app

# 3. VG 削除(LV が存在しない状態で)
sudo vgremove vg_data

# 4. PV 削除
sudo pvremove /dev/sdb

よくあるトラブルと対処法

lvextend 後に df でサイズが変わらない

# ファイルシステムの拡張を忘れている
sudo resize2fs /dev/vg_data/lv_app   # ext4
sudo xfs_growfs /mnt/app             # XFS

vgextend が失敗する — デバイスが見つからない

# PV として初期化されているか確認
sudo pvs
sudo pvscan

論理ボリュームが inactive になっている

sudo lvchange -ay /dev/vg_data/lv_app

lvsData% がスナップショットで高くなっている

スナップショットの書き込みが増え容量が逼迫している。拡張か新スナップショットへの置き換えを検討する。

# スナップショットを拡張
sudo lvextend -L +5G /dev/vg_data/lv_app_snap

次に読む