VMware ESXi でLinux仮想マシンの電源をONのままHDサイズを拡張する

VMware ESXi で、サーバーを再起動せずにHDDサイズを拡張する手順をまとめます。
同様のことを様々なコマンドで実現可能なので、他の記事を見ているときに混乱しないよう、各方法を記載します。

# 環境・目的
- VMware ESXi 7
- Ubuntu 20.04 Server
    - HDDを10GBとして初期構築
    - HDDを15GBにし、`/`パーティションを最大にしたい。

ほかのOSでもコマンドは変わりません。コマンドが見つからない場合はdnfコマンドなどでインストールしてください。

# 事前準備
コマンドはすべてrootユーザーで作業していきます。
なので、事前にrootになっておきます。

```sh
user@ubuntu:~$ sudo -s
root@ubuntu:~#
```

# 非LVMの場合

作業前の構成は次のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/906ff5c9-b28a-2f95-bed0-0eedd0d667c5.png)


## HDDサイズを拡張する

HDDのサイズを拡張して、次のイメージの構成を目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/c6cd4130-5cd0-0676-8e10-6cf9844daed2.png)

まずは現在の容量を`df`コマンドで確認します。

```sh
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            445M     0  445M   0% /dev
tmpfs            98M  2.4M   96M   3% /run
/dev/sda2       9.8G  4.3G  5.0G  47% /
tmpfs           489M     0  489M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           489M     0  489M   0% /sys/fs/cgroup
/dev/loop0       56M   56M     0 100% /snap/core18/2128
/dev/loop1       33M   33M     0 100% /snap/snapd/12704
/dev/loop2       71M   71M     0 100% /snap/lxd/21029
tmpfs            98M     0   98M   0% /run/user/1000
```

Mounted on が `/` となっているFilesystem `/dev/sda2` を大きくすればよいことがわかりました。

次に、パーティションの配置状況を、`fdisk` コマンドで確認します。

```
root@ubuntu:~# fdisk -l
(略)
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 20969471 20965376  10G Linux filesystem
```

/dev/sda のサイズが 10GB であり、目的のパーティション `/dev/sda2` がディスクの末尾に存在することが確認できました。
目的のパーティションがディスク末尾ではないところに存在する場合は、目的のパーティションの後ろに存在するパーティションが邪魔をして、パーティションを大きくすることができません。

では/dev/sda のサイズを大きくしましょう。ESXiの設定画面で、容量を増やしてOKを押すだけです。
このとき、OSはシャットダウンしていなくても大丈夫です。
ただし、スナップショットがあるとHDDのサイズは大きくできませんので、すべてのスナップショットを統合しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/521970ce-8a13-b6e4-f05e-7934f3f15b54.png)

ESXiでHDDを大きくしても、Linuxは自動で認識はしてくれません。
`/dev/<ディスク名>` のサイズ変更を認識させるには、`/sys/class/block/<ディスク名>/device/rescan` に 1 を書き込むことで、
最新のHDDサイズをLinuxに認識させることができます。

```sh
root@ubuntu:~# echo 1 > /sys/class/block/sda/device/rescan
````

改めて、`fdisk`で、HDDサイズを確認しましょう。

```sh
root@ubuntu:~# fdisk -l
(略)
GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 20969471 20965376  10G Linux filesystem
```

`GPT PMBR size mismatch` の警告が`表示されていればOK`です。

## パーティションを拡張する

次の構成を目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/a7934a34-e054-bdb2-abea-5eb4b7aa070e.png)

### 方法1 growpart

パーティションを拡張するのに、growpartコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。
もしコマンドが見つからない場合は、`cloud-guest-utils` パッケージをインストールすることで導入できます。

```sh
root@ubuntu:~# apt install cloud-guest-utils
```

ではパーティションを大きくしましょう。

まずは現在のパーティションサイズを`fdisk`で確認します。

```sh
root@ubuntu:~# fdisk -l
(略)
GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 20969471 20965376  10G Linux filesystem

```

`/dev/sda2` のサイズは 10G です。

次に、`growpart` コマンドでパーティションを大きくします。
`/dev/sda` と `2` の間にはスペースを入れることに注意してください。

```sh
# growpart /dev/<ディスク> <パーティション番号>
root@ubuntu:~# growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=20965376 end=20969472 new: size=31453151 end=31457247
```

結果を、`fdisk`で確認します。

```sh
root@ubuntu:~# fdisk -l
(略)
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 31457246 31453151  15G Linux filesystem
```

`GPT PMBR size mismatch` の警告がなくなり、`/dev/sda2` のサイズが 15GB になりました。

### 方法2 parted

パーティションを拡張するのに、partedコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。

ではパーティションを大きくしましょう。

`parted`を、`/dev/sda`を引数として実行します。

```sh
root@ubuntu:~# parted /dev/sda
GNU Parted 3.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) 
```

`(parted)` というプロンプトが表示されるので、`print free` と入力して実行します。

```sh
(parted) print free
```
```sh
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use all of the space (an extra 10485760 blocks) or continue with the current
setting?
Fix/Ignore? 
```

HDDのサイズが変更になったため、HDDの最後に書かれているはずのGPTが最後にないことが検出されています。
GPTをHDDの最後に移動してよいか聞いているので、Fixと入力します。
ここでFixしないと、パーティションを大きくすることはできません。

```sh
Fix/Ignore? Fix
```
```sh
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  10.7GB  10.7GB  ext4
        10.7GB  16.1GB  5370MB  Free Space
```

現在の状況が表示されます。`/dev/sda` が 16.1GB （だいたい15GB）であること、
パーティション番号2 が 10.7GB （だいたい10GB）であること、
パーティション番号2 の後ろに、5370MBの空き領域が存在し、そのEndは 16.1GBであることがわかります。

空き領域を最大限使い切るため、表示の単位をセクタ単位にしておきます。

```sh
(parted) unit s
```

再度、`print free` します。

```sh
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 31457280s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start      End        Size       File system  Name  Flags
        34s        2047s      2014s      Free Space
 1      2048s      4095s      2048s                         bios_grub
 2      4096s      20969471s  20965376s  ext4
        20969472s  31457246s  10487775s  Free Space
```

ディスクのEndのセクタ番号`31457246s`を後で使いますのでメモしておいてください。

では、パーティションを大きくします。`resizepart`コマンドで`2`番のパーティションを大きくします。

```sh
(parted) resizepart 2
```
```sh
Warning: Partition /dev/sda2 is being used. Are you sure you want to continue?
Yes/No?
```

現在使われている（マウントされている）パーティションだが、本当に続行してよいか聞いてきています。
よいので、yesを入力します。

```sh
Yes/No? yes
```
```sh
End?  [20969471s]?
```

2番のパーティションのEndを、何セクタの場所まで大きくするかを聞いてきています。先ほどメモしたEndである 31457246s を入力します。（parted version 3.0以上であれば、100%という入力も受け付けます）

```sh
End?  [20969471s]? 31457246s
```

再び`print free`します。

```sh
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 31457280s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start  End        Size       File system  Name  Flags
        34s    2047s      2014s      Free Space
 1      2048s  4095s      2048s                         bios_grub
 2      4096s  31457246s  31453151s  ext4
```

ディスク末尾の空き領域がなくなり、2番パーティションのEndが先ほど入力したセクタ番号になっていることがわかりました。

セクタ番号表示だとわかりにくいので、単位をcompact（人間が読みやすいようにいい感じにする）にして、`print free`してみます。

```sh
(parted) unit compact
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  16.1GB  16.1GB  ext4
```

2番パーティションのサイズが16.1GB（だいたい15GB）に増えていることがわかりました。

`quit`でpartedを終了します。

```sh
(parted) quit
```

### 方法3 fdisk

パーティションを拡張するのに、fdiskコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。

拡張というよりは、2番パーティションを一度消して、大きいサイズで改めて作成するというイメージです。

ではパーティションを大きくしましょう。

`fdisk`を、`/dev/sda`を引数として実行します。

```sh
root@ubuntu:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.

Command (m for help):
```
現在の状況を `p` (print) で表示させます。
```sh
Command (m for help): p
```

```sh
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 20969471 20965376  10G Linux filesystem

Command (m for help):
```

さて、ここからパーティションを削除して、再作成していきます。
なお、パーティション削除作業をしても、結果がすぐにHDDに反映されるわけではなく、
再作成も含めて最後にまとめてHDDに反映する形となります。
よって、操作を間違ったら、落ちついて `q` で`fdisk`を終了すればなにも問題ありません。

では、/dev/sda2 （2番パーティション）を `d` (delete)で削除しましょう。

```sh
Command (m for help): d

Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help):
```

正しく削除されたか、`p`で確認しましょう。

```sh
Command (m for help): p
```

```sh
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start   End Sectors Size Type
/dev/sda1   2048  4095    2048   1M BIOS boot
```

`/dev/sda2` がなくなったことがわかります。
それでは、`/dev/sda2` を大きなサイズで作成しましょう。`n`（new）を入力し、`2`を入力し、そのあとは空白のままエンターを2回押します。

```sh
Command (m for help): n
Partition number (2-128, default 2): 2
First sector (4096-31457246, default 4096):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4096-31457246, default 31457246):

Created a new partition 2 of type 'Linux filesystem' and of size 15 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o:
```
新たにパーティションを作成したところ、古いファイルシステムの痕跡が残っているが、削除するかを聞かれています。
これはnoをします。削除してしまうとファイルシステム（ext4）の情報が消えるため、復旧が面倒になります。

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

Command (m for help):
```

これでパーティションが大きなサイズで作成されました。`p` で確認します。

```sh
Command (m for help): p
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 332D6C26-2C88-408B-95E1-E9916F0705EB

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 31457246 31453151  15G Linux filesystem
```

Sizeが 15GB と、大きくなっていることがわかります。
それでは、ここまでの作業結果を、`w` （write）でHDDに反映させます。

```sh
Command (m for help): w

The partition table has been altered.
Syncing disks.

root@ubuntu:~# 
```

## ファイルシステムを拡張する

最後に、ファイルシステムを拡張します。

作業終了時には次の構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/9990b7ee-1728-34cf-68a1-28e0056f8d68.png)


### 方法1 resize2fs

`resize2fs`コマンドを使ってファイルシステムを拡張します。

まず、現在のファイルシステムサイズを、`df`コマンドで確認します。

```sh
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            445M     0  445M   0% /dev
tmpfs            98M  2.4M   96M   3% /run
/dev/sda2       9.8G  4.3G  5.0G  47% /
tmpfs           489M     0  489M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           489M     0  489M   0% /sys/fs/cgroup
/dev/loop0       56M   56M     0 100% /snap/core18/2128
/dev/loop1       33M   33M     0 100% /snap/snapd/12704
/dev/loop2       71M   71M     0 100% /snap/lxd/21029
tmpfs            98M     0   98M   0% /run/user/1000
```

`/dev/sda2` のSizeが 9.8GB であることがわかります。

では、`resize2fs` コマンドでパーティションを拡張します。

```sh
root@ubuntu:~# resize2fs /dev/sda2
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/sda2 is now 3931643 (4k) blocks long.
```

結果を`df`コマンドで確認します。

```sh
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            445M     0  445M   0% /dev
tmpfs            98M  2.4M   96M   3% /run
/dev/sda2        15G  4.3G  9.8G  31% /
tmpfs           489M     0  489M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           489M     0  489M   0% /sys/fs/cgroup
/dev/loop0       56M   56M     0 100% /snap/core18/2128
/dev/loop1       33M   33M     0 100% /snap/snapd/12704
/dev/loop2       71M   71M     0 100% /snap/lxd/21029
tmpfs            98M     0   98M   0% /run/user/1000
```

`/dev/sda2` のSizeが 15GB になりました。これで作業終了です。



# LVMの場合

作業前の構成は次のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/fac3cd27-3888-5ea5-5e7b-0f3114776efe.png)

## HDDサイズを拡張する

HDDのサイズを拡張して、次のイメージの構成を目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/7a3efbea-d2c3-7bf4-3355-3e1949fc582e.png)

まずは現在の容量を`lsblk`コマンドで確認します。

```sh
root@ubuntu:~# lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0                       7:0    0 55.4M  1 loop /snap/core18/2128
loop1                       7:1    0 32.3M  1 loop /snap/snapd/12704
loop2                       7:2    0 70.3M  1 loop /snap/lxd/21029
sda                         8:0    0   10G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0    9G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0    9G  0 lvm  /
sr0                        11:0    1  1.2G  0 rom
```

MOUNTPOINT が `/` となっているNAME `/dev/mapper/ubuntu--vg-ubuntu--lv` を大きくすればよいことがわかりました。
そしてそれを大きくするには、`sda3` を大きくしなければならないこともわかりました。

次に、`sda3`パーティションの配置状況を、`fdisk` コマンドで確認します。

```sh
root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 20969471 18868224   9G Linux filesystem
```

