ストレージの悩みを解決！LVMの威力

# 1 論理ボリュームマネージャ（LVM）

## 1.1 LVMの紹介

LVM: Logical Volume Manager（論理ボリュームマネージャ）は、ボリュームを簡単に操作できる抽象層で、ファイルシステムのサイズ変更や複数の物理デバイス間でのファイルシステムの再編成を可能にします。

LVMは柔軟にLVMの容量を変更できます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/ec37731d-d9a5-4dcf-6b87-f0ca56937fb7.png)

- PEを交換してデータを転送し、元のLV内のPEを他のデバイスに移動してLVの容量を減らしたり、他のデバイスのPEをLVに追加して容量を増やしたりできます

実装プロセス：
- デバイスを物理ボリュームとして指定します
- 1つまたは複数の物理ボリュームを使用してボリュームグループを作成します。物理ボリュームは固定サイズの物理エクステント（Physical Extent, PE）で定義されます
- 物理ボリューム上に論理ボリュームを作成します。これは物理エクステント（PE）で構成されています
- 論理ボリューム上にファイルシステムを作成し、マウントできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/fad6799b-78b9-1185-652c-7aa315b68636.png)


最初の論理ボリュームに対応するデバイス名：`/dev/dm-#`

注：dm: device mapper、1つまたは複数の下層ブロックデバイスを1つの論理デバイスとして組織化するモジュールです。

ソフトリンク：
- `/dev/mapper/VG_NAME-LV_NAME`
- `/dev/VG_NAME/LV_NAME`

例：
```shell
[root@rocky86 ~]# ll /dev/mapper/rl* 
lrwxrwxrwx 1 root root 7 Aug  1 09:38 /dev/mapper/rl-home -> ../dm-2
lrwxrwxrwx 1 root root 7 Aug  1 09:38 /dev/mapper/rl-root -> ../dm-0
lrwxrwxrwx 1 root root 7 Aug  1 09:38 /dev/mapper/rl-swap -> ../dm-1
```
以下は、新しく追加された内容の日本語訳です。Markdown形式で提供します。

## 1.2 論理ボリュームの実装

関連ツールは lvm2 パッケージから提供されます。

```
[root@centos8 ~]# yum -y install lvm2
```

### 1.2.1 PV（Physical Volume）管理ツール

ブロックデバイスを物理ボリュームとして作成します。本質的には、ブロックデバイスにラベルを付けることです。ブロックデバイスの数と物理ボリュームの数は対応しており、ブロックデバイスの数だけ物理ボリュームを作成できます。ブロックデバイスの容量に制限はなく、パーティションをまたぐことができます。

PV情報の表示：
```
pvs         # 簡易PV情報表示
pvdisplay   # 詳細情報表示
```

PVの作成：
```
pvcreate /dev/DEVICE
```

PVの削除：
```
pvremove /dev/DEVICE
```

例：
```shell
# PVの作成
[root@rocky86 ~]# pvcreate /dev/sdb2 /dev/sdc
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdc" successfully created.

# 確認
[root@rocky86 ~]# pvs
PV         VG Fmt  Attr PSize    PFree 
/dev/sda2  rl lvm2 a--  <199.00g     0 
/dev/sdb2     lvm2 ---    5.00g  5.00g
/dev/sdc      lvm2 ---   10.00g 10.00g

# 特定のPVを確認
[root@rocky86 ~]# pvdisplay /dev/sdc
"/dev/sdc" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name               /dev/sdc
VG Name               
PV Size               10.00 GiB
Allocatable           NO
PE Size               0   
Total PE              0
Free PE               0
Allocated PE          0
PV UUID               4rZKNs-ca0S-Jp4G-zFzY-P8Up-KUG7-yFcZcg

# 削除
[root@rocky86 ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
```

### 1.2.2 VG（Volume Group）管理ツール

ボリュームグループの表示：
```
vgs
vgdisplay
```

ボリュームグループの作成：
```
vgcreate [-s Size] vgname pv1 [pv2...]
# -s でPEサイズを指定。数字+単位（k|K|m|M|g|G|t|T|p|P|e|E）
```

ボリュームグループの管理：
```
vgextend vgname pv1 [pv2...]  # ボリュームグループにPVを追加
vgreduce vgname pv1 [pv2...]  # ボリュームグループからPVを削除
```

ボリュームグループの削除：
```
vgremove vgname  # 削除前に対応するPVのバインドを解除する必要がある（pvmove）
```

