多くの人が WSL を使用する際に、Windows ホストとの通信の問題に遭遇したことがあるでしょう。日常のプログラミングでは、WSL にデプロイされたデータベース、Web サービスなどに Windows からアクセスすることがよくあります。Windows 自体はマッピングを行いますが、次のコマンドを使用して HTTP サーバーを起動する場合:
➜ source git:(master) python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
この場合、Windows でlocalhost:8000
にアクセスすると正常に開くことができます。ただし、一部のシナリオ(データベース接続など)では、このマッピングが機能しなくなることがあります。おそらく、WSL はデフォルトで HTTP サービスのポートのみをマッピングしているためでしょうか?(疑問)
上記の問題を解決するために、WSL に簡単にアクセスできる手段が必要です。以下に 3 つの解決方法を示し、最後に私の解決策を詳しく説明します。
WSL のローカル IP を手動で検索し、その IP を使用してアクセスする#
この方法は非常にシンプルで直接的であり、WSL の IP を手動で見つけてアクセスするだけです。
WSL でifconfig
コマンドを実行すると、多くの出力が表示されます:
➜ source git:(master) ifconfig
.....
eth0: .......
inet 172.21.255.188 .....
.....
上記のinet
の後にある IP アドレスが WSL のローカル IP です。
ただし、WSL の IP は起動するたびに変化するため、頻繁に WSL にアクセスする場合はこの方法は適していません。
ポートマッピングを使用する#
HobaiRiku/wsl2-auto-portproxyを使用して、WSL 内のすべての TCP ポートを Windows の localhost にマッピングします(UDP は現在サポートされていません)。
この方法は、WSL にアクセスする必要がある場合に、バイナリファイルをダウンロードして実行するだけで、追加の操作は必要ありません。
WSL の IP を Windows の hosts ファイルに追加する#
先ほどの方法の欠点は、IP が起動するたびに変化することですが、これはドメイン名を思い出させます。
ドメイン名の解決は、まず hosts ファイルを検索し、見つからない場合に DNS を使用することはよく知られています。したがって、この方法は WSL の IP とカスタムドメイン名を Windows の hosts ファイルに追加し、アクセスする際には設定したドメイン名を使用するものです。
この要件から始まり、次の 2 つのアプローチが派生しました。
- このプロセスを Windows 上で完了する方法で、具体的な方法は、WSL で
ifconfig
を実行し、IP を正規表現でマッチングして取得し、それを hosts ファイルに書き込むカスタムタスクを WSL の起動イベントにバインドすることです。 - このプロセスを WSL 上で完了する方法で、具体的な方法は、起動時に自動的に実行されるスクリプトを追加し、そのスクリプトで任意の手段でローカル IP を取得し、それを /mnt/c/Windows/System32/drivers/etc/hosts に書き込むことです(Windows のドライブは自動的に WSL の /mnt 以下にマウントされます)。
アプローチ 1#
アプローチ 1 の核心はカスタムタスクですが、具体的なワークフローはさまざまな手段で実現できます。比較的簡単なのは、shayne/go-wsl2-hostです。このプロジェクトは、WSL の起動時にトリガーされるカスタムタスクを自動的に追加します。理論的にはインストールするだけで使用できるはずです(私の環境では正常に動作しなかったため、原因はわかりません)。
アプローチ 2#
アプローチ 2 は実装が少ないですが、過去には WSL には効果的な「起動時自動実行」の方法がありませんでした。しかし、WSL の systemd サポートにより、この障壁は消え去りました。したがって、私はこの方法を使用したプロジェクトを手作りしました。
このプロジェクトを使用するには、Arch Linux の場合:
- WSL が /mnt/c/Windows/System32/drivers/etc/hosts ファイルを正常に読み書きできることを確認します。
- リリースから.pkg.tar.zst ファイルをダウンロードし、
sudo pacman -U
でインストールします。 sudo systemctl enable --now wah.service
を使用してサービスを有効にします。
他のディストリビューションの場合、上記の 2 番目の手順を手動でインストールに置き換えるだけです:
install -D -m 755 $srcdir/wah $pkgdir/usr/bin/wah
install -D -m 755 $srcdir/wah.service $pkgdir/usr/lib/systemd/system/wah.service
install -D -m 755 $srcdir/domains $pkgdir/etc/wah/domains
その他の手順は完全に同じです。
このプロジェクトはデフォルトで arch.wsl というドメイン名を使用しますが、カスタマイズする場合は /etc/wah/domains ファイルを編集し、複数のカスタムドメイン名を使用する場合は単一のスペースで区切ってください。
このプロジェクトは、hosts ファイルの末尾に WSL のアドレスを自動的に追加し、WSL の起動時に自動的に更新されます: