WSL のディスク領域を解放する

WSL で利用されている vhd のファイルを最適化したときの備忘録です。

環境情報

  • Windows 10 Pro (10.0.19045 N/A ビルド 19045)
  • WSL 2.0.14.0

手順

事前の確認

事前に WSL 上のディストリビューションを停止させておきます。

PS > wsl --shutdown
PS > wsl --list --verbose
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

事前に WSL のバージョンを最新化しておきます。

PS > wsl --update
PS > wsl --version
WSL バージョン: 2.0.14.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
MSRDC バージョン: 1.2.4677
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.4046

ディスクの解放をしたい <distribution-name> を指定して、WSL の論理上で利用されているサイズを確認します。53 GB である。

PS > wsl --system -d <distribution-name> df -h /mnt/wslg/distro
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc       1007G   53G  904G   6% /mnt/wslg/distro

使用可能なディスク領域をチェックする方法

続いて、該当の <distribution-name> を指定して、利用されている vhd のファイルパスを確認します。

PS > (Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"
C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx

Linux ディストリビューションの .vhdx ファイルとディスク パスを見つける方法

上記で取得したパスを指定して、ファイルサイズを確認します。254 GB である。

PS > (ls C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx).Length / 1024 / 1024 / 1024
254.837890625

ディスク解放

Hyper-V の機能をインストールしている場合、Optimize-VHD という PowerShell のコマンドが利用できるようですが、僕の環境では利用できなかったため、昔ながらの DISKPART コマンドにて vhd ファイルの最適化を行います。

Optimize-VHD

DISKPART のプロンプトを起動します。

PS > DISKPART

対象としたい vhd ファイルを選択します。

DISKPART> select vdisk file=C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
DiskPart により、仮想ディスク ファイルが選択されました。

select vdisk

事前の確認。

DISKPART> detail vdisk

デバイスの種類 ID: 0 (不明)
ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
状態: 追加済み
仮想サイズ: 1024 GB
物理サイズ:  254 GB
ファイル名: C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
子: いいえ
親ファイル名:
関連付けられたディスク番号: 見つかりません。

detail vdisk

最適化(ディスクの解放)。

DISKPART> compact vdisk

  100% 完了しました

DiskPart により、仮想ディスク ファイルは正常に圧縮されました。

compact vdisk

実施後の確認。vhd ファイルが 64 GB になりました。

DISKPART> detail vdisk

デバイスの種類 ID: 0 (不明)
ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
状態: 追加済み
仮想サイズ: 1024 GB
物理サイズ:   64 GB
ファイル名: C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
子: いいえ
親ファイル名:
関連付けられたディスク番号: 見つかりません。
PS > (ls C:\Users\{user-name}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx).Length / 1024 / 1024 / 1024
64.533203125