例：
```shell
# VGの作成
[root@rocky86 ~]# vgcreate -s 16M testvg /dev/sdb2 /dev/sdc
Volume group "testvg" successfully created

# VGの確認
[root@rocky86 ~]# vgs
VG     #PV #LV #SN Attr   VSize    VFree  
rl       1   3   0 wz--n- <199.00g      0 
testvg   2   0   0 wz--n-  <14.97g <14.97g

[root@rocky86 ~]# vgdisplay testvg
--- Volume group ---
VG Name               testvg
System ID             
Format                lvm2
Metadata Areas        2
Metadata Sequence No  1
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                0
Open LV               0
Max PV                0
Cur PV                2
Act PV                2
VG Size               <14.97 GiB
PE Size               16.00 MiB
Total PE              958
Alloc PE / Size       0 / 0   
Free  PE / Size       958 / <14.97 GiB
VG UUID               Croa8U-P3lT-PpBY-kUaU-FvES-dWoT-eEGLOA

# VGの拡張例
[root@rocky86 ~]# pvs
PV         VG     Fmt  Attr PSize    PFree  
/dev/sda2  rl     lvm2 a--  <199.00g      0 
/dev/sdb2  testvg lvm2 a--    4.98g 272.00m
/dev/sdb3         lvm2 ---    2.00g   2.00g
/dev/sdc   testvg lvm2 a--    9.98g   4.98g

[root@rocky86 ~]# vgextend testvg /dev/sdb3 
Volume group "testvg" successfully extended

[root@rocky86 ~]# pvs
PV         VG     Fmt  Attr PSize    PFree  
/dev/sda2  rl     lvm2 a--  <199.00g      0 
/dev/sdb2  testvg lvm2 a--    4.98g 272.00m
/dev/sdb3  testvg lvm2 a--    1.98g   1.98g
/dev/sdc   testvg lvm2 a--    9.98g   4.98g
```

### 1.2.3 LV（Logical Volume）管理ツール

論理ボリュームの表示：
```
lvs
lvdisplay
```

論理ボリュームの作成：
```
lvcreate {-L N[mMgGtT]|-l N} -n NAME VolumeGroup
-L|--size N[mMgGtT]                     # サイズ指定
-l|--extents N                          # PE数指定、パーセンテージも可
-n Name                                 # 論理ボリューム名
```

論理ボリュームの拡張：
```
lvextend {-L N[mMgGtT]|-l N} LV_NAME
-L|--size [+]Size[mMgGtT]           # N単位のサイズ、+10Mのように指定可
-l|--extents [+]Number[PERCENT]     # PE数、+10で10PE追加、+100%freeで残り全て使用
-r|--resizefs                       # ファイルシステムサイズを自動調整
```

論理ボリュームの縮小：
```
lvreduce {-L N[mMgGtT]|-l N} LV_NAME
-L|--size [-]Size[mMgGtT]           # N単位のサイズ、-10Mのように指定可
-l|--extents [-]Number[PERCENT]     # PE数、-10で10PE減少
```

論理ボリュームの削除：
```
lvremove /dev/VG_NAME/LV_NAME
```

ファイルシステムサイズの再設定：
```
fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] lvname  # ext系ファイルシステムのみ
xfs_growfs /mountpoint                     # xfsファイルシステムのみ
```

例：LVの作成
```shell
# testvgから100PEサイズのlv1を作成
[root@rocky86 ~]# lvcreate -l 100 -n lv1 testvg
Logical volume "lv1" created.

# 5GBサイズのlv2を作成
[root@rocky86 ~]# lvcreate -L 5G -n lv2 testvg 
Logical volume "lv2" created.

# 残りの使用可能PE数の20%サイズのlv3を作成
[root@rocky86 ~]# lvcreate -l 20%free -n lv3 testvg
Logical volume "lv3" created.

# 指定VGの10%サイズのlv4を作成
[root@rocky86 ~]# lvcreate -l 10%VG -n lv4 testvg
Logical volume "lv4" created.

# 確認
[root@rocky86 ~]# lvs /dev/testvg/*
LV   VG     Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
lv1  testvg -wi-a----- 1.56g                                                   
lv2  testvg -wi-a----- 5.00g                                                   
lv3  testvg -wi-a----- 1.67g                                                   
lv4  testvg -wi-a----- 1.48g               

# 詳細確認
[root@rocky86 ~]# lvdisplay /dev/testvg/lv1
--- Logical volume ---
LV Path                /dev/testvg/lv1
LV Name                lv1
VG Name                testvg
LV UUID                57QkET-OpG0-kZlD-iRC9-YWmL-iaum-BtftfM
LV Write Access        read/write
LV Creation host, time rocky86, 2022-08-01 14:27:52 +0800
LV Status              available
# open                 0
LV Size                1.56 GiB
Current LE             100
Segments               1
Allocation             inherit
Read ahead sectors     auto - currently set to 8192
Block device           253:3
```