/dev/sda のサイズが 10GB であり、目的のパーティション `/dev/sda3` がディスクの末尾に存在することが確認できました。
目的のパーティションがディスク末尾ではないところに存在する場合は、目的のパーティションの後ろに存在するパーティションが邪魔をして、パーティションを大きくすることができません。

では/dev/sda のサイズを大きくしましょう。ESXiの設定画面で、容量を増やしてOKを押すだけです。
このとき、OSはシャットダウンしていなくても大丈夫です。
ただし、スナップショットがあるとHDDのサイズは大きくできませんので、すべてのスナップショットを統合しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/521970ce-8a13-b6e4-f05e-7934f3f15b54.png)

ESXiでHDDを大きくしても、Linuxは自動で認識はしてくれません。
`/dev/<ディスク名>` のサイズ変更を認識させるには、`/sys/class/block/<ディスク名>/device/rescan` に 1 を書き込むことで、
最新のHDDサイズをLinuxに認識させることができます。

```sh
root@ubuntu:~# echo 1 > /sys/class/block/sda/device/rescan
````

改めて、`fdisk`で、HDDサイズを確認しましょう。

```sh
root@ubuntu:~# fdisk -l /dev/sda
GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 20969471 18868224   9G Linux filesystem

```

`GPT PMBR size mismatch` の警告が`表示されていればOK`です。


## パーティションを拡張する

次の構成を目指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/d3049fc8-0efd-1102-a5ec-7b0101b5038c.png)

### 方法1 growpart

パーティションを拡張するのに、growpartコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。
もしコマンドが見つからない場合は、`cloud-guest-utils` パッケージをインストールすることで導入できます。

```sh
root@ubuntu:~# apt install cloud-guest-utils
```

ではパーティションを大きくしましょう。

まずは現在のパーティションサイズを`fdisk`で確認します。

```sh
root@ubuntu:~# fdisk -l /dev/sda
GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 20969471 18868224   9G Linux filesystem
```

`/dev/sda3` のサイズは 9G です。

次に、`growpart` コマンドでパーティションを大きくします。
`/dev/sda` と `3` の間にはスペースを入れることに注意してください。

```sh
# growpart /dev/<ディスク> <パーティション番号>
root@ubuntu:~# growpart /dev/sda 3
CHANGED: partition=3 start=2101248 old: size=18868224 end=20969472 new: size=29355999 end=31457247
```

結果を、`fdisk`で確認します。

```sh
root@ubuntu:~# fdisk -l /dev/sda
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 31457246 29355999  14G Linux filesystem
```

`GPT PMBR size mismatch` の警告がなくなり、`/dev/sda3` のサイズが 14GB （だいたい15GB）になりました。

### 方法2 parted

パーティションを拡張するのに、partedコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。

ではパーティションを大きくしましょう。

`parted`を、`/dev/sda`を引数として実行します。

```sh
root@ubuntu:~# parted /dev/sda
GNU Parted 3.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) 
```

`(parted)` というプロンプトが表示されるので、`print free` と入力して実行します。

```sh
(parted) print free
```
```sh
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use all of the space (an extra 10485760 blocks) or continue with the current
setting?
Fix/Ignore? 
```

HDDのサイズが変更になったため、HDDの最後に書かれているはずのGPTが最後にないことが検出されています。
GPTをHDDの最後に移動してよいか聞いているので、Fixと入力します。
ここでFixしないと、パーティションを大きくすることはできません。

```sh
Fix/Ignore? Fix
```
```sh
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  1076MB  1074MB  ext4
 3      1076MB  10.7GB  9661MB
        10.7GB  16.1GB  5370MB  Free Space
```

現在の状況が表示されます。`/dev/sda` が 16.1GB （だいたい15GB）であること、
パーティション番号3 が 9661MB （だいたい10GB）であること、
パーティション番号3 の後ろに、5370MBの空き領域が存在し、そのEndは 16.1GBであることがわかります。

空き領域を最大限使い切るため、表示の単位をセクタ単位にしておきます。

```sh
(parted) unit s
```

再度、`print free` します。

```sh
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 31457280s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start      End        Size       File system  Name  Flags
        34s        2047s      2014s      Free Space
 1      2048s      4095s      2048s                         bios_grub
 2      4096s      2101247s   2097152s   ext4
 3      2101248s   20969471s  18868224s
        20969472s  31457246s  10487775s  Free Space
