WSL2 Disk space — 逼迫した WSL2 のディスクスペースを解放する

WSL を使っている人へ

WSL2 のディスク消費は、WSL2 内部でファイルを消してもサイズが小さくならないらしい。 つまり、いくら WSL 側でファイルを rm しようが garbage collection しようが、 マシンのストレージは圧迫され続ける。

WSL2 で使用する Linux ディストリビューションのデータは仮想ハードディスク (VHD) で管理されていて、 ここがデータの本体を持っているから、だと思う。

なので根本的にディスク容量を開放するには、 VHD を最適化する必要がある。

VHD (.vhdx) を探す

PowerShell
> ls C:\Users\_username_\AppData\Local\Packages\Canonical*  # _username_ は自分のものを


    ディレクトリ: C:\Users\_username_\AppData\Local\Packages


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/01/05     21:33                CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
d-----        2023/01/05     21:36                CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc

使っているディストリビューションのディレクトリ内にある LocalState\ext4.vhdx がいる。 (onWindows の方にはなかった。)

PowerShell
> ls C:\Users\_username_\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\


    ディレクトリ: C:\Users\_username_\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/06/06     14:04   208281796608 ext4.vhdx

DISKPART を使って VHD を確認する

まず wsl をシャットダウンする:

PowerShell
wsl --shutdown

DISKPART インタプリタを起動する:

PowerShell
diskpart

先ほど調べた VHD を選択する:

DISKPART
DISKPART> select vdisk file=C:\Users\_username_\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx

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

VHD の情報を確認する:

DISKPART
DISKPART> detail vdisk

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

VHD ディスクスペースを最適化する

Attach -> Compact -> Detach の順に実行する。

Attach:

DISKPART
DISKPART> attach vdisk readonly

  100% 完了しました

DiskPart により、仮想ディスク ファイルがアタッチされました。

Compact (本質):

DISKPART
DISKPART> compact vdisk

  100% 完了しました

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

Detach:

DISKPART
DISKPART> detach vdisk

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

DISKPART を終了する (その前にもう一回 detail してもよい):

DISKPART
DISKPART> exit