アメリエフの技術ブログ

Amelieff Staff Blog

知らないと損する!肥大化したWSL2のディスク容量を解放し、Docker環境をクリーンに保つベストプラクティス

こんにちは、受託コンサルティングチームの nakagawam です。

今回は、私が直面した悲しい事件についてご紹介します。皆さんもご注意ください!!

はじめに:ある日突然、Cドライブが真っ赤になった話

快適な解析環境は、バイオインフォマティクス解析にとって生命線。 私も、Windows上でLinux環境をシームレスに利用できるWSL2(Windows Subsystem for Linux 2)とDockerの組み合わせで、ストレスフリーな解析ライフを送っていました。しかし、その平和は突然終わりを告げます。

快適だったはずのWSL2 + Docker開発環境

WSL2とDocker Desktopの連携は、もはやWindowsにおけるモダンな開発の「常識」と言っても過言ではないでしょう。 Windowsの使い慣れたUIと、Linuxの強力なコマンドラインツールやコンテナ技術が融合し、最高の開発体験を提供してくれます。 すべてがこの環境上で快適に進んでいました。

気が付けばWindowsの空き容量がゼロに…

そんなある日、ふとエクスプローラーに目をやると、見慣れたCドライブのバーが不吉な真っ赤に染まっていました。 空き容量、ほぼゼロ。あれほど快適だったPCの動作が、途端に重く感じられるようになりました。

「何か大きなファイルをダウンロードしただろうか?」

心当たりはありません。付け焼刃でたまったダウンロードフォルダのファイルを削除してみますが、解放される容量は雀の涙...。 しかし、現実に容量は逼迫しています。一体何が起きているのでしょうか?

犯人はWSL2の中にいる?

ストレージをみると、大部分を「インストールされているアプリ」の容量が占めています。 「何が原因なんだ..???」と調べると、「Ubuntu」の文字が。 すぐさまWSL2を起動し、 Dockerのお掃除 (docker system prune) で不要なデータを削除しますが、一向にディスク容量は解放されません...。

なぜ?WSL2のディスク容量が解放されない根本的な原因

WindowsとWSL2の間でディスク使用量の認識がズレてしまうのはなぜでしょうか。 その答えは、WSL2が利用する仮想ハードディスクの仕組みに隠されています。

Dockerイメージのビルドで何が起きていたのか

日々の開発で、私たちは頻繁にDockerイメージのビルドやコンテナの作成・破棄を繰り返します。 特に、ビルドの過程では、一時的な中間レイヤーが大量に生成されます。 これらのデータは、最終的には不要になるものも多いですが、その都度ディスクスペースを消費していきます。

docker build や docker pull を繰り返すことで、WSL2の仮想ディスク内には、知らず知らずのうちに大量のデータが書き込まれていたのです。

WSL2の仮想ハードディスク(ext4.vhdx)の仕組み

WSL2は、Linux環境全体を ext4.vhdx という単一の仮想ハードディスクファイルの中に格納しています。 このファイルは、Windowsのファイルシステム上(通常は C:\Users\[ユーザ名]\AppData\Local\...\LocalState のようなパス)に配置されています。

重要なのは、WSL2の仮想ディスクは、一度拡張されると、内部のファイル(Dockerイメージやコンテナなど)を削除しても、自動的には縮小(シュリンク)しないという点です。

風船を一度膨らませると、中の空気を抜いても風船自体は小さくならないのに似ています。 WSL2は、一度確保したディスク領域を「またいつか使うだろう」と保持し続けてしまうのです。

【対症療法】肥大化したWSL2の仮想ディスクを今すぐ解放する手順

まずは、今すぐ空き容量を取り戻すための対症療法を行いましょう。 以下の手順で、肥大化した仮想ディスクファイルを圧縮(最適化)できます。

Step 1: Dockerのお掃除 (docker system prune) で不要なデータを削除

最初に、WSL2の内部に溜まった不要なDockerオブジェクト(停止したコンテナ、未使用のネットワーク、古いイメージなど)をまとめて削除します。

WSL2のターミナルを開き、以下のコマンドを実行してください。

docker system prune -a --volumes

-a オプションは、使用中のコンテナに関連付けられていないすべてのイメージを削除します。 --volumes オプションは、未使用のボリュームも削除対象に含めます。

実行すると、削除されるデータの一覧が表示され、本当に実行してよいか確認を求められます。 y を入力してエンターキーを押しましょう。これで、仮想ディスク内部の「空気」が抜けました。

Step 2: WSL2を完全にシャットダウン (wsl --shutdown)

次に、仮想ディスクファイル(ext4.vhdx)のロックを解除するため、WSL2を完全に停止させる必要があります。

