WSL2 でファイルを消しても Windows のディスク容量が減らない(ext4.vhdx を縮小できない)
WSL2 の仮想ディスク ext4.vhdx は使った分だけ自動で拡張する一方、ファイルを削除しても自動では縮小しない。
sparse 設定か diskpart の compact vdisk で切り詰めれば空きが戻る。
公開:
要約
WSL2 の各ディストリビューションは、実体が ext4.vhdx という 1 個の仮想ディスクファイルである。
この vhdx は使用量に応じて自動で拡張するが、Linux 側でファイルを削除しても自動では縮小しない。
そのため「WSL の中は空けたのに Windows の C ドライブが空かない」という状態になる。
vhdx を sparse 化するか、diskpart で切り詰めれば空き容量が戻る(WSL のディスク管理の公式ドキュメント(新しいタブで開く))。
よくある原因
- vhdx の仕様: 拡張は自動、縮小は手動。
一度膨らんだ vhdx はそのままのサイズで残る。 - Docker の蓄積: WSL 統合の Docker はイメージやビルドキャッシュを WSL 内に貯めるため、気づかないうちに数十 GB 膨らむ。
- 場所が分からない: 縮小したくても、対象の vhdx ファイルがどこにあるか分からない。
解決策
1. まず Linux 側の不要データを消す
docker system prune -a
sudo apt cleanvhdx の切り詰めは「Linux 側で空いている領域」しか返せないため、先に中身を掃除しておく。
2. sparse VHD を有効にする(WSL 2.0 以降)
wsl --manage Ubuntu-24.04 --set-sparse truesparse 化すると、以後は未使用領域が自動的に Windows へ返るようになる。
ディストリビューション名は wsl -l -v で確認する。
3. diskpart で vhdx を切り詰める
wsl --shutdown
diskpartdiskpart のプロンプトで対象の vhdx を指定して compact する。
select vdisk file="C:\Users\<ユーザー名>\AppData\Local\Packages\<ディストリのパッケージ名>\LocalState\ext4.vhdx"
compact vdiskvhdx の場所は %LOCALAPPDATA%\Packages 配下の各ディストリビューションの LocalState フォルダにある。
WSL が完全に停止していないと失敗するため、必ず wsl --shutdown を先に実行する。
Docker Desktop を使っている場合は docker-desktop-data(または docker-desktop)側の vhdx も同様に肥大化するので、容量が戻らないときはそちらも確認する。