CentOSのLVMパーティションを拡張する方法

LVMパーティションの各種操作手順。サイズ指定などは適宜読み替えを行うこと。
パーティションを編集するという大変危険な作業なので、構築の初期に行うかバックアップを取るなど気を付けること。

## ディスクサイズの変更
物理ディスクの場合はサイズを変更することはできないので、一旦ディスクイメージを丸ごと取得し、より大きなディスクにイメージを適用する。各種ハイパーバイザーの仮想ディスクの場合は、ハイパーバイザーの機能からディスク拡張を行うとよい。

## LVM物理ボリュームのサイズ変更
ディスクサイズを大きくしただけではLVM物理パーティションのサイズが変わっていないため、拡張作業を進めることができない。
最近のCentOSでは単体でLVMリサイズが実行できないため、[GParted LiveCD](https://sourceforge.net/projects/gparted/)を利用して拡張する。

1. GPartedディスクから起動し、"GParted Live (Default settings)"を選択する。
![choose_mode.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/e8ad7639-46d1-9f29-f695-88b2062cb2e6.jpeg)

2. キーマップはそのまま(Don't touch keymap)にして次に進む。
![select_keymap.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/200627e8-34a8-9e6e-cb71-e343162202ae.jpeg)

3. その後の選択肢も全てデフォルトで進め、GPartedのGUIが起動するまで待機する。
4. ![select_options.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/7a89ad67-1588-490e-44d1-08b56abfc9bf.jpeg)

4. GUI起動と同時にGPartedも起動するが、その際に以下のようなメッセージが表示される。
これはGPTのパーティションサイズ判定と実際のサイズが異なっているからであり、修復のために"Fix"を選択する。
![fix_gpt.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/8a3b3f79-7d75-0eaf-cf66-53d55b9273aa.jpeg)

5. 拡張対象のLVMを選択し、サイズを最大まで拡張して適用する。
![extend_lvm1.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/1318e9b0-4f60-c9a2-63db-25acc194dd83.jpeg)  
![extend_lvm2.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/f013f6b0-9fba-fa44-1d87-b9a1e7f93e07.jpeg)

6. 以上が問題なく終われば、GPartedをシャットダウンして完了


## LVM論理ボリュームのサイズ変更
LVM物理パーティションが拡張できたら、論理パーティションのサイズを変更できるようになる。
**なお、ファイルシステムにXFSを使用している場合は縮小が出来ない**ので注意。  

OSが起動しているとパーティションに変更を加えられないため、OSインストールディスクを起動して操作する。

1. CentOS7系インストールメディアをセットして起動し、メディア起動直後に"Troubleshooting"を選択する。
![choose_troubleshoot.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/feb8fb74-3ad0-20c5-895b-0e2d3c10aca3.jpeg)

2. "Rescue a CentOS system"を選択する。
![select_rescue.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/1371b1fa-559c-6b19-b66d-20e88058e8a4.jpeg)

3. "3) Skip to shell"を選択し、コンソールに入る。
![in_shell.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/81053bd4-89ec-dd87-3234-7ce73add42d5.jpeg)

4. LVM物理ボリュームを可視化する。

```shell:
# vgchange -a y
    2 logical volume(s) in volume group {LVM物理ボリューム名} now active
```

5. LVM論理ボリュームのサイズを変更する。  
基本的にswapボリュームとrootボリュームを変更すると良いが、他にもボリュームがあれば適宜変更すること。

```shell:
# lvresize {オプション及びサイズ指定} /dev/{LVM物理ボリューム名}/{LVM論理ボリューム名}

【例:8GBにサイズ変更】
# lvresize -L 8G /dev/vg00/swap

【例:残りすべて指定】
# lvextend -l +100%FREE /dev/vg00/root

```

### 論理ボリュームの縮小について
元のサイズから大きくする場合には気にしなくてよいが、小さくする場合には先にパーティションを縮小しなければならない。

```shell:例
## パーティションの縮小(ext4)
# fsck.ext4 -f /dev/vg00/root
# resize2fs /dev/vg00/root 2G

## LVM論理ボリュームの縮小
# lvresize -L 2G /dev/vg00/root
...
Do you really want to reduce vg00/root? [y/n]: y
```

## パーティションのサイズ変更
LVM論理ボリュームのサイズを変更後は、最終処理としてパーティションサイズを変更する必要がある。パーティションの種類やフォーマットによってコマンドが異なるので適切なコマンドを実行すること。

### swapパーティションのサイズ変更
メモリを拡張している場合には、[Swapサイズ推奨値](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace)を元に計算して拡張する。

```shell:
# mkswap /dev/{LVM物理ボリューム名}/{swapパーティション}

【例】
# mkswap /dev/vg00/swap
```

### rootパーティションのサイズ変更(EXT4の場合)

```
# fsck.ext4 -f /dev/{LVM物理ボリューム名}/root
# resize2fs /dev/{LVM物理ボリューム名}/root

【例:残りすべて指定】
# fsck.ext4 -f /dev/vg00/root
# resize2fs /dev/vg00/root
```

### rootパーティションのサイズ変更(XFSの場合)
XFSフォーマットの場合はレスキューモードでは完結しない。  
レスキューモードを抜けてOSを起動した後、以下のコマンドを実行する必要がある。

```shell:
# xfs_growfs {オプション} /dev/{LVM物理ボリューム名}/{LVM論理ボリューム名}

【例:残りすべて指定】
# xfs_growfs /dev/vg00/root
```




## 番外編:新たにディスクを追加してLVM物理ボリュームを拡張する
LVMは物理的に分かれたディスクであっても、あたかも1つのディスクであるかのように扱うことができる。（故障率は上がるが）

1. レスキューモードで起動する。  
[LVM論理ボリュームのサイズ変更](#LVM論理ボリュームのサイズ変更)を参考にしてレスキューモードで起動する。


2. LVM物理ボリュームが見えていないので有効にする。

```shell:
# vgchange -a y
    2 logical volume(s) in volume group "vg00" now active
```

3. 新しいディスクをLVMボリュームグループに参加させる。

```shell:
# fdisk -l | grep /dev/sd
Disk /dev/sda: 4279MB ...
Disk /dev/sdb: 107.4GB ...   ← 追加したディスク

# pvcreate /dev/sdb
# vgextend vg00 /dev/sdb
# vgdisplay
  --- Volume group ---
  VG Name               vg00
  Format                lvm2
  VG Size               <103.25 GiB    ←元から100GB増えた
  PE Size               4.00 MiB
```

以後の作業は[パーティションのサイズ変更](#パーティションのサイズ変更)と同じ作業を行うと良い。