WindowsのコマンドプロンプトまたはPowerShellを開き、以下のコマンドを実行します。

wsl --shutdown

これにより、実行中のすべてのWSL2ディストリビューションがシャットダウンします。

Step 3: Windowsのdiskpartコマンドで仮想ディスクを最適化(圧縮)

いよいよ最後の仕上げです。Windows標準のディスク管理ツール diskpart を使って、.vhdx ファイルを最適化(圧縮)します。

diskpartを起動: コマンドプロンプトまたはPowerShellで、diskpart と入力して起動します。

仮想ディスクの選択: ext4.vhdx ファイルのフルパスを指定して、仮想ディスクを選択します。 パスは環境によって異なるので、事前にエクスプローラーで確認しておきましょう。

select vdisk file="C:\Users\[あなたのユーザー名]\AppData\Local\...\LocalState\ext4.vhdx"

仮想ディスクの圧縮: 選択した仮想ディスクを圧縮します。

compact vdisk

処理が完了するまでしばらく待ちます。「DiskPart で仮想ディスク ファイルが正常に圧縮されました。」と表示されれば成功です。 exit と入力して diskpart を終了します。

エクスプローラーでCドライブの空き容量を確認してみてください。見違えるほど空き容量が回復しているはずです!

【根治療法】WSLの立て直し(再インストール)

対症療法で一時的に容量は回復しますが、開発環境が複雑化している場合や、根本からクリーンな状態にしたい場合は、WSL環境を一度リセットする「根治療法」も有効です。

注意:この操作を行うと、WSL内のすべてのデータが消えます。必要なファイルは必ずバックアップしてください。

Step 1: WSLのアンインストール

Windowsの「設定」→「アプリ」→「インストールされているアプリ」から、お使いのディストリビューション(例: Ubuntu)を選択し、アンインストールします。

Step 2: ext4.vhdx を削除

念のため、アンインストール後も残っている可能性のある ext4.vhdx ファイルを手動で削除します。場所は前述の通り、AppData フォルダ内です。

Step 3: WSLを再インストール

Microsoft Storeや wsl --install コマンドを使って、WSLと好みのディストリビューションを再インストールします。 まっさらでクリーンな開発環境が手に入ります。

きれいになったWSL画面

もう二度と容量で悩まないためのベストプラクティス

毎回手動でディスクを圧縮するのは面倒です。 そこで、肥大化を未然に防ぎ、長期的に安定した環境を維持するためのベストプラクティスを紹介します。

.wslconfigで仮想ディスクの上限サイズを設定する

WSL2の動作をカスタマイズできる .wslconfig ファイルを作成し、ディスクの肥大化を抑制しましょう。 C:\Users[あなたのユーザー名]\ フォルダに .wslconfig という名前でファイルを作成し、以下のように記述します。

[wsl2]
memory=8GB          # WSL2に割り当てるメモリ上限(環境に合わせて調整)
processors=4        # 割り当てるCPUコア数(環境に合わせて調整)
autoMemoryReclaim=gradual # メモリの自動解放を有効化
defaultVhdSize=268,435,456,000      # VHDのサイズを指定 (250GB)

defaultVhdSize=268,435,456,000 これが今回のキーポイントです。 この設定により、VHDのサイズを指定することができます。

※ この設定はWSLのインストール時にしか反映されないので、再インストール前に設定しておく必要があります。

こまめな docker system prune の習慣化

結局のところ、最もシンプルで効果的なのは、不要なデータを溜め込まないことです。 「今日の作業終わり」や「週に一度」など、タイミングを決めて docker system prune を実行する習慣をつけましょう。

まとめ:WSL2とDockerと、上手く付き合っていくために

WSL2とDockerは、非常に強力なツールです。 しかし、その便利な仕組みの裏側にある「仕様」を理解していないと、今回のような思わぬトラブルに見舞われることがあります。

今回の学びと、これからの運用方針

  • WSL2のディスクは自動で縮小しない: これを常に念頭に置く。
  • .wslconfig は必ず設定する: defaultVhdSize は、もはや必須設定と言えるでしょう。
  • 定期的なお掃除はサボらない: docker system prune を習慣にし、クリーンな環境を維持する。

快適な解析ライフを取り戻そう! ディスク容量の問題は、バイオインフォマティクス解析のモチベーションを大きく削いでしまいます。 しかし、原因と対策がわかれば、もう恐れることはありません。 今回紹介した方法を実践し、WSL2とDockerの真のパワーを最大限に引き出して、快適で生産性の高いバイオインフォマティクスライフを送りましょう!

トレーニングキャンペーン