本文を読み飛ばす

WSL2 の仮想ディスクを圧縮する

WSL2 使っていると、気が付いたらハードディスクの容量を圧迫していたなんてことがよくあります。

仮想マシン上で大きなファイルを作成したり、作業をしているうちに当然仮想ディスクのサイズは大きくなりますが、仮想マシン上でファイルを削除し他場合、仮想ディスク内で df -h などすれば容量が減っていることを確認できるのですが、実は仮想ディスクのファイルそのもののサイズは解放されません。

ここでは、肥大化した仮想ディスクのファイルのサイズを解放する方法を紹介します。

目次

仮想ディスクの確認

WSL2 の仮想マシンのファイルは Microsoft Store からインストールされた Ubuntu であれば以下のパスにあります。

C:\Users\{USERNAME}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_xxxxxxxxx\LocalState\ext4.vhdx

.vhdx は Windows の Hyper-V の仮想ディスクフォーマットなのかしら...

Tips: Docker Desktop for Windows の場合

Docker Desktop の WSL2 バックエンドでも WSL2 の仮想マシンを使いますが、むしろ Docker 仮想マシンの肥大化のがやばいかもしれません。
イメージビルドの際のキャッシュとかイメージそのもので容量を食べますし。

Docker の WSL2 のディスクイメージは以下にありました。

C:\Users\{USERNAME}\AppData\Local\Docker\wsl

私の環境の圧縮前のサイズはこんな感じ

3.6GB ぐらいでしょうか。

df -h の結果は以下なので実際のディスク消費量と 1GB ぐらい差がありそうです。

仮想ディスクの圧縮

1. WSL の停止

WSL を止めます。
仮想マシンを停止した後、念のため WSL のサービスも落とします。

仮想マシンのシャットダウン

PowerShell か Command prompt で以下を実行

wsl --shutdown
WSL サービスの停止

PowerShell か Command prompt を管理者として実行し、以下コマンドを実行

net stop LxssManager
LxssManager サービスを停止中です.
LxssManager サービスは正常に停止されました。

2. DISKPART で圧縮

PowerShell や Command prompt から以下コマンドで DISKPART を起動

diskpart

起動したら以下コマンドで仮想ディスクを選択します

DISKPART> select vdisk file="C:\Users\pemugi\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_xxxxxxxxx\LocalState\ext4.vhdx"

DiskPart により、仮想ディスク ファイルが選択されました。

そして圧縮します

DISKPART> compact vdisk

  100% 完了しました
DISKPART> exit

3. WSL サービスの再開

PowerShell か Command prompt を管理者として実行し、以下コマンドを実行

net start LxssManager

まとめ

DISKPART を使って vhdx を圧縮する方法を紹介しました。
Webエンジニアやバックエンドエンジニアの開発環境は、ここしばらく Mac が優勢ですが、今後 Windows + WSL2 な人も増えてきそうかな?

WSL や Docker Desktop for Windows (WSL2) を使ってて、仮想ディスクの容量に困ったら試してみてくださいませ~。