amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

Windows WSL2への簡単なアクセス

多くの人が 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 つのアプローチが派生しました。

  1. このプロセスを Windows 上で完了する方法で、具体的な方法は、WSL でifconfigを実行し、IP を正規表現でマッチングして取得し、それを hosts ファイルに書き込むカスタムタスクを WSL の起動イベントにバインドすることです。
  2. このプロセスを 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 の場合:

  1. WSL が /mnt/c/Windows/System32/drivers/etc/hosts ファイルを正常に読み書きできることを確認します。
  2. リリースから.pkg.tar.zst ファイルをダウンロードし、sudo pacman -Uでインストールします。
  3. 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 の起動時に自動的に更新されます:

image-20221129130815511

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。