Ubuntu on VirtualBox の可変サイズディスクを縮める
対象バージョン
- VirtualBox 6
- ゲストOS : Ubuntu18.04
- ホストOS : Windows10
VirtualBoxの可変サイズディスクを小さくする
VirtualBoxの可変サイズディスクは拡張のみで、ゲストOSのディスク使用量に合わせて縮小することはありません。
ディスクの初期設定によっては想定以上にサイズが大きくなり、ホストOSの容量を圧迫する恐れがあります。
幸いVirtualBoxには可変サイズディスクを小さくするmodifyhdというコマンドがあるのですが、 利用するためにはディスクの空き領域をゼロクリアする必要があります。
- 不要な巨大ファイルを削除
- zerofreeをインストール
- ファイルシステムをリードオンリーに変更
- リカバリーモードでzerofreeを実行
- modifyhdコマンドで可変ディスクを圧縮
不要な巨大ファイルを削除
ディスクサイズを縮退させる前に、不要なファイルがあれば削除してしまいます。
この操作が不要な場合は次に進んで下さい。
巨大なフォルダを探す場合はduコマンドを利用します。
対象フォルダに対して/*を付けることで、各サブフォルダのサイズを確認できます。
duコマンドで巨大なフォルダを探す
du -sh [検索したいフォルダ]/*
巨大なファイル単体を探す場合はfindコマンドを利用します。
sizeオプションを書き換えることで、検索するファイルサイズを調整できます。
findコマンドで巨大なファイルを探す
find [検索したいフォルダ] -size +500M
swapfileを削除したい場合は、swapoffコマンドでswapを止めてからファイルを削除します。 /etc/fstabにswapfileのマウント設定が書かれている場合は、そちらも削除します。
swapfileを削除
sudo swapoff /swapfile
sudo rm /swapfile
swapfileのマウント設定を削除
sudo vim /etc/fstab
...
/swapfile none swap sw 0 0
# 上の行を削除
zerofreeをインストール
ゼロクリアツールのzerofreeをインストールします。
zerofreeのインストール
sudo apt install zerofree
ファイルシステムをリードオンリーに変更
zerofreeはリードオンリーでないと実行できません。
リカバリーモード実行時にリードオンリーでマウントされるように、/etc/fstabのoptionsを書き換えます。
後ほど設定を元に戻すので、最初に書かれていたoptionsは必ずメモしてください。
/etc/fstabのoptionsをnoatime,roに書き換え
sudo vim /etc/fstab
...
# / was on /dev/sda1 during installation
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=xxxxxxxxx / ext4 noatime,ro 0 1
リードオンリーだけならroで十分ですが、ディスクアクセス速度向上を願ってnoatimeも一緒に付与しています。
余談ですが、他サイトではmountコマンドでリードオンリーにする方法も紹介されています。
ただmountコマンドの場合ディスクIOが走るプロセスをすべて停止させないと変更できません。
自分も様々なプロセスをkillして試していたのですが、結局fstabを編集するのが一番楽でした。
リカバリーモードでzerofreeを実行
zerofreeを実行するため、リカバリーモードを起動します。
ゲストOSを再起動して、VirtualBoxのスプラッシュが表示されたらESCキーを連打します。
GRUBが表示されたら、Advanced Options for Ubuntuを選択します。
Linuxカーネルバージョン毎のリストが出るので、最新バージョンのrecovery modeを選択します。
リカバリーメニューにfilesystem state: read-onlyの表示があるか確認してください。
問題なければrootを選んでシェルを起動します。
リードオンリーにした対象マウントポイントに対してzerofreeを実行します。
今回はfstabのコメントにあった# / was on /dev/sda1 during installationのとおり、/dev/sda1を指定します。
zerofreeは時間がかかる場合もあるので、終了するまで焦らずお待ちください。
zerofreeの実行
zerofree -v /dev/sda1
zerofreeが終了したらfstabの設定を元に戻します。
fstabを編集するので、mountコマンドでread-writeモードにマウントしなおします。
read-writeモードにリマウント
mount -o remount,rw /
optionsを元に戻す
vim /etc/fstab
...
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=xxxxxxxxx / ext4 errors=remount-ro 0 1
fstabを元に戻したら、poweroffコマンドで仮想マシンの電源を落とします。
poweroff
poweroff
modifyhdコマンドで可変ディスクを圧縮
ディスクサイズの縮退はホストOS上で実行します。
今回ホストOSはWindowsなので、コマンドプロンプトからVBoxManageを実行します。
コマンドプロンプトは、Windowsキー + rでファイル名を指定して実行を開き、cmdを指定すると起動します。
modifyhdの実行
C:\Users\unio> cd "C:\Program Files\Oracle\VirtualBox"
C:\Program Files\Oracle\VirtualBox> VBoxManage modifyhd "C:\Users\unio\VirtualBox VMs\ubuntu18.04\ubuntu18.04-disk001.vdi" --compact
ディスクファイルのパスがわからない場合は、VirtualBoxアプリを開いて仮想マシンの設定でストレージを確認してください。
コマンド終了後、ファイルサイズが小さくなっていれば成功です。
swapfileの復活
swapfileを削除していた場合、下記で復活できます。
500MBのswapfile作成
sudo dd if=/dev/zero of=/swapfile bs=1MB count=500
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapfileのマウント設定
sudo vim /etc/fstab
...
/swapfile none swap sw 0 0
# 上の行を追加