Disk Partitioning and LVM

ディスクパーティショニングと LVM 包括的ガイド

目次

  1. はじめに
  2. MBR vs GPT
  3. パーティショニングツール
  4. パーティションタイプ
  5. LVM アーキテクチャ
  6. 物理ボリューム (PV) の管理
  7. ボリュームグループ (VG) の管理
  8. 論理ボリューム (LV) の管理
  9. LVM Thin Provisioning
  10. LVM スナップショット
  11. LVM ミラーリング
  12. LVM ストライピング
  13. LVM キャッシュ
  14. ファイルシステムのリサイズ
  15. 実践シナリオ
  16. トラブルシューティング
  17. ベストプラクティス
  18. 参考文献

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)
導入年19832000年代初期 (UEFI仕様の一部)
最大ディスクサイズ2 TiB9.4 ZiB (理論上)
最大パーティション数4 プライマリ (拡張使用で最大15)128 (デフォルト)
パーティションテーブル位置ディスクの先頭セクタディスクの先頭と末尾 (冗長)
ブートモードBIOS/LegacyUEFI
データ整合性なし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 IDGPT コード名称用途
0x838300Linux filesystem通常のLinuxパーティション
0x828200Linux swapスワップ領域
0x8E8E00Linux LVMLVM用パーティション
0xFDFD00Linux RAIDRAID用パーティション
0xEFEF00EFI SystemUEFI ブートパーティション
-EF02BIOS bootBIOS ブートパーティション (GPT)
0x070700NTFS/HPFSWindows パーティション

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 の主なコマンド体系

レイヤー作成表示詳細表示拡張削除
PVpvcreatepvspvdisplay-pvremove
VGvgcreatevgsvgdisplayvgextendvgremove
LVlvcreatelvslvdisplaylvextendlvremove

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 が認識されないパーティションタイプが非LVMfdisk8e (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. 参考文献

  1. Red Hat LVM Administrator's Guide - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_and_managing_logical_volumes
  2. LVM2 Resource Page - https://sourceware.org/lvm2/
  3. Linux man pages - fdisk(8), gdisk(8), parted(8), lvm(8)
  4. The Linux Documentation Project - LVM HOWTO - https://tldp.org/HOWTO/LVM-HOWTO/
  5. Arch Linux Wiki - LVM - https://wiki.archlinux.org/title/LVM
  6. Ubuntu Server Guide - LVM - https://ubuntu.com/server/docs/lvm-storage
  7. RHEL Storage Administration Guide - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/managing_storage_devices
  8. GPT fdisk (gdisk) Documentation - https://rodsbooks.com/gdisk/
  9. GNU Parted Manual - https://www.gnu.org/software/parted/manual/

本ドキュメントはディスクパーティショニングと LVM について包括的にまとめたものである。LVM 操作は慎重に行い、データのバックアップを取得してから作業すること。特に縮小操作はデータ損失のリスクがあるため、十分に注意が必要である。