-ao- ramune blog

©2023 unio / GO2直営からふるラムネ
2019年10月15日 (更新:2022年12月29日)

Ubuntu on VirtualBox の可変サイズディスクを縮める

対象バージョン
  • VirtualBox 6
  • ゲストOS : Ubuntu18.04
  • ホストOS : Windows10

VirtualBoxの可変サイズディスクを小さくする

VirtualBoxの可変サイズディスクは拡張のみで、ゲストOSのディスク使用量に合わせて縮小することはありません。
ディスクの初期設定によっては想定以上にサイズが大きくなり、ホストOSの容量を圧迫する恐れがあります。

育ちに育って100GBオーバー

幸いVirtualBoxには可変サイズディスクを小さくするmodifyhdというコマンドがあるのですが、 利用するためにはディスクの空き領域をゼロクリアする必要があります。

  1. 不要な巨大ファイルを削除
  2. zerofreeをインストール
  3. ファイルシステムをリードオンリーに変更
  4. リカバリーモードでzerofreeを実行
  5. 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を選択します。

GRUB

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
                    # 上の行を追加