amtoaer

晓风残月

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

Windows 簡單訪問 WSL2

許多人在使用 WSL 時都遇到過與 Windows 主機通訊的問題。在日常編程中,常常需要在 Windows 中訪問部署在 WSL 中的數據庫、網站或其他服務。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 服務的端口?(存疑)

為了解決上述問題,我們需要一種方法來確保 Windows 主機可以輕鬆訪問 WSL。以下列舉了三種解決方法,並詳細描述了我的解決方案。

手動查找 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 IP 添加到 Windows 的 hosts 文件中#

剛剛提到的第一種方法的缺點是 IP 地址在每次啟動時都會變化,這讓我們想到了域名。

眾所周知,域名解析會先查找 hosts 文件,如果未找到才會使用 DNS,因此這種方法是將 WSL 的 IP 地址和自定義的域名添加到 Windows 的 hosts 文件中,訪問時只需訪問自己設定的域名。

實施思路類似於 DDNS 的 “本機 IP 變化,修改域名解析記錄”,需要做到 “WSL IP 變化,修改 hosts 文件”。我們知道 WSL IP 變化實際上就是指 WSL 啟動,因此最終需求變為:WSL 啟動時將 IP 寫入 Windows 的 hosts 文件

從這個需求開始,又衍生出了兩個思路:

  1. 在 Windows 上完成該過程,具體方法是為 WSL 啟動的事件綁定自定義任務,該任務通過在 WSL 中執行 ifconfig 並進行正則匹配來獲取 IP,然後將其寫入 hosts 文件中;
  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. 下載 release 中的 .pkg.tar.zst 文件並使用 sudo pacman -U 安裝;
  3. 使用 sudo systemctl enable --now wah.service 啟用服務。

對於其他發行版,只需將上述第二個流程替換為手動安裝:

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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。