Windowsユーザーのための WSL2で始める Linux環境構築術 25

グローバルな設定ファイル「.wslconfig」でWSL2をチューニングしてみよう

第25回の今回は、WSL2の挙動をユーザーが調整できる設定ファイル「.wslconfig」を使ったWSL2のメモリやディスク容量の調整方法について解説します。

水野 源

6:30

はじめに

WSLを使い続けていると「WSLがメモリを使いすぎている」「WSLのメモリが足りない」「WSLのディスクが肥大化して困る」といった問題に遭遇することがありますが、実はこうしたWSLの挙動はユーザー側で調整できます。それを可能にするのが、WSL2上で実行されている全ディストリビューションに影響する、グローバルな設定ファイル「.wslconfig」です。今回は.wslconfigで設定できる項目や具体的な調整方法を解説します。

.wslconfigとは

.wslconfig は、Windowsのユーザーフォルダ(%USERPROFILE%)の直下に作成するテキストファイルです。なおデフォルト状態では存在しないので、テキストエディタを使って新規に作成しましょう。今回はWindows標準のメモ帳を使い、空のファイルに以下の名前を付けて保存しました。

C:¥Users¥<ユーザー名>¥.wslconfig
空のファイルをユーザーフォルダ内に.wslconfigという名前で作成した状態

以降では、ここに設定を書き込んでいきます。なお、.wslconfigはHyper-VのVMの挙動を変更する設定ファイルのため、VM上で動くWSL2のディストリビューションにのみ影響します。VM上で実行されないWSL1は対象外となる点に気をつけてください。

基本設定

まず、.wslconfigに記述できる設定値のうち、よく使うであろう基本的なものを解説しましょう。詳細は公式ドキュメントも合わせて参照してください。

memory

WSL2のVMに割り当てるメモリ量を指定します。デフォルトではWindowsの搭載メモリの50%がWSL2に割り当てられます。例えば、メモリが64GBのシステムでは、WSL2に32GBが割り当てられます。また、WSL2が使用したメモリは、解放後もすぐにWindows側へ返却されるとは限りません(後述するautoMemoryReclaimの影響を受けます)。そのため、実際に必要な容量まで明示的に制限するのも良いでしょう。

processors

WSL2のVMに割り当てるプロセッサ数を指定します。デフォルトではWindowsの論理プロセッサ数と同じ数が割り当てられます。プロセッサは使用した分だけ消費されるため、通常は変更する必要はありません。ただし、WSL2側で全プロセッサを使い切るような重い処理を行う場合は、割り当て数を制限するのも有効です。これにより、Windows側で使用するプロセッサを確保できます。

swap

WSL2のVMに追加されるスワップ容量を指定します。デフォルトでは、WSL2に割り当てたメモリ量の25%をGB単位に切り上げた値が設定されます。公式ドキュメントには「25% of memory size on Windows rounded up to the nearest GB」とありますが、ここでいうmemory sizeはホストの物理メモリではなく、WSL2に割り当てたメモリ量を指します。

例えば「memory」を2GBに設定し「swap」を未指定にした場合、2GBの25%である512MBが切り上げられ、スワップは1GBに設定されます。

localhostForwarding

Windows側から「localhost」経由でWSL2にアクセスできるかどうかを制御します。デフォルトは「true」です。第9回ではWindowsのWebブラウザから「http://localhost」でDocker内のnginxに接続しましたが、これはlocalhostForwardingが有効になっているためです。「false」に設定すると、この機能を無効化できます。

guiApplications

WSL2上にインストールしたLinux用のGUIアプリを、Windowsデスクトップ上でシームレスに動作させるWSLgを有効にするかどうかの設定です。デフォルトは「true」です。

第5回でGUIアプリを実行する例を紹介しましたが、これはguiApplicationsが有効になっているため可能でした。「false」に変更するとGUIアプリは「cannot open display」とだけ表示し、起動に失敗するようになります。

$ gedit

(gedit:374): Gtk-WARNING **: 10:09:45.675: cannot open display:

debugConsole

WSL2のインスタンス起動時に、dmesgの内容をコンソールへ出力するかどうかを制御します。デフォルトは「false」です。「true」に変更すると起動時にデバッグコンソールが開き、カーネルの起動ログが表示されます。

今回は詳しく触れませんが、.wslconfigでは使用するカーネルイメージを変更することも可能です。つまり、Microsoft提供のカーネルではなく、自分でビルドしたカスタムカーネルでWSL2を動かすこともできるのです。こうしたカーネルのデバッグを行う際には、debugConsoleを有効に活用してみてください。

debugConsoleを有効にした例

networkingMode

WSL2のネットワークモードを設定します。指定できる値は「none」「nat」「bridged(非推奨)」「mirrored」「virtioproxy」で、デフォルトは「nat」です。第22回では、GUIからネットワークモードを「mirrored」に変更しました。この操作を行うと、mirroredが設定された.wslconfigファイルが自動的に作成されます。「none」を指定すると、WSL2のネットワークは切断されます。

firewall

WindowsファイアウォールとHyper-Vトラフィック固有のルールを使用して、WSL2へのネットワークトラフィックをフィルターできるようにする機能です。デフォルトは「true」です。

