WSL2のグローバル設定ファイル .wslconfigについて学んでみた。

WSL2の消費メモリについて気になったので、WSL2のグローバル設定ファイルである、`.wslconfig`について学んでみました。
2023.05.19

DA事業本部の横山です。

今回は、WSL2の設定ファイルである.wslconfigファイルの設定について学んでみました。 気になった設定項目や、注意点について記載したので参考にしてみてください。

はじめに

私は開発環境としてWSL2で立てたUbuntu-20.04を利用しており、基本的にはVSCodeのRemote Development拡張機能に含まれるWSL拡張機能を使って接続しています。(めちゃめちゃ便利です)

メモリ消費量等に関して気になることがあり、WSL2に関する設定について調べたのでまとめました。

WSL2の設定ファイルについて

WSL2の設定ファイルには2種類あり、wsl.conf.wslconfigが存在します。

  • .wslconfig
    • WSL2で実行されているすべてのインストール済みディストリビューションで設定をグローバルに構成します。
    • つまり、WSL2で立てている全てのディストリビューションの共通設定です
    • 共通設定なので、WSL2を立てている側であるWindows側に設定ファイルを置きます。
  • wsl.conf
    • WSL1 または WSL2 で実行されている Linuxディストリビューションのディストリビューションごとの設定を構成します。
    • つまり、各ディストリビューションごとの設定です。
    • 個別の設定なので、各ディストリビューションのインスタンス内に設定ファイルを置きます。

参考

.wslconfigファイルについて

  • %UserProfile%ディレクトリに格納されます。
    • つまり、C:\Users\\.wslconfigを作る必要があります
  • WSL2バージョンとして実行されているすべてのLinuxディストリビューションに対するグローバル設定です。
    • 複数のディストリビューションをインストールしている場合は影響があるため注意しましょう。
  • WSL2で実行されるディストリビューションのみに適用されます。
    • WSL1で実行しているディストリビューションは、仮想マシンとして実行されていないため設定内容が影響しません。
  • ファイルが見つからない場合や、形式が不正の場合、WSLは設定を適用せずに通常通り起動し続けます。
    • 設定ファイル内容が間違っている場合に、気が付きにくいので気を付けたいですね。

自分が立てているWSLのバージョンがわからない方は、コマンドプロンプトを開いてwsl -l -vでバージョンを確認しましょう。

C:\Users\yokoyama.takato>wsl -l -v
  NAME            STATE           VERSION
* Ubuntu          Stopped         2
  Ubuntu-20.04    Running         2

WSL1からWSL2にアップグレードする場合は、以下のリンクを参照してください。

.wslconfigファイルの設定内容について

注意 グローバル構成オプション .wslconfig は、Windows ビルド 19041 以降で WSL 2 として実行されているディストリビューションでのみ使用できます。 これらの変更を有効にするには、wsl --shutdown を実行して WSL 2 VM をシャットダウンしてから WSL インスタンスを再起動することが必要な場合があることに注意してください。

自分のWindowsビルド番号がわからない場合は、コマンドプロンプトを開いてverコマンドを叩いて確認しましょう。 以下の例では、19045がバージョンに当たります。

C:\Users\yokoyama.takato>ver

Microsoft Windows [Version 10.0.19045.2965]

.wslconfigに記載できる内容は以下のリンクに全て記載されています。 現在設定可能なものはすべて[wsl2]セクションに含まれるようです。

本記事では、私が気になったもののみを抜粋します。

memory

  • notes
    • WSL2のVMに割り当てられるメモリの量です。
  • default
    • Windows の合計メモリの 50% または 8 GB のどちらか少ない方。20175 より前のビルドでは、Windows の合計メモリの 80%
  • コメント
    • 20175ってInside Preview Build番号みたいなのですが、19045(22H2)はそれより後のビルドってことでいいんですかね?
    • Linuxでは、メモリ管理として空いているメモリががんがん buff/cacheに回されるのでWindows側が逼迫していきます。
    • いろいろなところでissueが上げられ、50% または 8GB のどちらか少ない方にdefault値が変更された模様。

processors

  • notes
    • WSL2 VMに割り当てる論理プロセッサの数
  • default
    • Windows上の同じ数の論理プロセッサ
  • コメント
    • もしもWSL2の利用でCPUが逼迫している方が居れば設定したほうがいいかも

swap

  • notes
    • WSL2 VMに追加するスワップ領域の大きさ。スワップファイルがない場合は 0。
  • default
    • Windowのメモリサイズの25%を、もっとも近いGBに切り上げた値
  • コメント
    • 後述するswapFileがWindows側のディレクトリを参照するため 0 にしました。

swapFile

  • notes
    • スワップファイルへの絶対パス。
  • default
    • %USERPROFILE%\AppData\Local\Temp\swap.vhdx
  • コメント
    • WSL2から、Windows上のファイル(/mnt/c/**)へのアクセスは遅いことが知られているため気になる

pageReporting

  • notes
    • 既定の true 設定により、Windows は WSL 2 仮想マシンに割り当てられた未使用のメモリを再利用できます
  • default
    • true
  • コメント
    • falseに設定すると、memoryに設定した値が固定で予約されてしまうという意味?

その他の注意点。

  • path 値を含むエントリでは、円記号をエスケープした Windowsパスを指定する必要がある。
    • 例: C:\\Temp\\myCustomKernel
  • size 値を含むエントリでは、サイズの後で単位を指定する必要があります。例: 8GB512MB
    • 例:memory: 8GB
  • 値型の後に * を持つエントリは、Windows 11でのみ使用できる。
    • 例:guiApplications

公式ドキュメントには、設定ファイル例も記載してあるため参考にしてみてください。

自分の設定内容について

今回、公式ドキュメントを読んで自分の環境では、.wslconfigを以下のように設定してみました。 Windows側のメモリが逼迫されることが減ってより快適に作業が行えるようになったと思っています。

~/.wslconfig

[wsl2]
memory=8GB
swap=0
processors=2

おわりに

WSL2のグローバル設定ファイルである、.wslconfigについて学んでみました。 別記事に、wsl.confについても記載しました。気になる方はご参照ください。

以上になります。この記事がどなたかの助けになれば幸いです。