解決 Win10 Wsl2 IP 變化問題(2021.2.10)
Win10 Wsl2 的 IP 地址每次重啟後都會變化,如果經常需要在 Win10 訪問 Wsl2 內的服務的話會比較麻煩,因此筆者尋找一種解決方案並在此記錄。
1. 產生環境
- WSL2;
- Ubuntu 20.04 focal(on the Windows Subsystem for Linux);
2. 問題描述
Win10 WSL2 每次重啟後 IP 都會發生變化,經常在 Win10 和 WSL2 之間訪問網路的話比較麻煩。
3. 解決思路
方法一:固定 IP 地址,每次重啟後保持 IP 地址不變;
方法二:每次重啟後更新 hosts 檔案,通過域名來互相訪問;
經過調研,方法一實現起來比較複雜且不優雅,因此筆者選擇了採用方法二;目前網路上方法二大多數是通過 go-wsl2-host 專案來實現的,其原理是在 Win10 中新增服務自動更新 hosts 檔案,但因為筆者對 Win10 服務的編寫不太瞭解,所以受其啟發想到了另一種實現方法:編寫 Shell 指令碼在 Wsl2 啟動時自動更新 Win10 和 Wsl2 的 hosts 檔案。
4. 實現過程
4.1 準備工作
由於在 Wsl2 中沒有許可權操作 Win10 的 hosts 檔案,所以我們需要先解決該問題。
方法一:以管理員身份啟動 Wsl2;
方法二:為當前 Win10 使用者新增修改 hosts 檔案的許可權;
因為筆者打算將 Shell 指令碼設定成隨 Wsl2 啟動自動執行,方法一每次以管理員身份啟動不方便也不安全,所以筆者選擇了方法二。
-
開啟
C:\Windows\System32\drivers\etc
資料夾找到hosts
檔案,右鍵
選擇屬性
,找到安全
選項卡; -
點選
編輯
找到當前使用者組,為其新增完全控制
許可權; -
點選
確定
,在彈出的提示框中選擇是
; -
此時當前使用者應該可以直接修改 hosts 檔案了。
4.2 編寫指令碼
筆者對於 Shell 指令碼並不是很瞭解,因此指令碼還有待優化,如果你有更好的方法也歡迎評論留言。
#!/usr/bin/bash
# 為 win 設定 wsl host
# win hosts 檔案路徑
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 為 wsl2 設定的域名
wsl_domain="ubuntu"
# 獲取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
# 判斷是否已存在 wsl2 的域名,如果存在則修改,否則追加
if grep -wq "$wsl_domain" $win_hosts_path
then
# 此處因為許可權問題沒有直接用 sed 修改 hosts 檔案
win_hosts=$(sed -s "s/.* $wsl_domain/$wsl_ip $wsl_domain/g" $win_hosts_path)
echo "$win_hosts" > $win_hosts_path
else
echo "$wsl_ip $wsl_domain" >> $win_hosts_path
fi
# 為 wsl 設定 win host
wsl_hosts_path="/etc/hosts"
win_domain="win"
win_ip=$(cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}')
if grep -wq "$win_domain" $wsl_hosts_path
then
wsl_hosts=$(sed -s "s/.* $win_domain/$win_ip $win_domain/g" $wsl_hosts_path)
echo $wsl_hosts > $wsl_hosts_path
else
echo "$win_ip $win_domain" >> $wsl_hosts_path
fi
4.3 設定自啟
Linux 下設定指令碼自啟的方式有很多,此處不再詳細贅述,筆者選擇的是將指令碼內容新增到 Shell 的配置檔案中(較為簡單)。
4.4 測試域名
重啟 Wsl2 後域名應該就可以使用了,此處我們利用 Python 起一個簡單的 http 服務進行測試。
-
在 Wsl2 中啟動服務;
$ python -m http.server 8888 Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:8888/) ...
-
在 Win10 下訪問
ubuntu:8888
;
同理我們在 Win10 下啟用服務,在 Wsl2 內也可以通過win:port
進行訪問(port表示服務埠)。