VirtualBox + CentOS のストレージユニットのハードディスクリサイズ失敗を解決する方法

はじめに

実務にて、macOS + VirtualBox の仮想メディアマネージャーからサイズ拡張を適用したところ「ストレージユニットのハードディスク xxx.vmdk の xx.xx GB から xx.xx GBへのリサイズに失敗しました。」というエラーが発生、それを解決した情報になります。

詳細には「新しいサイズ 26497515520 へのサイズ変更は、メディア ‘xxx.vmdk’ ではまだサポートされていません。(Resizing to new size 26497515520 is not yet supported for medium ‘xxx.vmdk’.)」と表示されています。

環境

解説

結論から言うと、VirtualBox では .vmdk のリサイズがサポートされていないので、ファイル形式を .vdi に変換してからリサイズを行い .vmdk に戻すことで解決できます。

初めに、ゲスト OS のターミナルから df -h コマンドでディスクの使用状況を確認しておきましょう。

df -h

私の場合は /dev/mapper/centos-root の使用率が 99% になっていたので、あと 6 GB ほど容量を拡張して 20 GB にしようと思います。

/dev/mapper/centos-root    14G   14G  217M   99% /

仮想マシンを停止させて、ホスト OS のターミナルから VBoxManage clonehd コマンドに --format vdi オプションを追加して実行、.vmdk から .vdi のクローンを作成します。

コマンドを実行する前に ホスト OS のストレージの領域を確認してください。元ファイルを複製するので、空き容量を超過する場合はファイルを整理してあげましょう。

また、.vmdk の読み込み先と .vdi の書き出し先はご自分の環境に合わせて指定してください。

VBoxManage clonehd "VirtualBox VMs/xxx/xxx-disk001.vmdk" "VirtualBox VMs/xxx/xxx-disk001.vdi" --format vdi

しばらく待つと下記のように終了します。

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: xxx-xxx-xxx-xxx-xxx

ls コマンドを実行して正常に .vdi が作成されているか確認します。

ls VirtualBox\ VMs/xxx/

次は VBoxManage modifyhd コマンドに --resize オプション指定で実行して .vdi を 20480 MB(20 GB)にリサイズします。

VBoxManage modifyhd "VirtualBox VMs/xxx/xxx-disk001.vdi" --resize 20480

VBoxManage showhdinfo コマンドを実行してリサイズが正常に処理されているか確認しましょう。

VBoxManage showhdinfo "VirtualBox VMs/xxx/xxx-disk001.vdi"

Capacity を見ると拡張されていることがわかります。

UUID:           xxx
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/ihara/vagrant/VirtualBox VMs/xxx/xxx-disk001.vdi
Storage format: vdi
Format variant: dynamic default
Capacity:       20480 MBytes
Size on disk:   15491 MBytes
Encryption:     disabled
Property:       AllocationBlockSize=1048576

次はリサイズ後の .vmdVBoxManage clonehd コマンドを実行して .vmdk に戻します。

書き出すファイル名はわかりやすいように xxx-disk001_resize.vmdk としています。また、今回もファイルを複製することになるのでコマンドを実行する前に ホスト OS のストレージの空き容量に気を付けましょう。

VBoxManage clonehd "VirtualBox VMs/xxx/xxx-disk001.vdi" "VirtualBox VMs/xxx/xxx-disk001_resize.vmdk" --format vmdk

ls コマンドを実行して正常に .vmdk が作成されているか確認しましょう。

ls VirtualBox\ VMs/xxx/

次は VirtualBox を起動してストレージデバイスに作成した .vmdk をマウントします。

仮想マシンが正常に起動することを確認しましょう。起動できない場合は、仮想メディアマネージャーでディスクイメージが正常に認識できていない、又はストレージデバイスのハードディスクマウントができていなかったなど確認を行いましょう。

次はゲスト OS のターミナルから fdisk コマンドを実行して対話的にパーティションの拡張をします。

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 でヘルプ): 

m コマンドを実行すると各コマンドの動作を確認することができます。

コマンド (m でヘルプ): m
コマンドの動作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

p コマンドを実行してパーティションテーブルの確認をします。

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

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

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    33554431    15727616   8e  Linux LVM

d コマンドを実行してパーティションの削除を行います。削除するパーティション番号はご自身の環境に合わせて指定してください、私の場合はデフォルトの値で問題ないので enter キーを押下しています。

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

n コマンドを実行して新しいパーティションを追加します。パーティションの設定値はご自身の環境に合わせて指定してください、私の場合は全てデフォルトの値で問題ないので enter キーを押下しています。

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

t コマンドを実行するとパーティションを Linux LVM などに変更できるが、私は必要ないので変更しません。

w コマンドを実行して設定を保存します。

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

q コマンドを実行して終了、設定を反映させる為にゲスト OS を再起動します。

再起動後、ゲスト OS のターミナルにて pvresize コマンドを実行して物理ボリュームをリサイズします。

pvresize /dev/sda2

次は lvresize コマンドを実行して論理ボリュームをリサイズします。論理ボリューム名がわからない場合は lvscan コマンドを実行して確認します。

lvscan
lvextend -l +100%FREE /dev/centos/root

最後に xfs_growfs コマンドを実行してファイルシステムをリサイズします。centOS 7 のファイルシステムは XFS(eXtents File System)なので resize2fs コマンドが使えないことに注意しましょう。

xfs_growfs /dev/centos/root

df -h コマンドを実行して正常にリサイズされていれば完了です。

以上です。

おわりに

VirtualBox が .vmdk リサイズのサポートもしてくれたら楽なのにね。