こんにちは、ダックスフントです。
WindowsPCでWSL上のDockerを使ってローカルLLMの検証をしていたところ、Cドライブの空き容量がカツカツになってしまいました。WSL内で不要なDockerイメージやモデルファイルを削除して整理したのですが、何度ファイルエクスプローラーを更新してもPC側のCドライブの空き容量がまったく変わりません。
調べてみると、WSL内でファイルを削除しただけでは、Windows側の空き容量は増えないという仕様があることが分かりました。「VHDXファイルの圧縮」という操作を実行することで、自分の場合は一気に50GBも空き容量ができました。
WSLやDockerを使っているPCでディスクの容量不足に悩んでいる方に役立てば、と思い手順を共有します。
TL;DR
WSL内のファイルを削除した後、PowerShellで diskpart を使ってVHDXファイルを圧縮する操作が必要。これをやらないと、削除した分の容量がWindowsPC側に戻ってこない。
なぜ削除してもCドライブが空かないのか
WSL(Windows Subsystem for Linux)のデータは、Windowsのファイルシステム上に .vhdx(仮想ディスクファイル)として保存されています。この仮想ディスクには少し厄介な性質があります。
- データが増えると自動で膨らむ — DockerイメージをダウンロードするたびにVHDXファイルのサイズが大きくなる
- データを消しても自動では縮まない — WSL内でファイルを削除すると仮想ディスク内に「空き」ができるだけで、VHDXファイル自体のサイズはそのまま
つまり、Windowsから見るとCドライブ上の .vhdx ファイルの占有量が変わらないため、空き容量も増えない、ということです。この.vhdx ファイルの「空き」を「圧縮」してWindowsに返してあげる操作が別途必要になります。
圧縮しても大丈夫?データは消えない?
圧縮してもデータは消えたりしません。VHDXファイルの圧縮は、ファイル内の「使われていない領域」を詰めるだけの操作であるため、WindowsPC内のファイルやWSL内のファイルが消えたり、壊れたりすることはありません。
手順中に attach(接続)・detach(切り離し)というコマンドが出てきますが、これは手順中にロックするためのコマンドであり、WindowsPCから接続が解除されたりするわけではありません。一方で、detach を忘れると仮想ディスクがロックされたままになってDockerが起動エラーになるので、detachコマンドを実行する最後の手順まで実施してください。
VHDXファイル圧縮手順
WSL内のファイル削除が終わった後に、以下の手順を実施します。
自分は、Dockerイメージの削除を実行後に実施しました。
1. DockerとWSLを完全に停止する
PowerShellを開き、以下を実行する
wsl --shutdown
2. VHDXファイルのパスを確認する
デフォルト設定であれば、以下のパスにファイルがあります。
C:\Users\【ユーザー名】\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu{バージョンや一意のIDなどが含まれる}\LocalState\ext4.vhdx
このパスは後続で使用するので、パスをコピーしておいてください。
3. diskpartで圧縮を実行する
PowerShellで以下を実行します(管理者権限の確認ダイアログが出たら「はい」を選択)。
diskpart
DISKPART> というプロンプトに変わったら、以下のコマンドを1行ずつ順番に実行します。
# 1. 仮想ディスクを選択(パスは先ほど確認したものに置き換えてください)
select vdisk file="C:\Users\【ユーザー名】\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu{バージョンや一意のIDなどが含まれる}\LocalState\ext4.vhdx"
# 2. 読み取り専用でアタッチする
attach vdisk readonly
# 3. 圧縮を実行する(数分かかる場合があります)
compact vdisk
# 4. デタッチする
detach vdisk
# 5. diskpartを終了する
exit
compact vdisk は数分かかる場合があります。完了したらファイルエクスプローラーでCドライブの空き容量を確認してみてください。削除したファイル分、Cドライブにも空き容量が出来ているはずです。
まとめ
WSL内でファイルを削除するだけではWindowsの空き容量は増えません。diskpart によるVHDXファイルの圧縮を忘れずに行うことで、削除した分がしっかりCドライブに返還されます。
WSLやDockerを頻繁に使う環境では、定期的に整理 → 圧縮をセットで行うことをおすすめします。