例：論理ボリュームの拡張
```shell
[root@rocky86 ~]# vgdisplay testvg
--- Volume group ---
VG Name               testvg
System ID             
Format                lvm2
Metadata Areas        2
Metadata Sequence No  7
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                4
Open LV               0
Max PV                0
Cur PV                2
Act PV                2
VG Size               <14.97 GiB
PE Size               16.00 MiB
Total PE              958
Alloc PE / Size       622 / <9.72 GiB
Free  PE / Size       336 / 5.25 GiB
VG UUID               Croa8U-P3lT-PpBY-kUaU-FvES-dWoT-eEGLOA
```

注意：論理ボリュームの使用は、ハードディスクのパーティションの使用と同じです。まずファイルシステムを作成し、その後マウントする必要があります。

### 1.2.4 論理ボリュームの拡張と縮小

#### 1.2.4.1 オンラインでの論理ボリューム拡張

論理ボリュームを拡張する前に、ボリュームグループに空き容量があることを確認してください。
2つのステップで実行します：まず論理ボリュームを拡張し、次にファイルシステムを拡張します。

```bash
# ステップ1：論理ボリュームの容量拡張
lvextend -L [+]N[mMgGtT] /dev/VG_NAME/LV_NAME

# ステップ2：ファイルシステムの拡張
# ext用
resize2fs /dev/VG_NAME/LV_NAME
# xfs用
xfs_growfs MOUNTPOINT

# 容量とファイルシステムの拡張を1ステップで実行
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
```

#### 1.2.4.2 論理ボリュームの縮小

注意：縮小にはデータ損失のリスクがあります。バックアップを取ってから縮小することをお勧めします。オンラインでの縮小はサポートされておらず、まずアンマウントする必要があります。xfsファイルシステムは縮小をサポートしていません。

縮小の手順：

```bash
# アンマウント
umount /dev/VG_NAME/LV_NAME

# ファイルシステムのチェック（e2fsckはfsckと書くこともできます）
e2fsck -f /dev/VG_NAME/LV_NAME

# ファイルシステムを指定サイズに縮小
resize2fs /dev/VG_NAME/LV_NAME N[mMgGtT]

# 論理ボリュームの縮小
lvreduce -L [-] N[mMgGtT] /dev/VG_NAME/LV_NAME

# 再マウント
mount /dev/VG_NAME/LV_NAME mountpoint
```

例：XFSファイルシステムの論理ボリュームの縮小

XFSファイルシステムは縮小をサポートしていないため、以下の方法で縮小できます：

```bash
# XFSファイルシステムデータのバックアップ
yum -y install xfsdump
# /dataマウントポイントに対応する論理ボリュームをバックアップ
# 注意：マウントポイントの後に/を付けないでください
xfsdump -f data.img /data

# ファイルシステムのアンマウント
umount /data

# 論理ボリュームの縮小
lvreduce -L 10G /dev/vg0/lv0

# ファイルシステムの再作成
mkfs.xfs -f /dev/vg0/lv0

# 再マウント
mount /dev/vg0/lv0 /data

# データの復元
xfsrestore -f data.img /data
```

### 1.2.5 ホスト間でのボリュームグループ移行

ソースコンピュータ上：

1. 古いシステムで、ボリュームグループ上のすべての論理ボリュームをアンマウント
2. ボリュームグループを無効化：`vgchange -a n vg0`
3. ボリュームグループをエクスポート：`vgexport vg0`
4. 古いハードディスクを取り外し、ターゲットコンピュータに接続

ターゲットコンピュータ上：

5. ボリュームグループをインポート：`vgimport vg0`
6. 有効化：`vgchange -ay vg0`
7. ボリュームグループ上のすべての論理ボリュームをマウント

### 1.2.6 指定のPVストレージデバイスの取り外し

```bash
# PVの表示
pvdisplay

# PV上のデータを移動
pvmove /dev/sdc

# vg0から指定のPVを削除
vgreduce vg0 /dev/sdc

# PVの削除
pvremove /dev/sdc
```