```

ディスクのEndのセクタ番号`31457246s`を後で使いますのでメモしておいてください。

では、パーティションを大きくします。`resizepart`コマンドで`3`番のパーティションを大きくします。

```sh
(parted) resizepart 3
```
```sh
End?  [20969471s]?
```

3番のパーティションのEndを、何セクタの場所まで大きくするかを聞いてきています。先ほどメモしたEndである 31457246s を入力します。

```sh
End?  [20969471s]? 31457246s
```

再び`print free`します。

```sh
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 31457280s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start     End        Size       File system  Name  Flags
        34s       2047s      2014s      Free Space
 1      2048s     4095s      2048s                         bios_grub
 2      4096s     2101247s   2097152s   ext4
 3      2101248s  31457246s  29355999s
```

ディスク末尾の空き領域がなくなり、3番パーティションのEndが先ほど入力したセクタ番号になっていることがわかりました。

セクタ番号表示だとわかりにくいので、単位をcompact（人間が読みやすいようにいい感じにする）にして、`print free`してみます。

```sh
(parted) unit compact
(parted) print free
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 16.1GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  1076MB  1074MB  ext4
 3      1076MB  16.1GB  15.0GB
```

3番パーティションのサイズが15.0GBに増えていることがわかりました。

`quit`でpartedを終了します。

```sh
(parted) quit
```

### 方法3 fdisk

パーティションを拡張するのに、fdiskコマンドを使います。
Ubuntu 20.04 Server にはデフォルトでインストールされています。

拡張というよりは、3番パーティションを一度消して、大きいサイズで改めて作成するというイメージです。

ではパーティションを大きくしましょう。

`fdisk`を、`/dev/sda`を引数として実行します。

```sh
root@ubuntu:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

GPT PMBR size mismatch (20971519 != 31457279) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.

Command (m for help):
```
現在の状況を `p` (print) で表示させます。
```sh
Command (m for help): p
```

```sh
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 20969471 18868224   9G Linux filesystem

Command (m for help):
```

さて、ここからパーティションを削除して、再作成していきます。
なお、パーティション削除作業をしても、結果がすぐにHDDに反映されるわけではなく、
再作成も含めて最後にまとめてHDDに反映する形となります。
よって、操作を間違ったら、落ちついて `q` で`fdisk`を終了すればなにも問題ありません。

では、/dev/sda3 （3番パーティション）を `d` (delete)で削除しましょう。

```sh
Command (m for help): d

Partition number (1-3, default 3): 3

Partition 3 has been deleted.

Command (m for help):
```

正しく削除されたか、`p`で確認しましょう。

```sh
Command (m for help): p
```

```sh
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device     Start     End Sectors Size Type
/dev/sda1   2048    4095    2048   1M BIOS boot
/dev/sda2   4096 2101247 2097152   1G Linux filesystem
```

`/dev/sda3` がなくなったことがわかります。
それでは、`/dev/sda3` を大きなサイズで作成しましょう。`n`（new）を入力し、`3`を入力し、そのあとは空白のままエンターを2回押します。

```sh
Command (m for help): n
Partition number (3-128, default 3): 3
First sector (2101248-31457246, default 2101248):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2101248-31457246, default 31457246):

Created a new partition 3 of type 'Linux filesystem' and of size 14 GiB.
Partition #3 contains a LVM2_member signature.

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

```
新たにパーティションを作成したところ、古いファイルシステムの痕跡が残っているが、削除するかを聞かれています。
これはnoをします。削除してしまうとシグネチャ（LVM）の情報が消えるため、復旧が面倒になります。

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

Command (m for help):
```

これでパーティションが大きなサイズで作成されました。`p` で確認します。

```sh
Command (m for help): p
Disk /dev/sda: 15 GiB, 16106127360 bytes, 31457280 sectors
Disk model: Virtual disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D18BFAE1-C432-49C6-AF34-4901543CB719

Device       Start      End  Sectors Size Type
/dev/sda1     2048     4095     2048   1M BIOS boot
/dev/sda2     4096  2101247  2097152   1G Linux filesystem
/dev/sda3  2101248 31457246 29355999  14G Linux filesystem
```

Sizeが 14GB と、大きくなっていることがわかります。
それでは、ここまでの作業結果を、`w` （write）でHDDに反映させます。

```sh
Command (m for help): w

The partition table has been altered.
Syncing disks.

root@ubuntu:~# 
```

## LVMの物理ボリュームの拡張（pvresize）

