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.
pvcreate はディスクの既存データを消去する。lsblk で対象デバイスを確認してから実行すること。
lsblk # NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sdb 8:16 0 100G 0 disk ← 未使用であることを確認
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
削除操作は取り消せない。実行前に lvs / vgs / pvs で対象を必ず確認し、データのバックアップを取ること。
よくあるトラブルと対処法
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
lvs で Data% がスナップショットで高くなっている
スナップショットの書き込みが増え容量が逼迫している。拡張か新スナップショットへの置き換えを検討する。
# スナップショットを拡張 sudo lvextend -L +5G /dev/vg_data/lv_app_snap