WSL2 のディスクサイズを簡単に最適化できる WSL2 Compacter のご紹介

WSL2 は一度確保した仮想ディスクイメージ (vhdx) の容量を自動で切り詰めてくれない問題を抱えています。vhdx は内部でファイル容量が増加するごとにどんどん膨れ上がるものの、内部のファイルが減ってもそれに合わせて切り詰めたりをしてくれないようです。

WSL2 Docker が PC のディスクを圧迫する - Qiita
概要 WSL2 バックエンドの Docker では、コンテナやボリューム、イメージを削除しても、ホスト (Windows) のディスク容量が解放されない。 原因 WSL2 は一度確保したディスクをホストに返さないらしい。I...

例えば、docker system prune で Docker 内のイメージやコンテナのキャッシュを消しても、残念ながらそのままでは Docker が利用する vhdx のサイズは変わってくれません。
この問題は WSL2 が内部で使っている Hyper-V 仮想ディスクイメージの仕組み的な問題なのかわかりませんが、とはいえ最適化する方法自体はあるようです。

PowerShell には Optimize-VHD という、仮想ディスクを最適化するためのコマンドレットがあります。
これの引数に WSL2 の ext4.vhdx を指定してあげると、ディスクが最適化されて、ディスクイメージのうち使われていない部分の領域を切り詰めてくれます。これを実行してあげればいいわけです。

…ただ、この Optimize-VHD 、残念ながら Windows 10 Home には搭載されていません。そもそも Windows 10 Home では Hyper-V は使えない事になっている(WSL2 だけ特別に認められているらしい?)ので当たり前っちゃそう。

私のメイン PC は開発機なのに諸事情で未だに Home なので、 Optimize-VHD コマンドレットがありませんでした。
一応昔ながらの diskpart コマンドの中で色々実行すれば Optimize-VHD と同様の最適化ができるのですが、複数のコマンドを叩かないといけないのでちょっと面倒くさい。

Sponsored Link

WSL2 Compacter

https://github.com/mikemaccana/compact-wsl2-disk

そこで見つけたのが WSL2 Compacter の PowerShell スクリプトです。

このスクリプトはとても良くできていて、システムにインストールされている WSL2 関連の vhdx を検索し、見つけたらその全てに自動的にディスクの最適化を掛けてくれます。
内部では diskpart を使っているので Home でも使えますし、Pro の人でもパスをわざわざ指定せずとも実行するだけなので楽だと思います。

インストールは簡単、compact-wsl2-disk.ps1 をダウンロードして、適当な場所に配置するだけです。
必要ならば PowerShell のプロファイルにコピペして、コマンドレット化してみるのもありかもしれません。

あとは管理者権限に昇格した PowerShell 上で ./compact-wsl2-disk.ps1 と実行するだけです。
gsudo を入れておくと、Windows でも管理者権限への昇格が楽になるのでおすすめです。
これだけで WSL2 関連の vhdx をまとめて最適化してくれます。

実行結果

私の環境の場合、Ubuntu 本体が -1GB 、Docker は -500MB ほど減りました。
思ったほど減りませんでしたが、これは単に Ubuntu 内に格納されているファイル自体がそもそも多く、vhdx のファイルサイズと実際のサイズの差があまりなかったのが原因のようです。

とはいえいくらか最適化されてその分ディスクが解放されるので、定期的に実行しておいて損はありません。
実行するときは予め Ubuntu 上や Docker のファイルやイメージを削除して整理しておくとより効果が出ると思います。

コメント