LVMじゃないcentos/7, 8 Vagrant Boxのパーティションを拡張する

LVMじゃない`centos/7`のBoxでパーティション拡張したかったのでメモ。

⚠️(お約束ですが)操作する前に消えたら泣きそうになるファイルのバックアップは取ってください

## TL;DR

1. `fdisk` でパーティションを確認する
2. `fdisk` で拡張したいパーティションそのものを削除して、削除前と同じ`Start`の値・新しいサイズでパーティションを作る
  * 新しいサイズでパーティションを作るまで `fdisk` で書き込まないこと
3. 再起動する
4. `xfs_growfs` で拡張したパーティションをXFSに認識させる


## 環境

[`centos/7` のBox](https://app.vagrantup.com/centos/boxes/7)を用いて作成された仮想マシンを使います。
[vagrant-disksizeのプラグインを導入して](https://qiita.com/yut_h1979/items/c84c490053877beee5c1#vagrant-disksize-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-vm-%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8F%E3%82%92%E5%A2%97%E3%82%84%E3%81%99%E6%96%B9%E6%B3%95) 仮想マシンのストレージを拡張します。

 * [`centos/8` のBox](https://app.vagrantup.com/centos/boxes/8)も正しく拡張できました✌

```bash
$ vagrant box list
centos/7 (virtualbox, 1905.1)
centos/8 (virtualbox, 1905.1)
```

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.disksize.size = '240GB'

...
```

仮想マシンに入ったあと `df -hT` でわかりやすいパーティションサイズ・ファイルシステムを表示します。
うーん増えていません🤔

CentOS 7からファイルシステムが `xfs` になっています。 `resize2fs` は使えません。

```
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      xfs        40G  4.7G   36G   2% /              <-- 240GBになっていないこれを拡張する
devtmpfs       devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs          tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs          tmpfs     3.9G  8.5M  3.9G   1% /run
tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs          tmpfs     783M     0  783M   0% /run/user/1000
```

## 1. `fdisk -l` でパーティションを確認する

パーティションの拡張に `fdisk` を使いますが、 `-l` オプションを付けると詳細な情報を出して終了します。
拡張したいパーティションについて次の情報はメモしてください。

 * Device
 * Start
 * Id
 * System

```bash
$ sudo fdisk -l

Disk /dev/sda: 257.7 GB, 257698037760 bytes, 503316480 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ef88

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    83886079    41942016   83  Linux
```

## 2. `fdisk` で元のパーティションを削除して新しいサイズでパーティションを作る

オプション無しで `fdisk` を実行するとコマンドの入力を待っています。
 `d` と入力して **拡張したいパーティションの番号を入力して** まずは削除します。

 * このとき、`fdisk -l`で出した削除するパーティションの`Start`の値をメモしておきます
 * 大丈夫です、ここで削除は実際に反映されていません
   * 間違えてしまったときは `q` コマンドで反映させずに `fdisk` を終了させましょう
 
```bash
$ sudo fdisk /dev/sda
Command (m for help): d
Selected partition 1
Partition 1 is deleted
```

次に `n` コマンドで新規にパーティションを作成します。`p` を入力してパーティションのタイプをプライマリーにします。

```
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
```

パーティションの番号はそのままで良いでしょう。 **何も入力せずEnterキーを押すとdefaultの値が採用されます。**

```
Partition number (1-4, default 1):
```

(デフォルトで設定されていますが) **削除する前のパーティションに設定されていた`Start`の値と同じものを設定します**
**ここで`Start`の値を間違えたまま進めるとデータが消えます。**

```
First sector (2048-503316479, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-503316479, default 503316479):
Using default value 503316479
Partition 1 of type Linux and of size 240 GiB is set
```

xfs signature を取り除くか質問されたときは `Y` と答えてsignatureを取り除きます。
(`centos/7` のBoxでは表示されませんでした)

```
Partition #1 contains a xfs signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.
```

`p` コマンドを使って確認すると `End` が増えました。 `w` コマンドで反映させてから終了します。

```
Command (m for help): p

Disk /dev/sda: 257.7 GB, 257698037760 bytes, 503316480 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ef88

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   503316479   251657216   83  Linux

Command (m for help): w
The partition table has been altered!
```

## 3. 再起動する

```bash
$ sudo reboot
```

しばらく待ってから `vahrant ssh` で仮想マシンに入り直します。


## 4. `xfs_growfs` で拡張したパーティションをXFSに認識させる

再起動したあとでも実際に使える領域は拡張されていません。パーティションの拡張をXFSに認識させる必要があります。

```
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      xfs        40G  4.7G   36G   2% /              <-- 240GBになっていないこれを拡張する
...
```

`xfs_growfs` を使ってパーティションの拡大分をXFSに認識させます。 "data blocks changed" と表示されれば成功です。

 * "data size unchanged, skipping"と表示された場合は失敗です。 `fdisk` 後に仮想マシンを再起動していないと変更できません。
   * `-d` オプションを使わないと"data size unchanged, skipping"は表示されません

**ここでは拡大したいパーティションの `Mounted on` (`/`) を指定します。** [xfs_growfs(8): expand XFS filesystem - Linux man page](https://linux.die.net/man/8/xfs_growfs)
拡大したいパーティションの `Filesystem` に表示されている `/dev/sda1` を指定しても拡大できる場合があります。


```bash
$ sudo xfs_growfs / -d
meta-data=/dev/sda1              isize=512    agcount=4, agsize=2621376 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=10485504, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=5119, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10485504 to 62914304
```

再度確認してみると使用できる領域は増えています。やったぜ👏

```bash
$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      xfs       240G  4.7G  236G   2% /           <-- これ
devtmpfs       devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs          tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs          tmpfs     3.9G  8.5M  3.9G   1% /run
tmpfs          tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs          tmpfs     783M     0  783M   0% /run/user/1000
```

## 参考

fdiskでDisk容量を拡張する - Qiita
https://qiita.com/2or3/items/501f206a6091a4ce895f#3-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%89%8A%E9%99%A4%E3%81%A8%E4%BD%9C%E6%88%90

CentOS7なインスタンスのルートボリューム拡張 - Qiita
https://qiita.com/mimumemo/items/1820be501b59ee204d21

xfs_growfs(8): expand XFS filesystem - Linux man page
https://linux.die.net/man/8/xfs_growfs