defaultVhdSize

WSL2ではインスタンスごとに個別の仮想ディスクイメージが作成されます。defaultVhdSizeはその上限値を指定する設定で、デフォルトは「1099511627776(1TB)」です。つまり、各インスタンスは最大で1TBまでのデータを保持できます。

ただし、その分の容量はホスト側のストレージを消費します。例えば、512GBのSSDを搭載した環境では、WSL2上で空き容量があるように見えても先にホスト側の容量を使い切ってしまい、Windowsが正常に動作しなくなる可能性があります。そのため、defaultVhdSizeは「WSL2上で必要な容量を確保しつつ、仮に使い切ってもホストに影響が出ない範囲」に設定することを推奨します。

なお、WSL2のVHDXファイルは可変サイズのため、上限を1TBに設定しても作成直後に1TBの容量が消費されるわけではありません。defaultVhdSizeは、巨大なデータを書き込んでしまった場合に備えるための安全装置と考えると良いでしょう。

より高度な機能を使う

以降では、現時点で試験的な機能を紹介していきます。WSL2をより便利に使うための機能も含まれているため、興味があれば試してみると良いでしょう。

autoMemoryReclaim

WSL2が使用しなくなったキャッシュメモリを、自動的にWindowsへ返却する設定です。指定できる値は「disabled」「gradual」「dropCache」 で、デフォルトはdropCacheです。この設定では、キャッシュされたメモリが即座に回収されます。gradualを指定するとキャッシュメモリは徐々に回収されます。disabledに設定すると自動的なメモリ回収は行われません。

sparseVhd

スパース設定にはデータ破損のリスクがあります。まずは実験用の環境に限定して試してみてください

WSL2内でファイルを削除した際に、仮想ディスク(VHDX)のサイズを自動で縮小するかどうかを設定します。デフォルトは「false」です。

前述した通り、WSL2のVHDXは可変サイズのため初期状態では数GB程度しか使用しませんが、ファイルを書き込むにつれて徐々に肥大化していきます。ここで問題となるのは、WSL2内でファイルを削除しても、1度大きくなったVHDXのサイズは自動では小さくならない点です。

sparseVhdを「true」に設定すると、ファイル削除時に未使用領域が自動的に解放され、VHDXのサイズが縮小されるようになります。なお、この設定は有効化後に新規作成されたVHDXにのみ適用されます。既存のインスタンスに反映する場合は以下のコマンドを実行し、手動で設定してください。

$ wsl --manage ディストリビューション名 --set-sparse true --allow-unsafe

とは言ったものの、筆者の手元の環境で試してみたところ、VHDXの縮小を動かすことはできませんでした。まだ試験的な機能ということもあり、しばらく様子見が正解かもしれません。

具体的な.wslconfigの設定例

具体的な設定変更を行う前に、デフォルトの状態を確認しておきましょう。.wslconfigが空の状態でWSL2を起動し、「free」「df」「nproc」コマンドを実行した結果が下図です。この例では4コア・16GBメモリのマシンでWindowsを動かしているため、WSL2にはメモリの半分にあたる約7.7GiBが割り当てられています。スワップは、その25%(約 1.9GiB)を切り上げた2GiB が確保されています。

また、ルートファイルシステムの上限は1TB、論理CPU数はホストと同じ4コアであることが確認できます。

特に設定を行っていない状態のWSL2

それでは.wslconfigを記述して、WSL2に割り当てるリソースを調整してみましょう。

.wslconfigでは、基本的な設定を「[wsl2]」セクションラベル以下に、試験的な機能である「autoMemoryReclaim」「sparseVhd」を「[experimental]」セクションラベル以下に、それぞれ「キー=設定値」の形式で記述します。ここでは「WSL2に割り当てるメモリを2GB、CPUを 2コア、スワップを無効、さらにデフォルトのVHDXサイズを32GBに制限する」という基本的な設定を行いました。

[wsl2]
memory=2GB
processors=2
swap=0
defaultVhdSize=32GB

設定をファイルに保存したら、PowerShellで以下のコマンドを実行してWSL2を完全に停止させます。設定を確実に反映させるため、停止後は次に起動するまで約8秒ほど待つようにしてください。

$ wsl --shutdown

WSL2に「Ubuntu 24.04」を別名で新規インストールします。これは、新しく作成されるVHDXに指定したサイズが反映されていることを確認するためです(defaultVhdSize=32GBと設定しても、既存のVHDXがリサイズされるわけではありません)。

$ wsl --install -d Ubuntu-24.04 --name ubuntu-dev

WSL2を再起動したら、メモリ量やプロセッサ数を確認してみましょう。メモリ、スワップ、CPU数が設定どおりに変更されていることが分かります。また、新しくインストールした環境のため、32GBのVHDXが新規に作成されていることも確認できます。

設定を変更した後のWSL2の状態

おわりに

.wslconfigに設定を記述することで、WSL2が使うリソースを制限、あるいは拡張できます。自分のPCスペックや用途に合わせて、最適な数値を探ってみてください。

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored