WSL 2 で Windows から Linux マシンをどう参照するか問題

WSL 2 に mysql や apache を入れて Windows のプログラムから接続したくなることがあります。さてどうしましょうか。

build 18950 以上であれば localhost 指定で OK

Windows 10 build 18950 以上であれば Windows のループバックアドレス (localhost) のポートから自動的に Linux マシンにポートフォワードしてくれます。ですので Linux で Apache を動かして Windows のブラウザから http://localhost/ と指定してアクセスすることができます。

参考記事: https://www.atmarkit.co.jp/ait/articles/1909/09/news020.html

生のアドレスでアクセスしたい時もある

ただ、Web アプリ関連でリダイレクト等が絡むと localhost を使った URL では動かないケースがあるようです。私もそのあたりが原因でハマりかけたので開発時は Linux マシンのアドレスを使ってアクセスしています。ここで困るのが Linux マシンの IP アドレスを固定できないことです。調べた限りでは方法がなさそうです。

そこで策として考えられるのが、Windows の hosts ファイルを Linux マシン起動後に更新してホスト名を固定する方法です。世の中にはこれを Windows サービス化された方がいらっしゃいます。

https://github.com/shayne/go-wsl2-host

私の場合はこれだけのためにサービスを増やすのも大ごとのように感じてしまい、以下のような簡単なスクリプトを作って WSL 起動後に Windows 管理者権限で実行しています。元々 hosts ファイルはいじっておらず空のままだったので完全に置き換える動作にしていますが、ちょっと変えれば静的レコード+動的レコードみたいな使い方もできると思います。ご参考まで。

Linux 側 IP アドレス表示スクリプト

$ cat /usr/local/bin/genhosts
#!/bin/sh
IP_ADDR=hostname -I
while read -r line; do
  echo $IP_ADDR $line
done < /usr/local/etc/wslhosts

Windows 側から参照したいホスト名を記述するファイル

hetarena.com 開発環境の例ですw

$ cat /usr/local/etc/wslhosts
hetarena-dev.com
en.hetarena-dev.com
ura.hetarena-dev.com

Windows 側スクリプトファイル

以下の内容の .cmd ファイルを作って WSL 起動後に管理者権限で実行します。

wsl.exe genhosts > C:\Windows\System32\drivers\etc\hosts 

すると以下のような hosts ファイルが生成されます。

172.27.43.123 hetarena-dev.com
172.27.43.123 en.hetarena-dev.com
172.27.43.123 ura.hetarena-dev.com

これで Windows ブラウザから http://hetarena-dev.com を参照したりすることができます。

その他

  • WSL 2 のファイルシステムを参照したいときは ‘\\WSL$\’ を Explorer から開けばよいですね。
  • 逆に Linux から Windows を参照する場合は “ホスト名.mshome.net” というホスト名が使用できます。

関連情報: WSL2 Set static ip? 
https://github.com/microsoft/WSL/issues/4210