【Oracle VM VirtualBox】VM ストレージの拡張

https://www.ren510.dev/blog/virtualbox-setup

https://www.ren510.dev/blog/vm-storage-expansion

# はじめに

最近, 開発の中で Linux 環境での検証が必要になったので, macOS に VirtualBox をインストールし, Ubuntu を仮想マシンとして立てて利用していました. ところが Docker を多用していたところ, Docker イメージが思いの他ストレージを占領するため, あっという間にオーバーフローしました. ちょっと酷使し過ぎたかな...
ということでそれまで 20GB の仮想 HDD をアタッチしていましたが, これを機に一気に 64GB までストレージを拡張していきたいと思います.
でも, 記憶域をいじったり, パーティションを触るのって, 一つ間違えたら二度と起動してこなくなったり, データが飛んだりする可能性があったりして怖い... ということで, 丁度企業のイベントにも参加していたので, [メンターの方](https://qiita.com/tetsuya28)にもアドバイスを頂きながら作業を進めました.
今回は調べた内容を元に, <font color=Magenta>**Ubuntu 仮想マシンのストレージ拡張方法**</font> について書き残しておきたいと思います.

# 目次

- 環境
- 手順の確認
  1. スナップショットの作成
  2. 仮想 HDD の作成
  3. データの移行
  4. ストレージの確認
  5. パーティションの拡張
  6. 後処理：物理ストレージの解放
- 最後に
- 参考

# 環境

現在, 以下のような環境で仮想マシンを利用している.
20GB という少ない容量の中で作業をしていると一瞬で, オーバーフローします. 初めから余裕をもって確保しておけばよかったと後悔...
ということで 64GB にストレージを拡張する.

- **【HostOS】**
  - OS：macOS Catalina Version 10.15.6
  - CPU：4 コア 2.30GHz Intel(R) Core i7-1068NG7 64bit
  - RAM：32GB
  - ディスク容量：Macintosh HD 500GB
- **【GuestOS (VM)】**
  - OS：Ubuntu 20.04.4 LTS (Focal Fossa)
  - CPU：4 コア 2.30GHz Intel(R) Core i7-1068NG7 64bit
  - RAM：8GB
  - ディスク容量：Ubuntu 20.04.vdi **『20GB』** <font color=Blue>**⬅︎ こいつを 64GB に拡張したい！**</font>

# 手順の確認

記憶域いじったり, パーティションを触る場合, 一つ手順をミスるとすべてのデータが吹っ飛ぶ可能性があるので, 手順を確認しながら慎重に作業を進める.
また, 作業を始める前に必ずスナップショットを作成しておき, 万が一ミスってもロールバックできるようにしておく.

**【手順】**

1. <font color=Red>**スナップショットの作成**</font>
2. <font color=Red>**仮想 HDD の作成**</font>
3. <font color=Red>**データの移行**</font>
4. <font color=Red>**ストレージの確認**</font>
5. <font color=Red>**パーティションの拡張**</font>
6. <font color=Red>**後処理：物理ストレージの解放**</font>

# 1. スナップショットの作成

- VirtualBox を立ち上げてバックアップを作成する仮想マシンを選択し, スナップショットの画面へ移動
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/946b750c-0a74-2518-3d76-4c99f8384672.png">

- 『作成』からスナップショットの作成を行う
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/3c7f649d-9700-627f-4f46-f63b8517c57b.png">
  スナップショット名は自分が判断できればなんでも良いと思います.

自分の場合はいつ作成したバックアップかを一眼で判断できるように`-年-月-日-時:分`のような命名規則に従ってスナップショット名を設定しました.

- スナップショットが作成されたことを確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/c4d84a09-ecbf-d986-d728-a4511a94d223.png">

# 2. 仮想 HDD の作成

今回は新たに 64GB の仮想 HDD を作成し, 既存の 20GB 仮想 HDD データを移行するやり方で作業を進めます.

- 64GB 仮想 HDD の作成
  『ストレージ』→『コントローラー: SATA』→『右側の+』を選択
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/9dfb51db-bdfe-3d47-d8e3-132feda44e85.png">

- 『作成(C)』から仮想 HDD を新規作成
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/4daeff6a-6fc9-a2ee-7dd4-2ff31dccafbd.png">

- 特に拘りがなければ VDI（VirtualBox Disk Image）タイプを選択
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/1158b230-6b75-9226-ff4a-972f72e64fba.png">

- サイズを選択
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/dc14f1a9-f7d9-01cf-84b7-51be0bc30068.png">

【それぞれの特徴 （今回は『固定サイズ』を使用）】

- <font color=Orange>**可変サイズ**</font>
  - 読み書き速度は固定サイズに比べて遅い
  - 物理 HDD サイズを上限として, データの使用量に応じて HDD サイズを拡張可能
- <font color=Orange>**固定サイズ**</font>

  - データの読み書きが高速
  - ストレージサイズは固定長

- 仮想 HDD のサイズを指定
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/de9f44ce-2d39-7cee-38b3-280356d7daf3.png">
  <font color=Red>注意：既存のディスクサイズよりも大きい容量を確保すること！</font><br>
  今回は 64GB の仮想 HDD を作成しましたが, ここで設定する記憶域はリアルに PC（Macintosh HD）の物理ストレージを食うので, ストレージ使用量を見ながら設定する必要がある.

- 作成された仮想 HDD を確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/c446f8e8-eef2-4fc1-f4ed-74180bb879c1.png">

# 3. データの移行

- 作成した 64GB 仮想 HDD を Ubuntu にアタッチ
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/4429a5b9-dd07-d1bc-89ac-7329fdece1d3.png">
  これで 1 つの仮想マシンに 2 つの仮想 HDD がアタッチされたことになりますが, このままでは起動できないので, ローカル PC 上で, データのクローン作業を行い, 不要になった既存の仮想 HDD をデタッチします.

- 仮想 HDD データをクローン
  クローン作業はホスト PC のターミナル上で行う.
- 先ほど作成した VDI のあるディレクトリへ移動して作業を進める
  デフォルトでは`$ /User/[ユーザ名]/VirtualBox\ VMs/[仮想マシン]/***.vdi`に作成される.

```

### 移動
$ cd /Users/ren/VirtualBox\ VMs/Ubuntu\ 20.04

### 2つの仮想HDDが存在していることを確認
$ ls -a
.
..
Logs
Snapshots
Ubuntu 20.04.vbox
Ubuntu 20.04.vbox-prev
Ubuntu 20.04.vdi
Ubuntu 20.04_1.vdi

### 既存の20GB仮想HDD（Ubuntu 20.04.vdi）を64GB仮想HDD（Ubuntu 20.04_1.vdi）にクローン
$ VBoxManage clonehd --existing "Ubuntu 20.04.vdi" "Ubuntu 20.04_1.vdi"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 4cc3e925-****-4d78-****-5abfe3e36cf8
```

これで既存の仮想 HDD に格納されたデータは, 新たに作成した 64GB 仮想 HDD にコピーされました.

- 不要になった仮想 HDD をデタッチ
  右下の × ボタンから削除できる
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/7f93a70f-68dd-107e-c739-247ccefa9144.png">

# 4. ストレージの確認

- 仮想マシンを立ち上げて, 現在の状況を確認

```
### ディスク使用量を表示
$ df -h
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/43c0ee76-ecbd-8435-adca-dfa10e15f38c.png">

```
### パーティション情報を表示
$ sudo fdisk -l
```

※ 出力結果が多いので抜粋
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/ee37330b-39cb-45d4-f74a-7667561d22d7.png">

- ディスク使用量アナライザで確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/180c49dc-63e3-c946-31e4-90748a900001.png">

現段階では 64GB 仮想 HDD をマウントできているものの, 前半 20GB のみしか使用できていません.
このままでは 64GB の仮想 HDD をマウントした意味がないので, 続いての作業でパーティション領域を広げる必要があります.

# 5. パーティションの拡張

- `/dev/sda1`を再作成

```
$ sudo fdisk /dev/sda

fdisk (util-linux 2.34) へようこそ.
ここで設定した内容は, 書き込みコマンドを実行するまでメモリのみに保持されます.
書き込みコマンドを使用する際は, 注意して実行してください.

####################################
### ここで操作するパーティション状態を確認 ###
####################################
コマンド (m でヘルプ): p
ディスク /dev/sda: 64 GiB, 68719476736 バイト, 134217728 セクタ
Disk model: VBOX HARDDISK
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512バイト / 512バイト
I/Oサイズ (最小 / 推奨): 512バイト / 512バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xae83c32c

デバイス    起動 開始位置  最後から   サイズ  Id  タイプ
/dev/sda1  *      2048  41940991   20G  83  Linux

##############################
### ここでパーティションを一旦削除 ###
##############################
コマンド (m でヘルプ): d　　　
パーティション 1 を選択
パーティション 1 を削除しました.

#############################
### ここでパーティションを再作成 ###
#############################
コマンド (m でヘルプ): n
パーティションタイプ
  p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
  e　　拡張領域 (論理パーティションが入ります)
選択 (規定値 p): p　　　⬅︎ 基本パーティションを選択
パーティション番号 (1-4, 既定値 1): 1
最初のセクタ (2048-134217727, 既定値 2048): 2048　　　⬅︎ 既定値を入力
Last sector, +/-sector or +/-size{K,M,G,T,P} (2048-134217727, 既定値 134217727): 『Enter』キー

新しいパーティション 1 をタイプ Linux, サイズ 64 GiB で作成しました.
パーティション #1 には ext4 著名が書き込まれています.

署名を削除しますか？ [Y]es/[N]o: Y　　　⬅︎ 署名を削除する

署名は write (書き込み)コマンドを実行すると消えてしまいます.

#####################################
### ここで操作後のパーティション状態を確認 ###
#####################################
コマンド (m でヘルプ): p
ディスク /dev/sda: 64 GiB, 68719476736 バイト, 134217728 セクタ
Disk model: VBOX HARDDISK
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512バイト / 512バイト
I/Oサイズ (最小 / 推奨): 512バイト / 512バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xae83c32c

デバイス    起動 開始位置  最後から    サイズ  Id  タイプ
/dev/sda1  *      2048  134217727   64G  83  Linux

パーティション 1 にファイルシステム/RAIDの署名が完全に消去されます.

###################################################
### パーティション情報が問題なれば, 情報を書き込んで終了する ###
###################################################
コマンド (m でヘルプ): w
パーティション情報が変更されました.
ディスクを同期しています.
```

- 再起動

```
$ sudo reboot
```

- `resize2fs`コマンドでパーティションを拡張

```
$ sudo resize2fs /dev/sda1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda1 is mounted on /; on-lione resizing required
old_desc_blocks = 3, new_desc_blocks = 8
The filesystem on /dev/sda1 is now 16776960 (4k) blocks long.
```

- ディスク使用量を確認

```
$ df -h
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/cc62f5d3-81bf-77d5-de3b-4fce256db44b.png"><br>
20GB 仮想 HDD から 64GB 仮想 HDD に変更完了
利用可能なストレージが 3% から 70% に増加しました...💦

- 再起動して, 問題なく OS が立ち上がることを確認

```
$ sudo reboot
```

- ディスク使用量アナライザで確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/22c27187-0f88-2fd4-4264-952f98ce7f4c.png"><br>
  ストレージが拡張できていれば作業はおしまい.

# 6. 後処理：物理ストレージの解放

今回, ストレージを拡張するにあたり, 仮想 HDD を新たに作成したことで, 不要になった 20GB の仮想 HDD はデタッチしました. これだけではローカル PC 上の 20GB は解放されないため, 削除しておきます.
また, 作業にあたり作成しておいたスナップショットも, 問題なく動作することが確認できれば削除して大丈夫です.

- 保有している仮想 HDD（物理ストレージを占領している仮想 HDD 一覧）を確認
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/cc3b26f5-0aaa-c1ed-562d-64be22b1ea46.png">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/df8b1a1f-19ad-ea61-cd89-e7381ade5880.png">

- 仮想 HDD を選択して解放
  <font color=Red>注意：一度解放したストレージ容量及びデータは復元できなくなるので, よく確認してから実行すること！</font>
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705806/5859971a-f86b-ddcb-d6e3-bf34c6d4db7f.png">

# おわりに

今回は, 一度マウントしてしまった仮想 HDD 及び仮想マシンのストレージを拡張する方法について書きました.
実際に作業する際にはより多くの記事を読んで, 理解した上で作業すると良いと思います.
以下に参考になった記事を貼っておきます.

### 参考・引用

- [VirtualBox のディスク容量を拡張する](http://kabatin.hateblo.jp/entry/2016/02/25/190846)
- [Linux のディスク管理](https://kazmax.zpp.jp/linux_beginner/disk_manage.html)
- [resize2fs でディスク容量を拡張する](https://knowledge.sakura.ad.jp/925/)

### 読者の皆さんへ

本記事を読んで下さり, ありがとうございます.
誤字脱字や誤った内容を見つけた場合, 本記事にてフィードバックを下さると幸いです.
また, 意見や提案等がありましたら, 併せて本記事のコメント欄に記述して頂けると助かります. より良い記事を書くため, 改良の参考にさせて頂きます.

@ren510dev