WSL 2 複数インスタンス同一 IP アドレス

WSL 2 で複数の distribution (ここではこれを WSL の「インスタンス」と呼ぶことにします) を導入して同時に起動すると同じ IP アドレスを使うのです。ちょっと直感に反していたのでまとめておきます。

まず前提として WSL の複数インスタンスを使うという話ですが、wsl.exe の export/import 機能を使えば同じバージョン Ubuntu でも複数のインスタンスを作成できます。ここでは元々の名前の Ubuntu というインスタンスとそれを export/import して作った Hetarena というインスタンスがあるものとして説明します。

その 2つ、Ubuntu と Hetarena を同時に起動して ifconfig で IP アドレスを確認すると、あら不思議、同じ IP アドレスを持っています。さらに Ubuntu で Apache を起動して Hetarena で netstat で listening しているポートを確認すると、なんと 80/TCP をリッスンしているではないですか!

さらにさらに Ubuntu で mysql を起動して Hetarena から以下のコマンドを打ってみると何と接続できて Ubuntu のデータベースの内容を確認することができます。

mysql -u myid -D mydb -h 127.0.0.1 -p

ちなみにホスト指定を ‘-h localhost’ とすると Unix ソケット経由の接続を試みこれはエラーとなります。ファイルシステムは明らかにインスタンス毎に独立しているし、ps コマンドを打ってみても他方のプロセスが見えるということはなさそうです。

ググってみると関連した issue が見つかり、そこで関係者により以下のように説明されていました。

All of the WSL 2 distros run on the same virtual machine, which has a singular virtualized networking interface controller.

https://github.com/microsoft/WSL/issues/4304

「WSL 2 の複数ディストロは同一 VM 上で動作する」って訳してもチンプンカンプンになりそうですが、面白い実装ですね。