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


はじめに

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

目次

  • 環境
  • 手順の確認
    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』 ⬅︎ こいつを64GBに拡張したい!

手順の確認

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

【手順】

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

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

  • VirtualBoxを立ち上げてバックアップを作成する仮想マシンを選択し, スナップショットの画面へ移動
  • 『作成』からスナップショットの作成を行う
スナップショット名は自分が判断できればなんでも良いと思います.

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

  • スナップショットが作成されたことを確認

2. 仮想HDDの作成

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

  • 64GB仮想HDDの作成
    『ストレージ』→『コントローラー: SATA』→『右側の+』を選択
  • 『作成(C)』から仮想HDDを新規作成
  • 特に拘りがなければVDI(VirtualBox Disk Image)タイプを選択
  • サイズを選択

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

  • 可変サイズ

    • 読み書き速度は固定サイズに比べて遅い
    • 物理HDDサイズを上限として, データの使用量に応じてHDDサイズを拡張可能
  • 固定サイズ

    • データの読み書きが高速
    • ストレージサイズは固定長
  • 仮想HDDのサイズを指定

注意:既存のディスクサイズよりも大きい容量を確保すること!
今回は64GBの仮想HDDを作成しましたが, ここで設定する記憶域はリアルにPC(Macintosh HD)の物理ストレージを食うので, ストレージ使用量を見ながら設定する必要がある.
  • 作成された仮想HDDを確認

3. データの移行

  • 作成した64GB仮想HDDをUbuntuにアタッチ
これで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をデタッチ
    右下の×ボタンから削除できる

4. ストレージの確認

  • 仮想マシンを立ち上げて, 現在の状況を確認
### ディスク使用量を表示 
$ df -h
### パーティション情報を表示
$ sudo fdisk -l

※ 出力結果が多いので抜粋

  • ディスク使用量アナライザで確認

現段階では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



20GB仮想HDDから64GB仮想HDDに変更完了
利用可能なストレージが 3% から 70% に増加しました...💦

  • 再起動して, 問題なくOSが立ち上がることを確認
$ sudo reboot
  • ディスク使用量アナライザで確認


    ストレージが拡張できていれば作業はおしまい.

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

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

  • 保有している仮想HDD(物理ストレージを占領している仮想HDD一覧)を確認
  • 仮想HDDを選択して解放
    注意:一度解放したストレージ容量及びデータは復元できなくなるので, よく確認してから実行すること!

最後に

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

参考