WSL2の設定ファイル wsl.confについて学んでみた。

WSL2の各ディストリビューションごとの設定ファイルである、`wsl.conf`について学んでみました。
2023.05.22

DA事業本部の横山です。

今回は、WSL2の各ディストリビューションごとの設定ファイルであるwsl.confファイルの設定について学んでみました。 気になった設定項目や、注意点について記載したので参考にしてみてください。

はじめに

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

WSL2のグローバル設定ファイルである、.wslconfigについては、下記の記事に記載したのでご参照ください。

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

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

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

参考

wsl.confファイルについて

  • unix ファイルとしてディストリビューションのディレクトリに格納されます。 /etc
  • ディストリビューションごとに設定を構成するために使用されます。 このファイルで構成された設定は、このファイルが格納されているディレクトリを含む特定の Linux ディストリビューションにのみ適用されます。
  • WSL 1 または WSL 2 のいずれかのバージョンで実行されるディストリビューションに使用できます。
  • インストールされているディストリビューションの /etc ディレクトリに移動するには、ディストリビューションのコマンド ラインで cd / を使ってルート ディレクトリにアクセスした後、ls でファイルの一覧を表示するか、Windows エクスプローラーで explorer.exe . を表示します。 ディレクトリ パスは、 のようになります /etc/wsl.conf。

つまり、各ディストリビューション内に/etc/wsl.confを作って起動時に読ませる必要があるということですね。Windows側からみると\\wsl.localhost\Ubuntu-20.04\etc\wsl.confに置く必要があります。

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

WSL は、これらのファイルの存在を検出し、内容を読み取り、WSL を起動するたびに構成設定を自動的に適用します。 ファイルが見つからないか、形式が正しくない (不適切なマークアップの書式設定) 場合、WSL は構成設定を適用せずに通常どおり起動し続けます。

正しい位置に正しい形式で配置できていない場合、デフォルト設定で起動するため間違いに気が付きにくい場合があるので気を付けましょう。

また、設定を変更した場合はWSLを再起動する必要があるためコマンドプロンプト等からwsl --shutdownを実行してください。 (このコマンドは、WSL上のすべてのディストリビューションを再起動するため注意が必要です)

wsl.confの構成設定

wsl.conf ファイルでは、 user, automount, network, interop の4つのセクションがサポートされています。

本記事では、気になったもののみ取り上げるため全ての設定内容については下記のリンクを参照してください。 そこまで項目数は多くないため一度目を通してみることをおすすめします。

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

systemdのサポート

さっそく上で上げたセクション以外の項目になりますが、WSLでは通常、systemdは有効化されておらずデーモンが起動されません。 (cronddockerデーモンも必要であれば自分で起動する必要がある。)

下記の設定を行うことで、より通常のLinuxディストリビューションに近い形で利用することができます。

/etc/wsl.conf

[boot]
systemd=true

自動マウント設定

セクションのラベル:[automount]

enabled

  • notes
    • true を指定すると、固定ドライブ (C:/ または D:/) が DrvFs で /mnt の下に自動的にマウントされます。 false を指定すると、ドライブは自動的にマウントされませんが、それでも手動または fstab を使ってマウントできます。
  • default
    • true
  • コメント
    • WSL内の/mnt/c/mnt/dにCドライブやDドライブがマウントされます。
    • マウントすることは問題ないですが、WSL → Windowsのファイルのアクセスは遅いため基本的には使わないほうが得策だと思います。

ネットワーク設定

セクションのラベル:[network]

generateHosts

  • notes
    • true にすると、/etc/hosts を生成するように WSL を設定します。 hosts ファイルには、IP アドレスに対応するホスト名の静的マップが含まれています。
  • default
    • true
  • コメント
    • WSL内の/etc/hostsファイルはデフォルト設定では、WSLによって自動生成されます。
    • /etc/hostsを手で書き換える場合は本設定をfalseにしておく必要があります。
    • このことは、WSL内の/etc/hostsファイル自体にも以下のように記載されています。

/etc/hosts

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false

generateResolvConf

  • notes
    • true にすると、/etc/resolv.conf を生成するように WSL を設定します。 resolv.conf には、指定されたホスト名をその IP アドレスに解決できる DNS リストが含まれています。
  • default
    • true
  • コメント
    • WSL内の/etc/resolv.confファイルはデフォルト設定では、WSLによって自動生成されます。
    • /etc/hostsを手で書き換える場合は本設定をfalseにしておく必要があります。
    • このことは、WSL内の/etc/resolv.confファイル自体にも以下のように記載されています。

/etc/hosts

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false

相互運用設定

セクションのラベル:[interop]

このセクションのオプションは、Insider Build 17713 以降で使用可能です。

appendWindowsPath

  • notes
    • このキーの設定により、WSL が Windows パス要素を $PATH 環境変数に追加するかどうかが決まります。
  • default
    • true
  • コメント
    • $PATHに、/mnt/c/Windows/system32, /mnt/c/Windows/System32/WindowsPowerShell/v1.0/といった値が追加されます。
    • 別項目でも触れましたが、WSL → Windowsへのアクセスは遅いため基本的には利用する必要はありません。
    • 設定をfalseにしても、VSCodeのエクスプローラーの機能である、「Explorer で表示」は動作します。
    • しかし、シェルで$ explorer.exe .等のコマンドは通らなくなるので注意してください。(それだけやりたい場合は、/mnt/c/windowsだけPATHに追加しましょう)

ユーザー設定

セクションのラベル:[user]

WSLセッション開始時のユーザー名を指定できるオプションが存在しますが、私は変更する予定がないため割愛します。

ブート設定

セクションのラベル:[boot]

このセクションのオプションは、Windows 11 および Server 2022 のみで使用可能です。

command

  • notes
    • WSL インスタンスの開始時に実行するコマンドの文字列。 このコマンドは、ルート ユーザーとして実行されます。 例: service docker start
  • default
    • ""
  • コメント
    • 筆者はWindows10環境なので利用できませんが、インスタンス起動時にrootユーザーで実行したいコマンドが存在する方には利用価値がありそうです。
    • 例であるデーモンの起動であれば、systemdの有効化をしてenabledで済みそうではあります。

自分の設定内容について

今回、公式ドキュメントを読んで自分の環境では、.wslconfigを以下のように設定してみました。 WindowsのPATHの追加をしない設定を行い、dockercrondを利用したい場合があるためsystemdの有効化を行いました。

/etc/wsl.conf

[interop]
appendWindowsPath = false

[boot]
systemd=true

おわりに

WSL2の各ディストリビューションごとの設定ファイルである、wsl.confについて学んでみました。 WSLへの理解が深まり、開発環境をより快適することができたと思います。

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