多くの人が 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 の起動時に自動的に更新されます: