Disk Partitioning and LVM
ディスクパーティショニングと LVM 包括的ガイド
目次
- はじめに
- MBR vs GPT
- パーティショニングツール
- パーティションタイプ
- LVM アーキテクチャ
- 物理ボリューム (PV) の管理
- ボリュームグループ (VG) の管理
- 論理ボリューム (LV) の管理
- LVM Thin Provisioning
- LVM スナップショット
- LVM ミラーリング
- LVM ストライピング
- LVM キャッシュ
- ファイルシステムのリサイズ
- 実践シナリオ
- トラブルシューティング
- ベストプラクティス
- 参考文献
1. はじめに
ディスクパーティショニングと LVM (Logical Volume Manager) は、Linux システムにおけるストレージ管理の根幹をなす技術である。本ガイドでは、物理的なディスクのパーティショニングから LVM による柔軟なボリューム管理まで、包括的に解説する。
1.1 ストレージ管理の階層構造
┌─────────────────────────────────────────────────┐
│ ファイルシステム │
│ (ext4, xfs, btrfs) │
├─────────────────────────────────────────────────┤
│ 論理ボリューム (LV) │
│ (lv_root, lv_home, lv_data) │
├─────────────────────────────────────────────────┤
│ ボリュームグループ (VG) │
│ (vg_system, vg_data) │
├─────────────────────────────────────────────────┤
│ 物理ボリューム (PV) │
│ (/dev/sda2, /dev/sdb1) │
├─────────────────────────────────────────────────┤
│ パーティション │
│ (/dev/sda1, /dev/sda2, /dev/sdb1) │
├─────────────────────────────────────────────────┤
│ 物理ディスク │
│ (/dev/sda, /dev/sdb, /dev/nvme0n1) │
└─────────────────────────────────────────────────┘
2. MBR vs GPT
2.1 比較表
| 特性 | MBR (Master Boot Record) | GPT (GUID Partition Table) |
|---|---|---|
| 導入年 | 1983 | 2000年代初期 (UEFI仕様の一部) |
| 最大ディスクサイズ | 2 TiB | 9.4 ZiB (理論上) |
| 最大パーティション数 | 4 プライマリ (拡張使用で最大15) | 128 (デフォルト) |
| パーティションテーブル位置 | ディスクの先頭セクタ | ディスクの先頭と末尾 (冗長) |
| ブートモード | BIOS/Legacy | UEFI |
| データ整合性 | なし | CRC32 チェックサム |
| パーティション識別 | タイプコード (1バイト) | GUID (16バイト) |
| 冗長性 | なし | バックアップテーブルあり |
2.2 MBR 構造
ディスクの先頭 512 バイト (MBR)
┌──────────────────────────┐ オフセット 0
│ ブートストラップコード │ 446 バイト
│ (ブートローダーの最初の │
│ ステージ) │
├──────────────────────────┤ オフセット 446
│ パーティションテーブル │ 64 バイト (各16バイト x 4)
│ ├── パーティション1 │
│ ├── パーティション2 │
│ ├── パーティション3 │
│ └── パーティション4 │
├──────────────────────────┤ オフセット 510
│ MBR シグネチャ (0x55AA) │ 2 バイト
└──────────────────────────┘
2.3 GPT 構造
┌──────────────────────────┐ LBA 0
│ Protective MBR │ (レガシー互換用)
├──────────────────────────┤ LBA 1
│ Primary GPT Header │ (CRC32チェックサム含む)
├──────────────────────────┤ LBA 2-33
│ Primary Partition │ (最大128パーティション)
│ Entry Array │ (各128バイト)
├──────────────────────────┤
│ │
│ パーティションデータ │
│ │
├──────────────────────────┤
│ Backup Partition │ (冗長コピー)
│ Entry Array │
├──────────────────────────┤
│ Backup GPT Header │ (冗長コピー)
└──────────────────────────┘
2.4 パーティションテーブルの確認
# ディスクのパーティションテーブルタイプを確認
fdisk -l /dev/sda
# MBR の場合:
# Disklabel type: dos
# GPT の場合:
# Disklabel type: gpt
# blkid での確認
blkid -p /dev/sda | grep PTTYPE
# 出力例: /dev/sda: PTTYPE="gpt"
# parted での確認
parted /dev/sda print
# 出力例:
# Model: ATA VBOX HARDDISK (scsi)
# Disk /dev/sda: 107GB
# Sector size (logical/physical): 512B/512B
# Partition Table: gpt
# Disk Flags:
3. パーティショニングツール
3.1 fdisk (MBR/GPT)
# fdisk はMBR用の伝統的なツール (最近のバージョンはGPTにも対応)
# パーティション一覧の表示
fdisk -l /dev/sda
# 出力例:
# Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
# Disk model: VBOX HARDDISK
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
#
# Device Boot Start End Sectors Size Id Type
# /dev/sda1 * 2048 2099199 2097152 1G 83 Linux
# /dev/sda2 2099200 209715199 207616000 99G 8e Linux LVM
# 対話的なパーティション操作
fdisk /dev/sdb
# 主なコマンド:
# n - 新規パーティション作成
# d - パーティション削除
# p - パーティションテーブル表示
# t - パーティションタイプ変更
# w - 変更を書き込み
# q - 変更を破棄して終了
# m - ヘルプ
# 実際の操作例 (LVM用パーティション作成)
# Command (m for help): n # 新規パーティション
# Partition type: p # プライマリ
# Partition number: 1 # パーティション番号
# First sector: (default) # デフォルト
# Last sector: (default) # ディスク全体を使用
#
# Command (m for help): t # タイプ変更
# Hex code: 8e # Linux LVM
#
# Command (m for help): w # 書き込み
3.2 gdisk (GPT)
# gdisk は GPT 専用のパーティショニングツール
# インストール
apt install gdisk # Ubuntu/Debian
dnf install gdisk # RHEL/CentOS
# パーティション一覧の表示
gdisk -l /dev/sda
# 出力例:
# GPT fdisk (gdisk) version 1.0.9
# Partition table scan:
# MBR: protective
# BSD: not present
# APM: not present
# GPT: present
#
# Found valid GPT with protective MBR; using GPT.
# Number Start (sector) End (sector) Size Code Name
# 1 2048 2099199 1024.0 MiB EF00 EFI System Partition
# 2 2099200 6293503 2.0 GiB 8200 Linux swap
# 3 6293504 209715166 97.0 GiB 8E00 Linux LVM
# 対話的操作
gdisk /dev/sdb
# 主なコマンド:
# n - 新規パーティション作成
# d - パーティション削除
# p - パーティションテーブル表示
# t - パーティションタイプ変更 (GPT type code)
# i - パーティション情報表示
# w - 変更を書き込み
# q - 変更を破棄して終了
# ? - ヘルプ
# GPT パーティションタイプコード:
# EF00 - EFI System Partition
# EF02 - BIOS boot partition
# 8200 - Linux swap
# 8300 - Linux filesystem
# 8E00 - Linux LVM
# FD00 - Linux RAID
3.3 parted
# parted は MBR/GPT の両方に対応する高機能ツール
# パーティション情報の表示
parted /dev/sda print
# 出力例:
# Model: ATA VBOX HARDDISK (scsi)
# Disk /dev/sda: 107GB
# Sector size (logical/physical): 512B/512B
# Partition Table: gpt
# Disk Flags:
#
# Number Start End Size File system Name Flags
# 1 1049kB 1075MB 1074MB fat32 EFI boot, esp
# 2 1075MB 3222MB 2147MB linux-swap(v1) swap
# 3 3222MB 107GB 104GB LVM lvm
# 全ディスクの情報
parted -l
# GPT パーティションテーブルの作成
parted /dev/sdb mklabel gpt
# パーティションの作成
parted /dev/sdb mkpart primary 0% 100%
# LVM フラグの設定
parted /dev/sdb set 1 lvm on
# パーティションのリサイズ
parted /dev/sdb resizepart 1 50GB
# スクリプトモード (非対話的)
parted -s /dev/sdb -- \
mklabel gpt \
mkpart primary ext4 1MiB 512MiB \
set 1 boot on \
mkpart primary linux-swap 512MiB 2560MiB \
mkpart primary ext4 2560MiB -1MiB \
set 3 lvm on
3.4 partprobe
# パーティションテーブルの変更をカーネルに通知
partprobe /dev/sda
# 特定のディスクのみ更新
partprobe /dev/sdb
# 詳細出力
partprobe -s /dev/sda
# 出力例:
# /dev/sda: gpt partitions 1 2 3
# カーネルのパーティション情報確認
cat /proc/partitions
# 出力例:
# major minor #blocks name
# 8 0 104857600 sda
# 8 1 1048576 sda1
# 8 2 2097152 sda2
# 8 3 101711872 sda3
4. パーティションタイプ
4.1 一般的なパーティションタイプ
| MBR ID | GPT コード | 名称 | 用途 |
|---|---|---|---|
| 0x83 | 8300 | Linux filesystem | 通常のLinuxパーティション |
| 0x82 | 8200 | Linux swap | スワップ領域 |
| 0x8E | 8E00 | Linux LVM | LVM用パーティション |
| 0xFD | FD00 | Linux RAID | RAID用パーティション |
| 0xEF | EF00 | EFI System | UEFI ブートパーティション |
| - | EF02 | BIOS boot | BIOS ブートパーティション (GPT) |
| 0x07 | 0700 | NTFS/HPFS | Windows パーティション |
5. LVM アーキテクチャ
5.1 LVM の構成要素
┌──────────────────────────────────────────────────────┐
│ 論理ボリューム (LV) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ lv_root │ │ lv_home │ │ lv_data │ │
│ │ 20 GB │ │ 50 GB │ │ 100 GB │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ └──────────┬──┘─────────┘──┘ │
├──────────────────▼───────────────────────────────────┤
│ ボリュームグループ (VG) │
│ vg_system │
│ 合計: 200 GB │
│ 使用: 170 GB │
│ 空き: 30 GB │
├──────────────────┬───────────────────────────────────┤
│ │ │
│ ┌───────────────▼───┐ ┌────────────────┐ │
│ │ 物理ボリューム │ │ 物理ボリューム │ │
│ │ /dev/sda2 │ │ /dev/sdb1 │ │
│ │ 100 GB │ │ 100 GB │ │
│ └───────────────────┘ └────────────────┘ │
└──────────────────────────────────────────────────────┘
5.2 Physical Extent (PE)
PE (Physical Extent) = LVM における最小の割り当て単位
ボリュームグループ (デフォルト PE サイズ: 4 MiB)
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│PE 1│PE 2│PE 3│PE 4│PE 5│PE 6│PE 7│PE 8│PE 9│PE10│ ...
└─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴────┴─┬──┴─┬──┴─┬──┴─┬──┘
│ │ │ │ │ │ │ │ │
└─lv_root────┘ └──lv_home──┘ └─lv_data─┘
- デフォルト PE サイズ: 4 MiB
- PE サイズを大きくすると管理するメタデータが減少
- PE サイズを小さくするときめ細かな割り当てが可能
5.3 LVM の主なコマンド体系
| レイヤー | 作成 | 表示 | 詳細表示 | 拡張 | 削除 |
|---|---|---|---|---|---|
| PV | pvcreate | pvs | pvdisplay | - | pvremove |
| VG | vgcreate | vgs | vgdisplay | vgextend | vgremove |
| LV | lvcreate | lvs | lvdisplay | lvextend | lvremove |
6. 物理ボリューム (PV) の管理
6.1 PV の作成
# パーティション上に PV を作成
pvcreate /dev/sdb1
# 出力: Physical volume "/dev/sdb1" successfully created.
# ディスク全体を PV として使用
pvcreate /dev/sdc
# 出力: Physical volume "/dev/sdc" successfully created.
# 複数の PV を一度に作成
pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
# メタデータコピーの数を指定
pvcreate --metadatacopies 2 /dev/sdb1
# PEサイズを指定してVG作成時に使用
# (PEサイズはVG作成時に指定する)
6.2 PV の確認
# pvs - 簡易表示
pvs
# 出力例:
# PV VG Fmt Attr PSize PFree
# /dev/sda2 vg_system lvm2 a-- <99.00g 29.00g
# /dev/sdb1 vg_system lvm2 a-- 100.00g 50.00g
# /dev/sdc vg_data lvm2 a-- 200.00g 200.00g
# pvdisplay - 詳細表示
pvdisplay /dev/sda2
# 出力例:
# --- Physical volume ---
# PV Name /dev/sda2
# VG Name vg_system
# PV Size <99.00 GiB / not usable 3.00 MiB
# Allocatable yes
# PE Size 4.00 MiB
# Total PE 25343
# Free PE 7424
# Allocated PE 17919
# PV UUID abcdef-1234-5678-90ab-cdef12345678
# pvdisplay でマッピング情報を表示
pvdisplay -m /dev/sda2
# 出力例:
# --- Physical Segments ---
# Physical extent 0 to 5119:
# Logical volume /dev/vg_system/lv_root
# Logical extents 0 to 5119
# Physical extent 5120 to 12799:
# Logical volume /dev/vg_system/lv_home
# Logical extents 0 to 7679
# Physical extent 12800 to 17918:
# FREE
# pvscan - PVのスキャン
pvscan
# 出力例:
# PV /dev/sda2 VG vg_system lvm2 [<99.00 GiB / 29.00 GiB free]
# PV /dev/sdb1 VG vg_system lvm2 [100.00 GiB / 50.00 GiB free]
# Total: 2 [198.99 GiB] / in use: 2 [198.99 GiB] / in no VG: 0 [0 ]
7. ボリュームグループ (VG) の管理
7.1 VG の作成
# VG の作成
vgcreate vg_system /dev/sda2
# 出力: Volume group "vg_system" successfully created
# 複数の PV で VG を作成
vgcreate vg_data /dev/sdb1 /dev/sdc1
# PE サイズを指定して作成 (デフォルト: 4MiB)
vgcreate -s 8M vg_bigdata /dev/sdd1
# クラスタ対応 VG の作成
# vgcreate --clustered y vg_cluster /dev/sde1
7.2 VG の確認
# vgs - 簡易表示
vgs
# 出力例:
# VG #PV #LV #SN Attr VSize VFree
# vg_system 2 3 0 wz--n- 198.99g 79.00g
# vg_data 2 1 0 wz--n- 399.99g 299.99g
# vgdisplay - 詳細表示
vgdisplay vg_system
# 出力例:
# --- Volume group ---
# VG Name vg_system
# System ID
# Format lvm2
# Metadata Areas 2
# Metadata Sequence No 5
# VG Access read/write
# VG Status resizable
# MAX LV 0
# Cur LV 3
# Open LV 3
# Max PV 0
# Cur PV 2
# Act PV 2
# VG Size 198.99 GiB
# PE Size 4.00 MiB
# Total PE 50942
# Alloc PE / Size 30718 / 119.99 GiB
# Free PE / Size 20224 / 79.00 GiB
# VG UUID 12345678-abcd-ef01-2345-678901234567
7.3 VG の拡張と縮小
# VG に PV を追加 (拡張)
vgextend vg_system /dev/sdd1
# 出力: Volume group "vg_system" successfully extended
# VG から PV を削除 (縮小)
# まず PV 上のデータを移動
pvmove /dev/sdb1
# PV を VG から削除
vgreduce vg_system /dev/sdb1
# VG のリネーム
vgrename vg_system vg_main
8. 論理ボリューム (LV) の管理
8.1 LV の作成
# サイズを指定して LV を作成
lvcreate -L 20G -n lv_root vg_system
# 出力: Logical volume "lv_root" created.
# PE 数で指定
lvcreate -l 5120 -n lv_home vg_system
# VG の残り全体を使用
lvcreate -l 100%FREE -n lv_data vg_system
# VG の割合で指定
lvcreate -l 50%VG -n lv_logs vg_data
# 特定の PV を指定
lvcreate -L 50G -n lv_fast vg_system /dev/ssd1
# ファイルシステムの作成
mkfs.ext4 /dev/vg_system/lv_root
mkfs.xfs /dev/vg_system/lv_home
8.2 LV の確認
# lvs - 簡易表示
lvs
# 出力例:
# LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
# lv_root vg_system -wi-ao---- 20.00g
# lv_home vg_system -wi-ao---- 50.00g
# lv_data vg_system -wi-ao---- 100.00g
# lvdisplay - 詳細表示
lvdisplay /dev/vg_system/lv_root
# 出力例:
# --- Logical volume ---
# LV Path /dev/vg_system/lv_root
# LV Name lv_root
# VG Name vg_system
# LV UUID abcdef12-3456-7890-abcd-ef1234567890
# LV Write Access read/write
# LV Creation host, time server01, 2025-01-15 10:00:00 +0000
# LV Status available
# # open 1
# LV Size 20.00 GiB
# Current LE 5120
# Segments 1
# Allocation inherit
# Read ahead sectors auto
# - currently set to 256
# Block device 253:0
# lvdisplay でマッピング情報
lvdisplay -m /dev/vg_system/lv_root
8.3 LV の拡張
# === LV の拡張 (lvextend) ===
# サイズを指定して拡張
lvextend -L +10G /dev/vg_system/lv_root
# 出力: Size of logical volume vg_system/lv_root changed from 20.00 GiB to 30.00 GiB.
# 合計サイズを指定
lvextend -L 50G /dev/vg_system/lv_root
# VG の空き領域をすべて使用
lvextend -l +100%FREE /dev/vg_system/lv_root
# ファイルシステムも同時にリサイズ (-r オプション)
lvextend -r -L +10G /dev/vg_system/lv_root
# ext4 の場合: resize2fs が自動実行される
# xfs の場合: xfs_growfs が自動実行される
# === lvresize でも同様の操作が可能 ===
lvresize -L +10G /dev/vg_system/lv_root
lvresize -r -L 50G /dev/vg_system/lv_root
8.4 LV の縮小
# === LV の縮小 (lvreduce) ===
# 注意: XFS は縮小不可!ext4 のみ可能
# まずファイルシステムをアンマウント
umount /dev/vg_system/lv_home
# ファイルシステムチェック (必須)
e2fsck -f /dev/vg_system/lv_home
# ファイルシステムの縮小
resize2fs /dev/vg_system/lv_home 30G
# LV の縮小
lvreduce -L 30G /dev/vg_system/lv_home
# 確認プロンプトが表示される
# または -r オプションで一度に
lvreduce -r -L 30G /dev/vg_system/lv_home
# 再マウント
mount /dev/vg_system/lv_home /home
8.5 LV の削除
# LV の削除
# まずアンマウント
umount /dev/vg_system/lv_data
# LV の削除
lvremove /dev/vg_system/lv_data
# 確認プロンプト: Do you really want to remove active logical volume lv_data? [y/n]: y
# 出力: Logical volume "lv_data" successfully removed
# 強制削除 (確認なし)
lvremove -f /dev/vg_system/lv_data
9. LVM Thin Provisioning
9.1 Thin Pool の概念
Thin Provisioning:
物理的に割り当てられたストレージよりも大きな容量を論理的に提供する技術
通常のLV: Thin LV:
┌──────────┐ ┌──────────┐
│ lv_data │ 100GB │ thin_data│ 100GB (論理)
│ 100GB │ (実際に │ │ 実際の使用量のみ
│ 割り当て │ 確保される) │ │ ディスクを消費
└──────────┘ └──────────┘
↓
┌──────────┐
│Thin Pool │ 200GB (物理)
│ 複数の │ 共有プール
│ thin LV │
│ が共有 │
└──────────┘
9.2 Thin Pool の作成と管理
# Thin Pool の作成
lvcreate --type thin-pool -L 100G -n tp_data vg_data
# 出力: Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of data.
# Logical volume "tp_data" created.
# Thin LV の作成 (仮想サイズは物理プールより大きくできる)
lvcreate --type thin -V 50G -n thin_web --thinpool tp_data vg_data
lvcreate --type thin -V 50G -n thin_db --thinpool tp_data vg_data
lvcreate --type thin -V 80G -n thin_backup --thinpool tp_data vg_data
# 合計 180GB の仮想サイズだが、物理プールは 100GB
# Thin Pool の状態確認
lvs -a -o +pool_lv,data_percent,metadata_percent vg_data
# 出力例:
# LV VG Attr LSize Pool Data% Meta%
# thin_backup vg_data Vwi-a-t--- 80.00g tp_data 5.00
# thin_db vg_data Vwi-a-t--- 50.00g tp_data 20.00
# thin_web vg_data Vwi-a-t--- 50.00g tp_data 15.00
# tp_data vg_data twi-a-t--- 100.00g 35.20 10.50
# Thin Pool の拡張
lvextend -L +50G /dev/vg_data/tp_data
# ファイルシステム作成とマウント
mkfs.ext4 /dev/vg_data/thin_web
mount /dev/vg_data/thin_web /var/www
10. LVM スナップショット
10.1 通常のスナップショット
# スナップショットの作成
lvcreate -s -L 5G -n snap_root /dev/vg_system/lv_root
# 出力: Logical volume "snap_root" created.
# スナップショットの確認
lvs
# 出力例:
# LV VG Attr LSize Pool Origin Data% Meta%
# lv_root vg_system owi-aos--- 20.00g
# snap_root vg_system swi-a-s--- 5.00g lv_root 0.01
# スナップショットの使用率確認
lvdisplay /dev/vg_system/snap_root
# 出力例:
# --- Logical volume ---
# LV Path /dev/vg_system/snap_root
# LV Name snap_root
# VG Name vg_system
# LV snapshot status active destination for lv_root
# LV Size 20.00 GiB
# Current LE 5120
# COW-table size 5.00 GiB
# COW-table LE 1280
# Allocated to snapshot 0.01%
# Snapshot chunk size 4.00 KiB
# スナップショットのマウント (読み取り専用)
mkdir -p /mnt/snapshot
mount -o ro /dev/vg_system/snap_root /mnt/snapshot
# スナップショットからの復元 (元のLVをスナップショットにマージ)
umount /dev/vg_system/lv_root
lvconvert --merge /dev/vg_system/snap_root
# 注: root パーティションの場合はリブートが必要
# スナップショットの削除
lvremove /dev/vg_system/snap_root
10.2 Thin スナップショット
# Thin スナップショットは Thin LV に対して作成
# 通常のスナップショットと異なり、事前にサイズを指定する必要がない
# Thin スナップショットの作成
lvcreate -s -n thin_web_snap /dev/vg_data/thin_web
# 出力: Logical volume "thin_web_snap" created.
# 複数世代のスナップショット
lvcreate -s -n thin_web_snap_20250115 /dev/vg_data/thin_web
lvcreate -s -n thin_web_snap_20250116 /dev/vg_data/thin_web
# スナップショットの確認
lvs -a -o +origin vg_data
# 出力例:
# LV VG Attr LSize Pool Origin Data%
# thin_web vg_data Vwi-a-t--- 50.00g tp_data 15.00
# thin_web_snap_20250115 vg_data Vwi---t--- 50.00g tp_data thin_web
# thin_web_snap_20250116 vg_data Vwi---t--- 50.00g tp_data thin_web
11. LVM ミラーリング
11.1 ミラーの作成
# RAID1 ミラーの作成
lvcreate --type raid1 -m 1 -L 20G -n lv_mirror vg_system
# -m 1: ミラーコピー数 (1 = 2つのコピー)
# 出力: Logical volume "lv_mirror" created.
# 3方向ミラー
lvcreate --type raid1 -m 2 -L 20G -n lv_mirror3 vg_system
# ミラーの状態確認
lvs -a -o +devices,sync_percent vg_system
# 出力例:
# LV VG Attr LSize Devices Cpy%Sync
# lv_mirror vg_system rwi-a-r--- 20.00g lv_mirror_rimage_0(0),lv_mirror_rimage_1(0) 100.00
# [lv_mirror_rimage_0] vg_system iwi-aor--- 20.00g /dev/sda2(10000)
# [lv_mirror_rimage_1] vg_system iwi-aor--- 20.00g /dev/sdb1(0)
# 既存のLVをミラーに変換
lvconvert --type raid1 -m 1 /dev/vg_system/lv_data
# ミラーの解除 (リニアに変換)
lvconvert -m 0 /dev/vg_system/lv_mirror
12. LVM ストライピング
12.1 ストライプ LV の作成
# ストライプ LV の作成
# 2つの PV にストライピング
lvcreate --type striped -i 2 -L 40G -n lv_stripe vg_data
# -i 2: ストライプ数 (2つのPVにまたがる)
# ストライプサイズの指定
lvcreate --type striped -i 2 -I 64K -L 40G -n lv_stripe vg_data
# -I 64K: ストライプサイズ (チャンクサイズ)
# RAID0 (ストライプ + パリティなし)
lvcreate --type raid0 -i 2 -L 40G -n lv_raid0 vg_data
# 確認
lvs -a -o +stripes,stripesize vg_data
# 出力例:
# LV VG Attr LSize #Str Stripe
# lv_stripe vg_data -wi-a----- 40.00g 2 64.00k
13. LVM キャッシュ
13.1 dm-cache (LVM Cache)
# SSD を使用して HDD の LV をキャッシュで高速化
# キャッシュ用 PV の準備 (SSD)
pvcreate /dev/nvme0n1p1
vgextend vg_system /dev/nvme0n1p1
# キャッシュプールの作成
lvcreate --type cache-pool -L 20G -n cache_pool vg_system /dev/nvme0n1p1
# 既存の LV にキャッシュを追加
lvconvert --type cache --cachepool vg_system/cache_pool \
/dev/vg_system/lv_data
# 出力: Logical volume vg_system/lv_data is now cached.
# キャッシュの状態確認
lvs -a -o +cache_policy,cache_settings,cache_mode vg_system
# 出力例:
# LV VG Attr LSize CachePolicy CacheMode
# lv_data vg_system Cwi-a-C--- 100.00g smq writeback
# キャッシュ統計の確認
lvs -o +cache_total_blocks,cache_used_blocks,cache_dirty_blocks,\
cache_read_hits,cache_read_misses,cache_write_hits,cache_write_misses \
vg_system/lv_data
# キャッシュの削除
lvconvert --uncache /dev/vg_system/lv_data
14. ファイルシステムのリサイズ
14.1 ext4 のリサイズ
# === ext4 の拡張 (オンライン可能) ===
# LV を拡張
lvextend -L +10G /dev/vg_system/lv_root
# ファイルシステムを拡張 (オンラインで実行可能)
resize2fs /dev/vg_system/lv_root
# 出力例:
# resize2fs 1.46.5 (30-Dec-2021)
# Filesystem at /dev/vg_system/lv_root is mounted on /; on-line resizing required
# old_desc_blocks = 3, new_desc_blocks = 4
# The filesystem on /dev/vg_system/lv_root is now 7864320 (4k) blocks long.
# サイズを指定して拡張
resize2fs /dev/vg_system/lv_root 30G
# === ext4 の縮小 (オフライン必須) ===
# アンマウント
umount /dev/vg_system/lv_home
# ファイルシステムチェック (必須)
e2fsck -f /dev/vg_system/lv_home
# 出力例:
# e2fsck 1.46.5 (30-Dec-2021)
# Pass 1: Checking inodes, blocks, and sizes
# Pass 2: Checking directory structure
# Pass 3: Checking directory connectivity
# Pass 4: Checking reference counts
# Pass 5: Checking group summary information
# /dev/vg_system/lv_home: 12/3276800 files (0.0% non-contiguous), 262156/13107200 blocks
# ファイルシステムの縮小
resize2fs /dev/vg_system/lv_home 30G
# LV の縮小
lvreduce -L 30G /dev/vg_system/lv_home
# 再マウント
mount /dev/vg_system/lv_home /home
14.2 XFS のリサイズ
# === XFS の拡張 (オンライン可能) ===
# 注意: XFS は縮小不可!
# LV を拡張
lvextend -L +10G /dev/vg_system/lv_data
# XFS ファイルシステムの拡張 (マウントポイントを指定)
xfs_growfs /data
# 出力例:
# meta-data=/dev/vg_system/lv_data isize=512 agcount=4, agsize=6553600 blks
# = sectsz=512 attr=2, projid32bit=1
# = crc=1 finobt=1, sparse=1, rmapbt=0
# = reflink=1 bigtime=0 inobtcount=0
# data = bsize=4096 blocks=26214400, imaxpct=25
# = sunit=0 swidth=0 blks
# naming =version 2 bsize=4096 ascii-ci=0, ftype=1
# log =internal log bsize=4096 blocks=12800, version=2
# = sectsz=512 sunit=0 blks, lazy-count=1
# realtime =none extsz=4096 blocks=0, rtextents=0
# data blocks changed from 26214400 to 28835840
# または lvextend -r で一括
lvextend -r -L +10G /dev/vg_system/lv_data
15. 実践シナリオ
15.1 root パーティションの拡張
# シナリオ: / パーティションの容量が不足
# 1. 現在の状態確認
df -h /
# 出力: /dev/mapper/vg_system-lv_root 20G 18G 1.1G 95% /
lvs /dev/vg_system/lv_root
vgs vg_system
# 2a. VG に空き容量がある場合
lvextend -r -L +10G /dev/vg_system/lv_root
# 2b. VG に空き容量がない場合 - 新しいディスクを追加
# 新しいディスクをパーティショニング
parted -s /dev/sdc -- mklabel gpt mkpart primary 1MiB -1MiB set 1 lvm on
# PV の作成
pvcreate /dev/sdc1
# VG の拡張
vgextend vg_system /dev/sdc1
# LV の拡張 (ファイルシステム含む)
lvextend -r -L +50G /dev/vg_system/lv_root
# 3. 結果確認
df -h /
# 出力: /dev/mapper/vg_system-lv_root 70G 18G 49G 27% /
15.2 ディスクの移行 (小→大)
# シナリオ: 100GB のディスク (sda) を 500GB のディスク (sdb) に移行
# 1. 新しいディスクの準備
parted -s /dev/sdb -- mklabel gpt mkpart primary 1MiB -1MiB set 1 lvm on
pvcreate /dev/sdb1
# 2. VG に追加
vgextend vg_system /dev/sdb1
# 3. データの移行 (pvmove)
pvmove /dev/sda2 /dev/sdb1
# 出力例:
# /dev/sda2: Moved: 0.5%
# /dev/sda2: Moved: 5.2%
# ...
# /dev/sda2: Moved: 100.0%
# 4. 古いPVをVGから削除
vgreduce vg_system /dev/sda2
# 5. 古いPVの削除
pvremove /dev/sda2
# 6. 確認
pvs
vgs
lvs
15.3 LVM バックアップとリストア
# VG メタデータのバックアップ
vgcfgbackup vg_system
# バックアップ先: /etc/lvm/backup/vg_system
# バックアップの確認
cat /etc/lvm/backup/vg_system
# メタデータのリストア
vgcfgrestore vg_system
# 特定のバックアップからリストア
vgcfgrestore -f /etc/lvm/archive/vg_system_00005-123456789.vg vg_system
# アーカイブの一覧
ls -la /etc/lvm/archive/
16. トラブルシューティング
16.1 一般的な問題と解決策
| 問題 | 原因 | 解決策 |
|---|---|---|
| PV が認識されない | パーティションタイプが非LVM | fdisk で 8e (LVM) に変更 |
| VG がアクティブにならない | PV が不足 | vgchange -ay --partial vg_name |
| LV が拡張できない | VG 空き容量不足 | vgextend で PV を追加 |
| ファイルシステム拡張エラー | LV サイズ < FS サイズ指定 | lvextend を先に実行 |
| スナップショットがいっぱい | COW 領域不足 | スナップショットを拡張または削除 |
| pvmove が遅い | I/O 負荷 | ionice で優先度調整 |
16.2 診断コマンド
# LVM の全体的な状態確認
pvs -a
vgs -a
lvs -a
# デバイスマッパーの確認
dmsetup ls
dmsetup info
# LVM のログレベルを上げる
# /etc/lvm/lvm.conf
# log {
# level = 7
# file = "/var/log/lvm2.log"
# }
# 壊れた VG の修復
vgck vg_system
vgrepair vg_system # (存在する場合)
# メタデータの再構築
pvscan --cache
vgscan --cache
# PV の UUID を確認
pvs -o +uuid
16.3 緊急時の LVM 復旧
# シナリオ: PV の一部が失われた場合
# 1. 部分的な VG のアクティブ化
vgchange -ay --partial vg_system
# 2. データの救出
# 利用可能な LV をマウントしてデータをバックアップ
# 3. 失われた PV の削除
vgreduce --removemissing --force vg_system
# 4. 新しい PV の追加
pvcreate /dev/sdd1
vgextend vg_system /dev/sdd1
# 5. ミラーの再構築 (RAID1 の場合)
lvconvert --repair /dev/vg_system/lv_mirror
17. ベストプラクティス
17.1 パーティショニングのベストプラクティス
| 項目 | 推奨事項 |
|---|---|
| パーティションテーブル | 新規システムでは GPT を使用 |
| ブートパーティション | /boot は LVM 外に配置 (500MB-1GB) |
| EFI パーティション | UEFI システムでは 200-500MB の FAT32 |
| swap | 物理メモリの1-2倍 (最大8GB程度) |
| LVM の使用 | OS パーティション (/, /home, /var) に LVM を推奨 |
| PE サイズ | 通常はデフォルト (4MB) で十分 |
17.2 LVM のベストプラクティス
# 1. VG の空き容量を常に確保 (20%程度)
vgs -o +vg_free_count
# 2. スナップショットの定期的なクリーンアップ
lvs -S 'lv_attr=~[s]'
# 3. Thin Pool の監視
lvs -o +data_percent,metadata_percent
# 4. メタデータの定期バックアップ
vgcfgbackup
# 5. /etc/fstab では UUID を使用
blkid /dev/vg_system/lv_root
# /etc/fstab:
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults 0 1
17.3 推奨パーティションレイアウト
推奨サーバーパーティションレイアウト:
/dev/sda (システムディスク)
├── /dev/sda1 - /boot/efi 200 MiB (EFI System Partition)
├── /dev/sda2 - /boot 1 GiB (非LVM)
└── /dev/sda3 - LVM PV 残り全部
VG: vg_system
├── lv_root / 20-50 GiB
├── lv_swap swap RAMの1-2倍
├── lv_home /home 10-50 GiB
├── lv_var /var 20-50 GiB
├── lv_var_log /var/log 10-20 GiB
├── lv_tmp /tmp 5-10 GiB
└── (空き領域) 20%以上
/dev/sdb, /dev/sdc (データディスク)
VG: vg_data
├── lv_data /data 必要に応じて
└── (空き領域) 20%以上
18. 参考文献
- Red Hat LVM Administrator's Guide - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_and_managing_logical_volumes
- LVM2 Resource Page - https://sourceware.org/lvm2/
- Linux man pages - fdisk(8), gdisk(8), parted(8), lvm(8)
- The Linux Documentation Project - LVM HOWTO - https://tldp.org/HOWTO/LVM-HOWTO/
- Arch Linux Wiki - LVM - https://wiki.archlinux.org/title/LVM
- Ubuntu Server Guide - LVM - https://ubuntu.com/server/docs/lvm-storage
- RHEL Storage Administration Guide - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/managing_storage_devices
- GPT fdisk (gdisk) Documentation - https://rodsbooks.com/gdisk/
- GNU Parted Manual - https://www.gnu.org/software/parted/manual/
本ドキュメントはディスクパーティショニングと LVM について包括的にまとめたものである。LVM 操作は慎重に行い、データのバックアップを取得してから作業すること。特に縮小操作はデータ損失のリスクがあるため、十分に注意が必要である。