解決 Win10 Wsl2 IP 變化問題(2021.2.10)
目錄- 解決 Win10 Wsl2 IP 變化問題(2021.2.10)
- 1. 產生環境
- 2. 問題描述
- 3. 解決思路
- 4. 實作程序
- 4.1 準備作業
- 4.2 撰寫腳本
- 4.3 設定自啟
- 4.4 測驗域名
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表示服務埠),
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480847.html
標籤:Windows
