Skip to content

WSL 環境設定進階技巧

解決 WSL 與 Windows 環境整合時兩個常見問題:PATH 汙染與 DNS 解析失敗。

概述

WSL 2 預設與 Windows 主機深度整合,雖然方便,但在某些情境下會帶來干擾。最常見的兩個問題是:

  1. PATH 汙染:Windows 的 PATH 滲入 WSL 的 $PATH,導致 /mnt/c/Windows/... 等路徑充斥,可能造成同名指令衝突(如 pythongit)並拖慢 shell 啟動
  2. DNS 解析失敗:公司網路或 VPN 環境下,WSL 自動產生的 resolv.conf 所指向的 nameserver 無法正常使用

本文記錄這兩個問題的診斷方式與修復步驟。

核心內容

PATH 環境變數汙染

WSL 預設繼承 Windows host 的 PATH,使 $PATH 中出現大量 /mnt/c/ 開頭的路徑。

診斷指令:

bash
echo $PATH | tr ':' '\n' | grep '^/mnt/c/'

若有輸出即確認汙染存在。

方案 A:在 shell rc 中動態過濾(彈性大)

~/.zshrc(或 ~/.bashrc)末尾加入:

bash
export PATH=$(echo $PATH | tr ':' '\n' | grep -v '^/mnt/c/' | paste -sd:)

每次 shell 啟動時自動移除所有 /mnt/c/ 開頭的路徑。

注意: 啟用後將無法直接在 WSL 中呼叫 Windows 側的執行檔(如 codeexplorer.exe)。如有跨環境互通需求,可視情況調整或暫時註解。

方案 B:從 wsl.conf 全域停用 PATH 繼承

編輯 /etc/wsl.conf(影響整個 WSL 環境,非 per-shell):

ini
[interop]
appendWindowsPath = false

修改後需執行 wsl --shutdown 並重新開啟 WSL 才生效。


DNS 解析失敗

部分公司網路或 VPN 環境下,WSL 自動產生的 /etc/resolv.conf 所指 nameserver 無法使用,導致域名解析失敗。

修復步驟:

步驟 1 — 停用自動產生的 resolv.conf

編輯(或新建)/etc/wsl.conf

ini
[network]
generateResolvConf = false

步驟 2 — 手動建立 resolv.conf

刪除原有的 symlink,寫入可用的 DNS:

bash
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf

寫入公共 DNS 或公司內部 DNS:

text
nameserver 8.8.8.8
nameserver 8.8.4.4

步驟 3 — 重啟 WSL

在 Windows 端(PowerShell 或 CMD)執行:

powershell
wsl --shutdown

重新開啟 WSL 後即套用新設定。

參考: microsoft/WSL#5256

關鍵要點

  • Windows PATH 滲入是 WSL 的預設設計,需主動配置才能關閉
  • PATH 過濾可放在 shell rc(per-user,彈性大)或 wsl.conf(全域,影響所有使用者)
  • DNS 問題通常只在公司網路或 VPN 環境出現,找到可用 nameserver 是解決關鍵
  • 修改 wsl.conf 後,wsl --shutdown 是讓設定生效的必要步驟

實際應用

這兩項設定通常在以下情境觸發:

  • 新安裝 WSL 後發現 which pythonwhich git 指向 /mnt/c/... 路徑
  • 公司 VPN 連線後 WSL 無法 ping 外部域名
  • npm installpip install 卡住,無法連線至 registry

部署設定參考

以下為實際使用的設定內容,供日後查詢與複製使用。

環境參數

項目
PATH 過濾設定檔~/.zshrc~/.bashrc
DNS / PATH 全域設定檔/etc/wsl.conf
DNS 設定檔/etc/resolv.conf
建議 DNS8.8.8.88.8.4.4(或公司內部 DNS)

PATH 過濾(~/.zshrc 末尾)

bash
# 過濾 WSL $PATH 中的 Windows 路徑
export PATH=$(echo $PATH | tr ':' '\n' | grep -v '^/mnt/c/' | paste -sd:)

/etc/wsl.conf(DNS 修復)

ini
[network]
generateResolvConf = false

/etc/resolv.conf(手動 DNS)

text
nameserver 8.8.8.8
nameserver 8.8.4.4

操作指令

powershell
# 重啟 WSL,使 wsl.conf 變更生效(在 Windows PowerShell 執行)
wsl --shutdown

相關概念

來源