WSL2の仮想ディスクサイズを減らしてWindowsのディスク容量を増やす方法
WSL2を利用して作業していると、Windowsのディスク容量が足りなくなってくる問題があります。特にDocker利用時はこの現象が顕著に現れます。不要なコンテナやイメージを削除してもディスク容量が回復しません。 これは、ディストリビューションの仮想ディスクファイル(.vhdxファイル)が動的にサイズを拡張する一方、仮想ディスク内のファイル削除をしてもファイルサイズを減らさないためです。
本記事では、仮想ディスクのファイルサイズを減らす方法を記載します。
仮想ディスクのファイルサイズを減らす方法
全て、管理者権限のPowerShellで操作します。
共通処理
-
以下のコマンドを実行し、WSL2の仮想ディスクファイルの場所を表示する
(レジストリから取得して表示)Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss
出力例
BasePathにext4.vhdxファイル(仮想ディスクファイル)があるHive: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss Name Property ---- -------- {a6991202-e6de-4062-abed-3b683 State : 1 7b246e4} DistributionName : Ubuntu Version : 2 BasePath : C:\Users\XXXX\AppData\Local\Packages\CanonicalGroupLimited.Ubuntuon Windows_79rhkp1fndgsc\LocalState Flags : 7 DefaultUid : 1000 PackageFamilyName : CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc KernelCommandLine : BOOT_IMAGE=/kernel init=/init DefaultEnvironment : {HOSTTYPE=x86_64, LANG=en_US.UTF-8, PATH=/usr/local/sbin:/usr/local /bin:/usr/sbin:/usr/bin:/sbin:/ bin:/usr/games:/usr/local/games, TERM=xterm-256color}
- 次のコマンドで対象のディストリビューションが停止していることを確認する
wsl -l -v
- 起動中のものがあれば停止する
終了直後はRunning
になっていることがあるため、少し待ってみる
次のコマンドは強制停止コマンドwsl --shutdown
Optimize-VHDによるファイルサイズの削減
次のコマンドを実行して仮想ディスクのファイルサイズを減らせます。
Optimize-VHD -Path <.vhdxファイルのフルパス> -Mode Full
ただし、Optimize-VHD
コマンドはWindowsの機能でHyper-Vが有効になっていないと利用できません。
diskpartによるファイルサイズの削減
Optimize-VHD
コマンドが有効になっていない場合は、こちらの方法で仮想ディスクのファイルサイズを減らせます。
diskpart
# diskpartが開始する
select vdisk file=".vhdxファイルのフルパス"
attach vdisk readonly
compact vdisk
detach vdisk
# diskpart終了
exit
Docker向けの作業
WSL2のディストリビューション内でDockerを使っている場合の追加作業です。
Dockerのディスク使用量確認
docker system df
不要なイメージの削除
次のコマンドを実行して、不要なイメージを削除します。
docker image prune
Dockerイメージのキャッシュの削除
Dockerはビルド時にイメージをキャッシュするため、ビルド時に使用されないイメージを削除することができます。
docker builder prune
この他にも不要なコンテナやボリュームの削除コマンドがあります。
実行結果
実際にdiskpartを実行した結果です。
実行前
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/02/22 16:37 temp
-a---- 2023/09/10 15:58 78635859968 ext4.vhdx
-a---l 2023/02/22 15:49 0 fsserver
diskpart実行後(docker image prune後)
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/02/22 16:37 temp
-a---- 2023/09/10 16:14 75848744960 ext4.vhdx
-a---l 2023/02/22 15:49 0 fsserver
diskpart実行後(docker builder prune後)
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/02/22 16:37 temp
-a---- 2023/09/10 16:26 26638024704 ext4.vhdx
-a---l 2023/02/22 15:49 0 fsserver