WSL2の肥大化したvhdxを圧縮してCドライブ容量を空ける方法

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)の原因と対策まで分かりやすく解説します。

  1. この記事で行うこと
  2. 前提条件・対象読者
  3. 【結論】WSL2の仮想ディスクを安全に圧縮するコマンド
    1. 最も安全・確実なdiskpartによる圧縮手順
    2. 圧縮方法の比較早見表
  4. なぜWSL2のディスク(vhdx)は肥大化して縮まないのか(仮想ディスクの仕組み)
    1. 容量可変ディスクは「広がるが縮まない」
    2. 解放には「ホスト側からの圧縮処理」が必要
  5. 方法1:diskpartコマンドで手動圧縮する手順(最も安全・推奨)
    1. 手順1:Linux内部で不要ファイルを削除してTRIMを実行する
    2. 手順2:ext4.vhdx の保存場所(フルパス)を確認する
    3. 手順3:WSLを完全にシャットダウンする
    4. 手順4:diskpartで圧縮を実行する
  6. 方法2:wsl –manage コマンドを使う際のエラーと対処法
    1. 発生するエラー(Wsl/Service/E_INVALIDARG)
    2. なぜこのエラーが発生するのか?(Microsoftの安全保護機能)
    3. 強制実行フラグ(–allow-unsafe)の使い方とリスク
  7. 今後の肥大化を防ぐ設定(.wslconfigのsparseVhd設定について)
  8. 圧縮できない・容量が減らない場合の確認ポイント
    1. 1. Linux内部(ext4)の空き容量が本当に増えているか
    2. 2. WSLやバックグラウンドプロセスがディスクを掴んでいないか
    3. 3. Windowsホスト側のCドライブに作業用空き容量があるか
    4. 4. Hyper-Vが使えるエディション(Pro以上)の場合の代替コマンド
  9. 次に読むおすすめ記事
  10. 参考情報

この記事で行うこと

  • WSL2の仮想ディスク(ext4.vhdx)が自動で縮小しない理由と仕組みを理解する
  • Windows標準の diskpart を使って安全・確実に手動圧縮する(最も推奨される王道手順)
  • wsl --manage コマンドでスパース化を試みる際のエラー対処法(--allow-unsafe とデータ破損リスク)を把握する
  • 今後ディスクが肥大化しても自動で空き容量が解放される設定(sparseVhd)の注意点を理解する
  • 圧縮しても容量が減らない場合の事前クリーンアップ(fstrim やキャッシュ削除)を行う

前提条件・対象読者

  • 対象読者: WSL2やDockerを常用しており、Cドライブの容量不足に悩んでいる方
  • 対象OS: Windows 11 / Windows 10(バージョン2004以降)
  • 対象環境: WSL2(Windows Subsystem for Linux 2)
  • 必要権限: 管理者権限(Administrator)を持つWindowsアカウント
  • 動作確認: Windows 11 / WSL 2.x系(最終確認: 2026年9月)

作業にあたり、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つの大きな仮想ハードディスクファイルとして保存されています。このファイルには以下の特徴があります。

  • 初期状態では数GB程度の小さなファイルサイズで作成される
  • Linux内でファイルを追加したりパッケージをインストールすると、必要に応じて自動的にファイルサイズが拡大する
  • Linux内でファイルを削除しても、ext4ファイルシステム上で「空き領域」として記録されるだけで、外側のvhdxファイル自体のサイズは自動的に縮小されない

つまり、仮想ディスクは「一度最大まで広がると、中身が空っぽになっても外枠(コンテナ)のサイズは巨大なまま維持される」という性質を持っています。

解放には「ホスト側からの圧縮処理」が必要

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

各コマンドの解説:

  • select vdisk file="...": 先ほどコピーした ext4.vhdx のフルパスを指定して対象を選択します
  • attach vdisk readonly: 仮想ディスクを読み取り専用で一時的にマウントします
  • compact vdisk: 未使用領域を切り詰めてディスクサイズを圧縮します(数分かかる場合があります)
  • detach vdisk: マウントした仮想ディスクを安全に切り離します
  • exit: diskpartを終了します

「ディスクの最適化を完了しました」と表示されたら成功です。エクスプローラーで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が完全に停止していません。

以下の手順で確認します。

  1. wsl -l -v でステータスがすべて Stopped になっているか確認する
  2. Docker Desktopなどの常駐アプリがバックグラウンドで動いていないか確認し、起動している場合は一旦終了する
  3. それでも掴まれている場合は 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環境の構築手順まで体系的に把握したい方は、以下の完全ガイドもあわせて参考にしてください。

WSL2+Dockerで作るWindows開発環境構築まとめ
WindowsマシンでWeb開発やバックエンド開発、AIアプリ開発を行う際、いまや欠かせない標準構成となったのが「Windows + WSL2 + Docker + VS Code」の組み合わせです。かつては「Web開発といえばMac一択」…

参考情報