CentOS7の/bootパーテーションの容量拡張方法（resize2fs）

##はじめに
```yum upgrade```の際に、/bootパーテーションの容量が足りず、アップグレードが失敗た。回避策として、古いカーネルを削除して容量を空ける方法もあるが、対処療法の為根本解決にはならない。

調べても/bootパーテーションを拡張する方法があまりちゃんと載ってなかったので、まとめてみた。
なお、今回ファイルシステムは```ext3```を前提とする。参考にしたサイトは```xfs```前提。
```ext3```の場合は、```resize2fs```を使う

##概要
ファイルシステムは、一つのディスク（/dev/sda）に全て収まっている状態とする。

```
/boot（/dev/sda1） 
swap（/dev/sda2）
LVM（/dev/sda3）
```

の構成を前提としている。ここで、別で作成した論理パーテーション（```/dev/sdb```とする）をLVMに追加し、既に既存であるLVMのパーテション（```/dev/sda3```）のデータをたらしく追加したLVMのパーテーション（```/dev/sdb1```）に移す。

ここで、```/dev/sda3```を既存のLVMから外すと、既存ディスクには大きく空きサイズが確保される事になる。あとは、パーテーションを作成し直して、```resize2fs```でパーテーションサイズを拡張する事で、無事```/boot```パーテーションが拡張される。

##環境
- CentOS
- ext3 （ファイルシステム） 

