
WSL2(Windows Subsystem for Linux 2)やDockerを使っていると、いつの間にかCドライブの空き容量が逼迫し、「ディスクの空き容量が不足しています」という警告が出て困った経験はないでしょうか。
Windowsのエクスプローラーで容量を確認すると、WSL2が利用している仮想ハードディスクファイル(ext4.vhdx)が数十GBから100GB以上に肥大化しているケースが非常によくあります。慌ててLinux側で不要なファイルやDockerイメージを削除しても、Windows側のファイルサイズはなぜか1バイトも減りません。
この記事では、肥大化したWSL2のvhdxファイルを圧縮してCドライブの空き容量を取り戻す手順を、安全・確実な diskpart による王道手順から、最新の wsl --manage コマンドで頻発するエラー(Wsl/Service/E_INVALIDARG / --allow-unsafe)の原因と対策まで分かりやすく解説します。
この記事で行うこと
前提条件・対象読者
作業にあたり、PowerShellまたはコマンドプロンプトを管理者権限で実行できる必要があります。
【結論】WSL2の仮想ディスクを安全に圧縮するコマンド
お急ぎの方向けに、最も安全かつ確実に容量を回収できる結論のコマンドをまとめました。
現在、WSLの最新バージョンではスパース化機能(自動縮小)にデータ破損リスクがあるためデフォルトで制限がかかっています。そのため、最も安全で全環境で確実に容量を削減できる王道の手順は diskpart による圧縮です。
最も安全・確実なdiskpartによる圧縮手順
管理者権限で開いたPowerShellで、以下の4ステップを実行します。
# 1. WSLを完全停止する
wsl --shutdown
# 2. diskpartツールを起動する
diskpart
DISKPART> プロンプトが表示されたら、以下を順番に実行します。
select vdisk file="C:\Users\<ユーザー名>\AppData\Local\Packages\...\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
これだけで、Linux内で削除済みの不要領域がWindowsのCドライブに確実に返還されます。
圧縮方法の比較早見表
| 圧縮方法 | メリット | 注意点・リスク | 推奨度 |
|---|---|---|---|
diskpart 手動圧縮 | 全Windows環境で動作、データ破損リスクがなく安全確実 | ext4.vhdx のパス指定が必要 | ★★★(最も推奨) |
Optimize-VHD(PowerShell) | 1行で完結、スクリプト化しやすい | Windows Pro以上(Hyper-V有効化)が必要 | ★★★(Pro環境向け) |
wsl --manage --set-sparse true | パス指定不要で手軽 | 最新WSLではデータ破損防止のためブロックされる(後述) | ★★☆(条件付き) |
なぜWSL2のディスク(vhdx)は肥大化して縮まないのか(仮想ディスクの仕組み)
Linux側で rm コマンドを使って大容量ファイルを削除したり、docker system prune で未使用イメージを一括削除したのに、なぜWindows側のCドライブ空き容量は増えないのでしょうか。その理由は、WSL2が採用している「容量可変仮想ハードディスク(Dynamically expanding VHDX)」の構造にあります。
容量可変ディスクは「広がるが縮まない」
WSL2のファイルシステム全体は、Windows上では ext4.vhdx という1つの大きな仮想ハードディスクファイルとして保存されています。このファイルには以下の特徴があります。
つまり、仮想ディスクは「一度最大まで広がると、中身が空っぽになっても外枠(コンテナ)のサイズは巨大なまま維持される」という性質を持っています。
解放には「ホスト側からの圧縮処理」が必要
Linux内で空いた領域をWindowsホストに返還するためには、外側の仮想ディスクに対して「未使用ブロックを切り詰めてサイズを縮小する(compact / shrink)」という明示的な圧縮処理を指示する必要があります。
方法1:diskpartコマンドで手動圧縮する手順(最も安全・推奨)
Windows 10 / 11の全環境で使え、データ破損リスクのない最も信頼性の高い方法が、Windows標準のディスク管理ツール diskpart を使った手動圧縮です。
手順1:Linux内部で不要ファイルを削除してTRIMを実行する
仮想ディスクを圧縮する前に、Linux内部で不要なファイルを削除し、ext4ファイルシステムとしての空き領域を広げておく必要があります。
WSL2のターミナル(Ubuntu等)を開き、以下のコマンドでディスク使用状況を確認します。
df -h /
使用率が高い場合は、不要なパッケージやDockerリソースをクリーンアップします。
# APTパッケージキャッシュのクリア
sudo apt clean
sudo apt autoremove -y
# Dockerの不要イメージ・コンテナ・ボリュームの一括削除
docker system prune -a --volumes -f
# ext4ファイルシステムの未使用ブロックを整理(TRIM)
sudo fstrim -av
最後の sudo fstrim -av を実行しておくことで、ファイルシステム内の解放済み領域がゼロクリアされ、Windows側の圧縮処理で効率よく容量が回収できるようになります。
手順2:ext4.vhdx の保存場所(フルパス)を確認する
diskpartに指定するため、圧縮対象の ext4.vhdx ファイルが保存されているパスを確認します。
標準的なUbuntu環境の場合、以下の場所に保存されています。
C:\Users\<ユーザー名>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu...\LocalState\ext4.vhdx
Docker Desktop(WSL2バックエンド)を利用している場合の保存パス:
C:\Users\<ユーザー名>\AppData\Local\Docker\wsl\data\ext4.vhdx
もしパスがわからない場合は、管理者権限のPowerShellで以下のコマンドを実行すれば自動検索できます。
Get-ChildItem -Path "$env:LOCALAPPDATA\Packages" -Filter "ext4.vhdx" -Recurse -ErrorAction SilentlyContinue | Select-Object FullName
見つかったフルパスをコピーしておきます。
手順3:WSLを完全にシャットダウンする
仮想ディスクファイルがWSLによって使用中(ロック状態)のままでは圧縮作業が行えません。
管理者権限で開いたPowerShellで以下のコマンドを実行し、WSLを停止します。
wsl --shutdown
wsl -l -v を実行し、すべてのディストリビューションの「STATE」が Stopped になっていることを確認してください。
手順4:diskpartで圧縮を実行する
管理者権限のPowerShellで diskpart を起動します。
diskpart
DISKPART> プロンプトが表示されたら、以下のコマンドを1行ずつ順番に入力していきます。
select vdisk file="C:\Users\<ユーザー名>\AppData\Local\Packages\...\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
各コマンドの解説:
「ディスクの最適化を完了しました」と表示されたら成功です。エクスプローラーでCドライブの空き容量を確認すると、数十GB単位で容量が回復しています。
方法2:wsl –manage コマンドを使う際のエラーと対処法
Windows 11および最新のストア版WSLには、ディストリビューション名を指定するだけでスパースVHD(自動縮小対応形式)に変換できる wsl --manage コマンドが用意されています。
しかし、実際に実行するとエラーが発生して実行できないケースが多発しています。その理由と対処法を解説します。
発生するエラー(Wsl/Service/E_INVALIDARG)
管理者権限のPowerShellで以下のコマンドを実行したとします。
wsl --manage Ubuntu --set-sparse true
すると、以下のようなメッセージが表示されて処理が中断される場合があります。
変換中です。これには数分かかる場合があります。
スパース VHD のサポートは、データの破損の可能性があるため、現在無効になっています。
ディストリビューションでスパース VHD を強制的に使用するには、次を実行してください。
wsl.exe --manage <DistributionName> --set-sparse true --allow-unsafe
エラー コード: Wsl/Service/E_INVALIDARG
なぜこのエラーが発生するのか?(Microsoftの安全保護機能)
このエラーが発生する理由は、WSLの特定バージョンにおいて、スパースVHD機能が原因でLinux側のext4ファイルシステムやWindows側のファイルが破損する重大な不具合がユーザーから多数報告されたためです。
Microsoftはユーザーのデータを守るためのセーフガード(安全装置)として、スパースVHDの有効化機能をデフォルトで意図的にブロック(無効化)しました。
強制実行フラグ(–allow-unsafe)の使い方とリスク
エラーメッセージに案内されている通り、--allow-unsafe オプションを付与することで強制的にスパース化を実行することは可能です。
# 強制的にスパースVHDを有効化するコマンド(リスクあり)
wsl.exe --manage Ubuntu --set-sparse true --allow-unsafe
ただし、オプション名に unsafe(安全ではない)と明記されている通り、ファイルシステムの破損リスクを伴う実験的機能です。
大切なソースコードやデータベース、業務データが保存されている環境では、このコマンドを無理に使用せず、前述の「方法1:diskpartコマンドで手動圧縮する手順」を利用することを強く推奨します。
どうしても --allow-unsafe を試す場合は、事前に必ず以下のコマンドでディストリビューションのバックアップを取得してから実行してください。
# バックアップ(エクスポート)の取得
wsl --export Ubuntu D:\backup\ubuntu_backup.tar
もしスパース設定を解除して通常形式に戻したい場合は、以下のコマンドを実行します。
wsl.exe --manage Ubuntu --set-sparse false
今後の肥大化を防ぐ設定(.wslconfigのsparseVhd設定について)
Windows 11の .wslconfig に sparseVhd=true を記述することで、今後作成するディストリビューションを自動縮小形式にする機能もあります。
ファイルの保存場所:
C:\Users\<ユーザー名>\.wslconfig
設定内容:
[experimental]
sparseVhd=true
ただし、これも前述の通り [experimental](実験的機能)の配下に位置づけられており、WSL本体のバージョンによっては安定性に課題が残る場合があります。
安定性を最優先にする場合は、この設定を無理に有効化せず、「不要なDockerイメージを定期的に docker system prune で削除し、半年に1回程度 diskpart で compact vdisk を実行する」という運用が実務上最もトラブルが少なく安全です。
圧縮できない・容量が減らない場合の確認ポイント
圧縮処理を実行したにもかかわらず「容量が減らない」「エラーになる」場合のトラブルシューティングです。
1. Linux内部(ext4)の空き容量が本当に増えているか
vhdxの圧縮は、ext4ファイルシステム上で「未使用」と認識されているブロックだけを切り詰める処理です。Linux側でファイルが残っている状態では、いくらcompactを実行してもサイズは縮小されません。
WSL内で df -h を実行し、使用可能容量(Avail)が十分に空いているか確認してください。
ファイルを削除した直後の場合は、Linuxターミナルで以下のTRIMコマンドを実行してからWindows側で圧縮を試みてください。
sudo fstrim -av
2. WSLやバックグラウンドプロセスがディスクを掴んでいないか
compact vdisk の実行時に「ファイルにアクセスできません」「別のプロセスが使用中です」といったエラーが発生する場合は、WSLが完全に停止していません。
以下の手順で確認します。
wsl -l -vでステータスがすべてStoppedになっているか確認する- Docker Desktopなどの常駐アプリがバックグラウンドで動いていないか確認し、起動している場合は一旦終了する
- それでも掴まれている場合は
wsl --shutdownを再実行するか、Windowsを一度再起動してから再度試す
3. Windowsホスト側のCドライブに作業用空き容量があるか
diskpartの圧縮処理では、内部動作として一時的な作業領域が必要になります。
Cドライブの空き容量が残り数百MBなど極端に枯渇していると、圧縮処理自体が失敗することがあります。その場合は、Windows側の一時ファイル(%TEMP%)や不要なファイルをあらかじめ数GB分削除し、一時的な空きを作ってから実行してください。
4. Hyper-Vが使えるエディション(Pro以上)の場合の代替コマンド
Windows 11 Pro / Enterprise環境をお使いでHyper-V機能が有効化されている場合は、PowerShell標準の Optimize-VHD コマンドを使うこともできます。
# WSLを停止
wsl --shutdown
# Optimize-VHDで圧縮(Hyper-Vモジュールが必要)
Optimize-VHD -Path "C:\Users\<ユーザー名>\AppData\Local\Packages\...\LocalState\ext4.vhdx" -Mode Full
diskpart と同様に安全・確実に圧縮でき、PowerShellスクリプトなどで自動化したい場合に便利です。
次に読むおすすめ記事
WSL2の初期セットアップから、今回解説したディスク・メモリ最適化設定、Docker環境の構築手順まで体系的に把握したい方は、以下の完全ガイドもあわせて参考にしてください。