`pvresize`を使って、LVMの物理ボリュームを拡張します。
終了時には次の構成になっています。ボリュームグループも一緒に大きくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/c08ca958-717d-538f-02b1-6b4f52a1cfe7.png)

まずは、`pvdisplay` で状況を確認します。(`-C` オプションでカラム表示させる)

```sh
root@ubuntu:~# pvdisplay -C
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <9.00g    0
```

`/dev/sda3` はubuntu-vg というボリュームグループに組み込まれており、サイズは9.00gぐらいということがわかりました。

では、物理ボリューム `/dev/sda3` を `pvresize` で拡張します。

```sh
root@ubuntu:~# pvresize /dev/sda3
  Physical volume "/dev/sda3" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
```

結果を確認します。

```sh
root@ubuntu:~# pvdisplay -C
  PV         VG        Fmt  Attr PSize   PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <14.00g 5.00g
```

14.00g に拡張されました。

## LVMの論理ボリュームの拡張（lvresize）

次に、`lvresize`を使って、論理ボリュームを拡張します。
似たコマンドとして`lvextend`(拡張専用)、`lvreduce`（縮小専用）がありますが、
`lvresize` はこれらのコマンドの機能を兼ね備えたコマンドです。

作業終了時には次の構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/74d717b8-6c11-3a73-de7f-bb56fec2939c.png)


まずは、`lvdisplay` で状況を確認します。(`-C` オプションでカラム表示させる)

```sh
root@ubuntu:~# lvdisplay -C
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <9.00g
```

論理ボリューム `ubuntu-lv` は`ubuntu-vg`というボリュームグループから切り出されており、サイズは9.00gぐらいということがわかりました。

では、論理ボリューム `ubuntu-lv` を `lvresize` で拡張します。
`-l +100%FREEE` で、ボリュームグループの空き領域100%分を`+`（拡張）するという意味になります。

```sh
root@ubuntu:/home/user# lvresize -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <9.00 GiB (2303 extents) to <14.00 GiB (3583 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
```

結果を確認します。

```sh
root@ubuntu:/home/user# lvdisplay -C
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- <14.00g
```

14.00g に拡張されました。


## ファイルシステムを拡張する

最後に、ファイルシステムを拡張します。

作業終了時には次の構成になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13722/c440a085-19f4-c7f0-3df2-59183db0b982.png)


### 方法1 resize2fs

`resize2fs`コマンドを使ってファイルシステムを拡張します。

まず、現在のファイルシステムサイズを、`df`コマンドで確認します。

```sh
root@ubuntu:/home/user# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               445M     0  445M   0% /dev
tmpfs                               98M  2.5M   96M   3% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  8.8G  4.0G  4.4G  48% /
tmpfs                              489M     0  489M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              489M     0  489M   0% /sys/fs/cgroup
/dev/sda2                          976M  108M  801M  12% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2128
/dev/loop1                          33M   33M     0 100% /snap/snapd/12704
/dev/loop2                          71M   71M     0 100% /snap/lxd/21029
tmpfs                               98M     0   98M   0% /run/user/1000

```

`/dev/mapper/ubuntu--vg-ubuntu--lv` のSizeが 8.8GB であることがわかります。

では、`resize2fs` コマンドでパーティションを拡張します。

```sh
root@ubuntu:/home/user# resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 3668992 (4k) blocks long.
```

結果を`df`コマンドで確認します。

```sh
root@ubuntu:/home/user# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               445M     0  445M   0% /dev
tmpfs                               98M  2.5M   96M   3% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   14G  4.0G  9.1G  31% /
tmpfs                              489M     0  489M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              489M     0  489M   0% /sys/fs/cgroup
/dev/sda2                          976M  108M  801M  12% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2128
/dev/loop1                          33M   33M     0 100% /snap/snapd/12704
/dev/loop2                          71M   71M     0 100% /snap/lxd/21029
tmpfs                               98M     0   98M   0% /run/user/1000
```

`/dev/mapper/ubuntu--vg-ubuntu--lv` のSizeが 14GB（だいたい15GB） になりました。これで作業終了です。


# 備考：GUIの場合

GUIの場合は、gparted を使います。
Ubuntu 20.04 Desktop にはデフォルトではインストールされていないので、次のコマンドでインストールします。

```sh
root@ubuntu:~# apt install gparted
```

`gparted` で起動できます。

```sh
root@ubuntu:~# gparted
```

あとは直感的に使えるので、解説は割愛します。