##参考
- [Extend the Size of /boot Partition on XFS Filesystem (CentOS/RHEL 7)](https://www.thegeekdiary.com/extend-the-size-of-boot-partition-on-xfs-filesystem-centos-rhel-7/)

##状況
/bootパーテーションが不足してエラーになる場合、以下のようなメッセージが表示される。

```
$ sudo yum upgrade

Transaction Check Error:
  installing package grub-1:0.97-99.el6.x86_64 needs 4KB on the /boot filesystem
  installing package kernel-2.6.32-696.el6.x86_64 needs 29MB on the /boot filesystem

Error Summary

Disk Requirements:
  At least XXMB more space needed on the /boot filesystem.
```

##手順
- 拡張ディスクを追加する
- 拡張ディスクにLVMパーテションを作成する
- 物理ボリュームを追加した拡張ディスクに作成する
- ボリュームグループ名を確認し、作成した物理ボリュームを加える
- 既存の物理ボリュームら新規に作成した物理ボリュームにデータを移動する
- 既存の物理ボリュームをボリュームグループから削除する
- 既存の物理ボリュームのパーテションを再作成しつつ拡張する
- 再起動し拡張したパーテーションを認識させる
- 再作成した/bootパーテションをresize2fsで拡張する

拡張ディスクの追加は環境によりまちまちなので、割愛。今回自分はVagrant（VirtualPC）環境でディスクを追加した。（[Vagrantでディスクの新規追加]()）

追加したディスクは```/dev/sdb```として進める。

```
$ sudo fdisk -l 　 # ディスクの追加状況の確認

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b1774

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4507647     2048000   82  Linux swap / Solaris
/dev/sda3         4507648    81919999    38706176   8e  Linux LVM

Disk /dev/mapper/rootvg01-lv01: 39.6 GB, 39631978496 bytes, 77406208 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
```
追加ディスク（/dev/sdb）上にパーテーションを作成する。この時、パーテーションのサイズは、移行元のパーテーション（今回は/dev/sda3）より大きくないといけない。

```
sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

コマンド (m でヘルプ): n 　　　　　　　　　　　　　　　　#パーテーション領域の作成

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p　　　　　　　　　　　　　　　　　#プライマリパーティション

パーティション番号 (1-4, default 1):　　　　　　　　　　#パーテーション番号

最初 sector (2048-104857599, 初期値 2048):
初期値 2048 を使います

Last sector, +sectors or +size{K,M,G} (2048-104857599, 初期値 104857599):
初期値 104857599 を使います
Partition 1 of type Linux and of size 50 GiB is set

コマンド (m でヘルプ): t
Selected partition 1
Hex code (type L to list all codes): 8e　　　　　　#パーテーションの種類はLVM
Changed type of partition 'Linux' to 'Linux LVM'  

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```
物理ボリュームを作成

```
$ sudo pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
```
ボリュームグループ名を確認し、作成した物理ボリュームをボリュームグループに加える

```
$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
rootvg01 1 2 0 wz--n- 29.96g 44.00m

$ sudo vgextend rootvg01 /dev/sdb1
Volume group "rootvg01" successfully extended
```
 既存の物理ボリューム（```/dev/sda3```）から新規に作成した物理ボリューム（```/dev/sdb1```）にデータを移動し、既存の物理ボリュームはボリュームグループから外す。

```
$ sudo pvmove /dev/sda3 /dev/sdb1
/dev/sda2: Moved: 0.1%
/dev/sda2: Moved: 8.1%
/dev/sda2: Moved: 32.6%
/dev/sda2: Moved: 78.2%
/dev/sda2: Moved: 100.0%

$ sudo vgreduce rootvg01 /dev/sda3
Removed "/dev/sda3" from volume group "rootvg01"
```
既存の物理ボリュームのパーテションを再作成する。
まずは、```/boot```のみにする。

```
$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

コマンド (m でヘルプ): p

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b1774

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4507647     2048000   82  Linux swap / Solaris
/dev/sda3         4507648    81919999    38706176   8e  Linux LVM

コマンド (m でヘルプ): d
パーティション番号 (1-3, default 3):
Partition 3 is deleted

コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2):
Partition 2 is deleted

コマンド (m でヘルプ): p

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b1774

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048      411647      204800   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```

次に```/boot```パーテーションをアンマウントし、```/boot```パーテーションとSWAPを再作成します。この時、```/boot```は拡張したいサイズに変更します。

```
$ sudo fdisk /dev/sda
　・
　・
コマンド (m でヘルプ): p

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b1774

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048      411647      204800   83  Linux

コマンド (m でヘルプ): d                　　　　 # 既存パーテーションは削除
Selected partition 1
Partition 1 is deleted
　
コマンド (m でヘルプ): n　　　　　　　　　　　　　　# 新規に作成する

Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p　　　　　　　　　　　　# プライマリーパーテーション

パーティション番号 (1-4, default 1):
最初 sector (2048-209715199, 初期値 2048):　　# 開始位置は変えない
初期値 2048 を使います

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# ここがポイント
Last sector, +sectors or +size{K,M,G} (2048-209715199, 初期値 209715199): +1000M
Partition 1 of type Linux and of size 1000 MiB is set　　　　　　# 確保したいサイズを指定
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# 今回は1G（1000M）

コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
パーティション番号 (1-4, default 1):
最初 sector (2048-209715199, 初期値 2048):
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-209715199, 初期値 209715199): +1000M
Partition 1 of type Linux and of size 1000 MiB is set

コマンド (m でヘルプ): n　　　　　　　　　　　　　　# SWAPも作成する

Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p):
Using default response p　　　　　　　　　　　　# プライマリパーティション

パーティション番号 (2-4, default 2):
最初 sector (2050048-209715199, 初期値 2050048):
初期値 2050048 を使います
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# swap は 1000M
Last sector, +sectors or +size{K,M,G} (2050048-209715199, 初期値 209715199):+2048000
Partition 2 of type Linux and of size 1000 MiB is set

コマンド (m でヘルプ): t                       # パーテーション種別を変更する

パーティション番号 (1-3, default 3): 2
Hex code (type L to list all codes): 82     # Liux swap に変更する。
Changed type of partition 'Linux' to 'Linux swap / Solaris'

コマンド (m でヘルプ): p

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b1774

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4507647     2048000   8e  Linux LVM

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```
ここで再起動する。拡張したパーテーションを認識させるには、再起動が必要。
再起動が終わったら、```/boot```パーテションをresize2fsで拡張する。

```
$ sudo e2fsck -f /dev/sda1　　　# 先 e2fsck での整合性チェックが必要
e2fsck 1.41.12 (17-May-2010)
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/sda1: 79976/1175040 files (28% non-contiguous), 523701/4692744 blocks

$ resize2fs /dev/sda1
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/sda1 to 9935604 (4k) blocks.
The filesystem on /dev/sda1 is now 9935604 blocks long.
```

以上、```/boot```パーテーションの拡張方法でした。