解決 Win10 Wsl2 IP 變化問題(2021.2.10)

Hit不死的小強發表於2022-05-24

解決 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 啟動自動執行,方法一每次以管理員身份啟動不方便也不安全,所以筆者選擇了方法二。

  1. 開啟C:\Windows\System32\drivers\etc資料夾找到hosts檔案,右鍵選擇屬性,找到安全選項卡;

  2. 點選編輯找到當前使用者組,為其新增完全控制許可權;

  3. 點選確定,在彈出的提示框中選擇

  4. 此時當前使用者應該可以直接修改 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 服務進行測試。

  1. 在 Wsl2 中啟動服務;

    $ python -m http.server 8888
    Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:8888/) ...
    
  2. 在 Win10 下訪問ubuntu:8888

同理我們在 Win10 下啟用服務,在 Wsl2 內也可以通過win:port進行訪問(port表示服務埠)。

相關文章