針對適用於 Linux 的 Windows 子系統進行疑難排解

我們已涵蓋下列與 WSL 相關聯的一些常見疑難排解案例,但請考慮在 GitHub 上的 WSL 產品存放庫中搜尋所提出的問題。

提出問題、錯誤報告、功能要求

WSL 產品存放庫問題可讓您:

  • 搜尋現有的問題以利查看是否有任何與您遇到問題相關聯的問題。 請注意,在搜尋列中,您可以移除 "is:open",以包含已在搜尋中解決的問題。 請考慮留言或按讚,以表達您對推進作為優先事項的興趣。
  • 提出新的問題。 如果您發現 WSL 有問題,而且似乎不存在問題,您可以選取綠色的 [新增問題] 按鈕,然後選擇 [WSL - 錯誤報告]。 您必須包含問題的標題、您的 Windows 組建編號 (執行 cmd.exe /c ver 以查看您目前的組建 #)、無論您是執行 WSL 1 或 2、您目前的 Linux 核心版本 # (執行 wsl.exe --statuscat /proc/version)、發行版本的版本 # (執行 lsb_release -r),涉及的任何其他軟體版本、重現步驟、預期行為、實際行為,以及適當的診斷記錄。 如需詳細資訊,請參閱參與 WSL
  • 選取綠色的 [新增問題] 按鈕,然後選取 [功能要求]以提出功能要求。 您必須解決描述您要求的幾個問題。

您也可以:

安裝問題

  • 安裝失敗,發生錯誤 0x80070003

    • 適用於 Linux 的 Windows 子系統只會在您的系統磁碟機上執行 (通常是您的 C: 磁碟機)。 請確定發行版本儲存在您的系統磁碟機上:
    • 在 Windows 10 上開啟設定 ->系統 ->儲存空間 ->更多儲存空間設定:變更儲存新內容的位置在 C: 磁碟驅動器安裝應用程式的系統設定圖片 (Windows 10)
    • 在 Windows 11 上開啟設定 ->系統 ->儲存空間 ->進階儲存空間設定 ->儲存新內容的位置在 C: 磁碟驅動器安裝應用程式的系統設定圖片 (Windows 11)
  • WslRegisterDistribution 失敗,發生錯誤 0x8007019e

    • 未啟用適用於 Linux 的 Windows 子系統選用元件:
    • 開啟 [控制台] ->[程式和功能] ->[開啟或關閉 Windows 功能] ->勾選 [Windows 子系統 Linux 版],或使用本文開頭所述的 PowerShell Cmdlet。
  • 安裝失敗,發生錯誤 0x80070003 或錯誤0x80370102

    • 請確定已在電腦的 BIOS 內啟用虛擬化。 有關如何執行此操作的指示會因電腦而異,並且很可能與 CPU 相關。
    • WSL2 需要您的 CPU 支援第二層位址轉譯 (SLAT) 功能,此功能是在 Intel Nehalem 處理器 (Intel Core 1st Generation) 和 AMD Opteron 中引進的。 舊版 CPU (例如 Intel Core 2 Duo) 將無法執行 WSL2,即使虛擬機器平台已成功安裝也一樣。
  • 嘗試升級時發生錯誤Invalid command line option: wsl --set-version Ubuntu 2

    • 確定已啟用適用於 Linux 的 Windows 子系統,且使用的是 Windows 組建 18362 或更新版本。 若要啟用 WSL,請在具有系統管理員權限的 PowerShell 提示中執行此命令:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • 由於虛擬磁碟系統限制,所以要求的作業無法完成。 虛擬硬碟檔案必須是未壓縮和未加密的檔案,而且不得為疏鬆檔案。

    • 開啟 Linux 散發套件的設定檔資料夾,取消選取 [壓縮內容] (若已核取,同時取消選取 [加密內容])。 其應該位於 Windows 檔案系統上的資料夾中,如下所示:%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited...
    • 在此 Linux 散發版本設定檔中,應該會有 LocalState 資料夾。 在此資料夾上按一下滑鼠右鍵,以顯示選項的功能表。 選取 [屬性] > [進階],然後確定未選取 [壓縮內容以節省磁碟空間] 和 [加密內容以保護資料] 核取方塊 (未核取)。 如果系統詢問您是否僅將此套用到目前的資料夾或套用至所有子資料夾和檔案,請選取 [僅此資料夾],因為您只是清除壓縮旗標。 在此之後,wsl --set-version 命令應該能運作。

WSL 散發版本屬性設定的螢幕擷取畫面

注意

在我的案例中,我的 Ubuntu 18.04 散發套件的 LocalState 資料夾位於 C:\Users<my-user-name>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc

請檢查 WSL Docs GitHub 執行緒 #4103 (英文),其中會追蹤此問題是否有更新資訊。

  • 無法辨識 'wsl' 詞彙是否為 Cmdlet、函式、指令檔或可執行程式的名稱。

  • 錯誤:Windows 子系統 Linux 版沒有已安裝的發行版本。

    • 如果您在已安裝 WSL 散發套件之後收到此錯誤:
    1. 在從命令列叫用散發套件之前,至少執行一次。
    2. 檢查您是否正在執行個別的使用者帳戶。 採用提升權限執行主要使用者帳戶 (在管理員模式中) 不應該造成此錯誤,但您應該確定您不會意外執行 Windows 隨附的內建管理員 istrator 帳戶。 這是個別的使用者帳戶,設計上不會顯示任何已安裝的 WSL 散發套件。 如需詳細資訊,請參閱啟用和停用內建系統管理員帳戶
    3. WSL 可執行檔只會安裝到原生系統目錄。 當您在 64 位元 Windows 上執行 32 位元處理程序 (或在 ARM64 上執行任何非原生組合),裝載的非原生處理程序實際上會看到不同的 System32 資料夾。 (x64 Windows 上看到的 32 位元處理程序儲存在 \Windows\SysWOW64 的磁碟上。)您可以從裝載的處理程序存取「原生」system32,方法是查看虛擬資料夾:\Windows\sysnative。 它實際上不會出現在磁碟上,但檔案系統路徑解析程式會發現它。
  • 錯誤:此更新僅適用於具有 Windows 子系統 Linux 版的機器。

    • 若要安裝 Linux 核心更新 MSI 套件,需要 WSL,且應該先將其啟用。 如果失敗,則會看到下列訊息:This update only applies to machines with the Windows Subsystem for Linux
    • 會看到此訊息的三個可能原因:
    1. 您仍在使用舊版的 Windows,而該版本不支援 WSL 2。 如需版本需求和更新的連結,請參閱步驟 #2。

    2. WSL 未啟用。 您將需要返回步驟 #1,並確定已在您的機器上啟用選用的 WSL 功能。

    3. 啟用 WSL 之後,必須重新開機才會生效。請重新開機,然後再試一次。

  • 錯誤:WSL 2 需要更新其核心元件。 如需詳細資訊,請造訪 https://aka.ms/wsl2kernel

    • 如果 %SystemRoot%\system32\lxss\tools 資料夾中缺少 Linux 核心套件,您將會遇到此錯誤。 若要解決此問題,請在這些安裝指示的步驟 #4 中安裝 Linux 核心更新 MSI 套件。 您可能需要從 [新增或移除程式] 解除安裝 MSI,然後重新安裝。

常見問題

我已使用 Windows 10 1903 版,但還是沒有看到 WSL 2 的選項。

這很可能是因為您的電腦尚未取得 WSL 2 的反向修補。 若要解決此問題,最簡單的方式是前往 [Windows 設定],然後按一下 [檢查更新] 以在您的系統上安裝最新的更新。 請參閱取得反向修補的完整指示

如果您按 [檢查更新] 但仍未收到更新,則可以手動安裝 KB KB4566116

錯誤:0x1bc 發生於 wsl --set-default-version 2

當 [顯示語言] 或 [系統地區設定] 設定不是英文時,就可能發生這種情況。

wsl --set-default-version 2
Error: 0x1bc
For information on key differences with WSL 2 please visit https://aka.ms/wsl2

0x1bc 的實際錯誤是:

WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel

如需詳細資訊,請參閱問題 5749

無法從 Windows 存取 WSL 檔

9p 通訊協定檔案伺服器在 Linux 端提供服務,以允許 Windows 存取 Linux 檔案系統。 如果您無法使用 Windows 上的 \\wsl$ 存取 WSL,可能是因為 9P 未正確啟動。

若要加以檢查,您可以使用:dmesg |grep 9p 來檢查開機記錄,若會顯示任何錯誤。 成功的輸出如下所示:

[    0.363323] 9p: Installing v9fs 9p2000 file system support
[    0.363336] FS-Cache: Netfs '9p' registered for caching
[    0.398989] 9pnet: Installing 9P2000 support

如需此問題的進一步討論,請參閱此 GitHub 執行緒

無法啟動 WSL 2 發行版本,而且只會在輸出中看到 'WSL 2'

如果您的顯示語言不是英文,則可能會看到錯誤文字的截斷版本。

C:\Users\me>wsl
WSL 2

若要解決此問題,請造訪 https://aka.ms/wsl2kernel,並遵循該文件頁面上的指示手動安裝核心。

command not found 在 linux 中執行 Windows .exe 時

使用者可以直接從 Linux 執行 Windows 可執行檔,例如 notepad.exe。 有時候,您可能會遇到「找不到命令」,如下所示:

$ notepad.exe
-bash: notepad.exe: command not found

如果您的 $PATH 中沒有 Win32 路徑,interop 就會找不到 .exe。 您可藉由在 Linux 中執行 echo $PATH 來進行驗證。 您應該會在輸出中看到 Win32 路徑 (例如,/mnt/c/Windows)。 如果看不到任何 Windows 路徑,最有可能是您的路徑遭到您的 Linux shell 覆寫。

以下是 Debian 上的 /etc/profile 對問題造成貢獻的範例:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi

Debian 上的正確方式是移除上述幾行。 您也可以在如下所示的指派期間附加 $PATH,但這會導致一些其他 WSL 和 VSCode 的問題。

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:$PATH"
fi

如需詳細資訊,請參閱問題 5296 和問題 5779

「錯誤:0x80370102 無法啟動虛擬機器,因為未安裝必要的功能。」

請啟用虛擬機器平台 Windows 功能,並確定已在 BIOS 中啟用虛擬化。

  1. 檢查 Hyper-V 系統需求

  2. 如果您的機器是 VM,請手動啟用 巢狀虛擬化 。 使用系統管理員啟動 powershell,然後執行下列命令,並以主機系統上的虛擬機名稱取代 <VMName> (您可以在 Hyper-V 管理員中找到名稱):

    Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
    
  3. 請遵循電腦製造商的指導方針,了解如何啟用虛擬化。 一般而言,這可能會牽涉到使用系統 BIOS 來確保您的 CPU 上已啟用這些功能。 此程序的指示可能因電腦而異,請參閱 Bleeping Computer 的這篇文章中的範例。

  4. 啟用 Virtual Machine Platform 選用元件之後,請將您的電腦重新開機。

  5. 請確定您的開機設定中已啟用 Hypervisor 啟動。 您可以透過執行 (提升權限的 powershell) 來驗證這一點:

     bcdedit /enum | findstr -i hypervisorlaunchtype
    

    如果您看到 hypervisorlaunchtype Off,則會停用 Hypervisor。 若要在提升權限的 PowerShell 中啟用它:

     bcdedit /set hypervisorlaunchtype Auto
    
  6. 此外,如果您已安裝第三方 Hypervisor (例如 VMware 或 VirtualBox),請確定您有最新版本可支援 HyperV (VMware 15.5.5+VirtualBox 6+) 或已關閉。

  7. 如果您在 Azure 虛擬機器上收到此錯誤,請檢查以確定已停用可信啟動Azure 虛擬機器上不支援巢狀虛擬化

深入了解如何在虛擬機器中執行 Hyper-V 時設定巢狀虛擬化

WSL 在我的工作機器或企業環境中沒有網路連線

商務或企業環境可能會設定 Windows Defender 防火牆設定來封鎖未經授權的網路流量。 如果本機規則合併設定為「否」,則 WSL 網路功能預設將無法運作,而且您的系統管理員必須新增防火牆規則以允許它。

您可以遵循下列步驟來確認本機規則合併的設定:

Windows 防火牆設定螢幕快照

  1. 開啟「具有進階安全性的 Windows Defender 防火牆」(這與控制台中的「Windows Defender 防火牆」不同)
  2. 以滑鼠右鍵按一下 [本機電腦上具有進階安全性的 Windows Defender 防火牆] 索引標籤
  3. 選取 [內容]
  4. 在開啟的新視窗上選取 [公用設定檔] 索引標籤
  5. 在 [設定] 區段下選取 [自訂]
  6. 檢查開啟的 [自訂公用設定檔的設定] 視窗,以利查看 [規則合併] 是否設定為 [否]。 這會封鎖對 WSL 的存取。

您可以在設定 Hyper-V 防火牆中找到如何變更此防火牆設定的指示。

一旦連線到 VPN,WSL 就沒有網路連線能力

如果在連線到 Windows 上的 VPN 之後,bash 失去網路連線能力,請從 bash 內嘗試這個因應措施。 這個因應措施可讓您透過 /etc/resolv.conf 手動覆寫 DNS 解析。

  1. 記下 VPN 的 DNS 伺服器,使其無法執行 ipconfig.exe /all
  2. 建立現有 resolv.conf sudo cp /etc/resolv.conf /etc/resolv.conf.new 的複本
  3. 取消連結目前的 resolv.conf sudo unlink /etc/resolv.conf
  4. sudo mv /etc/resolv.conf.new /etc/resolv.conf
  5. 編輯 /etc/wsl.conf 並將此內容新增至檔案。 (如需此設定的詳細資訊,請參閱進階設定組態)
[network]
generateResolvConf=false
  1. 開啟 /etc/resolv.conf
    a. 從檔案中刪除第一行,其中包含描述自動產生之註解
    b. 將上述 (1) 中的 DNS 項目新增為 DNS 伺服器清單中的第一個項目。
    c. 關閉 檔案。

當您中斷連線 VPN 之後,您必須將變更還原為 /etc/resolv.conf。 若要這麼做,請執行:

  1. cd /etc
  2. sudo mv resolv.conf resolv.conf.new
  3. sudo ln -s ../run/resolvconf/resolv.conf resolv.conf

NAT 模式中的 WSL 發生 Cisco Anyconnect VPN 問題

Cisco AnyConnect VPN 會以防止 NAT 運作的方式修改路由。 WSL 2 有特定的因應措施:請參閱 Cisco AnyConnect Secure Mobility Client Administrator Guide 4.10 版 - 針對 AnyConnect 進行疑難排解

鏡像網路模式開啟時,VPN 的 WSL 連線問題

鏡像網路模式目前是 WSL 組態中的實驗性設定。 WSL 的傳統 NAT 網路架構可更新為稱為「鏡像網路模式」的全新網路模式。 當實驗 networkingMode 設定為 mirrored 時,您在 Windows 上的網路介面會鏡像到 Linux,以改善相容性。 在命令列部落格中深入了解:WSL 2023 年 9 月更新

某些 VPN 已經過測試,並確認與 WSL 不相容,包括:

  • "Bitdefender" version 26.0.2.1
  • "OpenVPN" version 2.6.501
  • 「Mcafee Safe Connect」2.16.1.124 版

在 WSL 中針對 HttpProxy 鏡像使用 autoProxy 時的考量

您可以使用 WSL 組態檔實驗區段中的 autoProxy 設定來設定 HTTP/S Proxy 鏡像。 套用此設定時,請注意下列考量:

  • PAC Proxy:WSL 會設定「WSL_PAC_URL」環境變數,在 Linux 中進行設定。 Linux 預設不支援 PAC Proxy。
  • 與 WSLENV 的互動:使用者定義的環境變數優先於此功能所指定的環境變數。

啟用時,下列內容會套用至 Linux 發行版本上的 Proxy 設定:

  • Linux 環境變數 HTTP_PROXY 會設定為 Windows HTTP Proxy 組態中所安裝的一或多個 HTTP Proxy。
  • Linux 環境變數 HTTPS_PROXY 會設定為 Windows HTTP Proxy 設定中所安裝的一或多個 HTTPS Proxy。
  • Linux 環境變數 NO_PROXY 會設定為略過 Windows 組態目標中找到的任何 HTTP/S Proxy。
  • 除了 WSL_PAC_URL 之外,每個環境變數都會設定為小寫和大寫。 例如:HTTP_PROXYhttp_proxy

在命令列部落格中深入了解:WSL 2023 年 9 月更新

DNS 通道的網路考量

當 WSL 無法連線到網際網路時,可能是因為 Windows 主機的 DNS 呼叫遭到封鎖。 這是因為 WSL VM 傳送至 Windows 主機的 DNS 網路封包遭到現有網路設定封鎖。 DNS 通道修正此問題,方法是使用虛擬化功能直接與 Windows 通訊,以允許解析 DNS 名稱,而不傳送網路封包。 這項功能應改善網路相容性,並可讓您取得更好的網際網路連線能力 (即使您有 VPN、特定防火牆設定或其他網路設定)。

您可以使用 WSL 組態檔實驗區段中的 dnsTunneling 設定來設定 DNS 通道。 套用此設定時,請注意下列考量:

  • 啟用 DNS 通道時,原生 Docker 在 WSL 中可能會發生連線問題 – 如果網路有封鎖 DNS 流量:8.8.8.8 的原則
  • 如果您使用 VPN 搭配 WSL,請開啟 DNS 通道。 許多 VPN 會使用 NRPT 原則,這些原則只會在啟用 DNS 通道時,套用至 WSL DNS 查詢。
  • Linux 散發套件中的 /etc/resolv.conf 檔案有 3 部 DNS 伺服器的最大限制,而 Windows 可能會使用超過 3 部 DNS 伺服器。 使用 DNS 通道可移除這項限制 – Linux 現在可以使用所有 Windows DNS 伺服器。
  • WSL 會依下列順序使用 Windows DNS 尾碼 (類似於 Windows DNS 用戶端所使用的順序):
    1. 全域 DNS 尾碼
    2. 補充 DNS 尾碼
    3. 個別介面 DNS 尾碼
    4. 如果在 Windows 上啟用 DNS 加密 (DoH、DoT),加密將會套用至來自 WSL 的 DNS 查詢。 如果使用者想要在 Linux 內啟用 DoH、DoT,則必須停用 DNS 通道。
  • 來自 Docker 容器的 DNS 查詢 (Docker Desktop 或 WSL 中執行的原生 Docker) 將會略過 DNS 通道。 無法運用 DNS 通道將主機 DNS 設定和原則套用至 Docker DNS 流量。
  • Docker Desktop 有其自己的方式 (不同於 DNS 通道),會將主機 DNS 設定和原則套用至來自 Docker 容器的 DNS 查詢。

在命令列部落格中深入了解:WSL 2023 年 9 月更新

引導 Windows 主機所接收的輸入流量導向 WSL 虛擬機器的問題

使用鏡像網路模式 (實驗 networkingMode 設定為 mirrored) 時,Windows 主機所接收的一些輸入流量永遠不會導向 Linux VM。 此流量如下所示:

  • UDP 連接埠 68 (DHCP)
  • TCP 連接埠 135 (DCE 端點解析)
  • UDP 連接埠 5353 (mDNS)
  • TCP 連接埠 1900 (UPnP)
  • TCP 連接埠 2869 (SSDP)
  • TCP 連接埠 5004 (RTP)
  • TCP 連接埠 3702 (WSD)
  • TCP 連接埠 5357 (WSD)
  • TCP 連接埠 5358 (WSD)

WSL 會在使用鏡像網路模式時,自動設定特定的 Linux 網路設定。 不支援使用鏡像網路模式時,這些設定的任何使用者設定。 以下是 WSL 將設定的設定清單:

設定名稱
https://sysctl-explorer.net/net/ipv4/accept_local/ Enabled (1)
https://sysctl-explorer.net/net/ipv4/route_localnet/ Enabled (1)
https://sysctl-explorer.net/net/ipv4/rp_filter/ Disabled (0)
https://sysctl-explorer.net/net/ipv6/accept_ra/ Disabled (0)
https://sysctl-explorer.net/net/ipv6/autoconf/ Disabled (0)
https://sysctl-explorer.net/net/ipv6/use_tempaddr/ Disabled (0)
addr_gen_mode Disabled (0)
disable_ipv6 Disabled (0)
https://sysctl-explorer.net/net/ipv4/arp_filter/ Enabled (1)

在預設網路命名空間下執行時,啟用鏡像網路模式的 WSL2 中 Docker 容器的問題

有一個已知問題,即無法建立具有已發行連接埠的 Docker Desktop 容器 (docker run –publish/-p)。 WSL 小組正與 Docker Desktop 小組合作,以解決此問題。 若要解決此問題,請在 Docker 容器中使用主機的網路命名空間。 透過「docker run」命令中使用的「--network host」選項來設定網路類型。 替代的解決方法是列出 WSL 組態檔中實驗區段ignoredPorts 設定中已發佈的連接埠號碼。

當其網路管理員正在執行時發生 Docker 容器問題

Docker 容器執行網路管理員服務時發生已知問題。 徵兆包括嘗試對主機進行回送連線時失敗。 建議停止網路管理員服務,讓 WSL 網路設定正確。

sudo systemctl disable network-manager.service

WSL 中的 DNS 後綴

根據 .wslconfig 檔案中的組態,WSL 會有下列行為 wrt DNS 後綴:

當 networkingMode 設定為 NAT 時:

案例 1) 預設不會在 Linux 中設定 DNS 後綴

案例 2) 如果已啟用 DNS 通道(dnsTunneling 在 .wslconfig 中設定為 true),則 Linux 中已設定所有 Windows DNS 後綴,在 /etc/resolv.conf 的 「搜尋」設定中

後綴會依下列順序以 /etc/resolv.conf 進行設定,類似於 Windows DNS 用戶端在解析名稱時嘗試後綴的順序:先全域 DNS 後綴,再補充 DNS 後綴,再依介面 DNS 後綴。

當 Windows DNS 後綴有所變更時,該變更會自動反映在 Linux 中

案例 3) 如果已停用 DNS 通道,且已停用 SharedAccess DNS Proxy(dnsTunneling 設定為 false,且 .wslconfig 中設定為 false)在 Linux 中設定單一 DNS 後綴,在 /etc/resolv.conf 的 「網域」設定中

當 Windows DNS 後綴有變更時,該變更不會反映在 Linux 中

在 Linux 中設定的單一 DNS 後綴是從個別介面 DNS 後綴中選擇的 (會忽略全域和補充後綴)

如果 Windows 有多個介面,則會使用啟發學習法來選擇將在 Linux 中設定的單一 DNS 後綴。 例如,如果 Windows 上有 VPN 介面,則會從該介面選擇後綴。 如果沒有 VPN 介面,則會從最有可能提供因特網連線的介面中選擇後綴。

當 networkingMode 設定為 Mirrored 時:

所有 Windows DNS 後綴都是在 Linux 中設定,在 /etc/resolv.conf 的 「搜尋」設定中

後綴是以 /etc/resolv.conf 設定,順序與 NAT 模式 2 相同

當 Windows DNS 後綴有所變更時,該變更會自動反映在 Linux 中

注意:您可以使用 SetInterfaceDns 在 Windows 中設定補充 DNS 後綴 設定 - Win32 應用程式 |Microsoft Learn,在 設定 參數中設定旗標DNS_SETTING_SUPPLEMENTAL_SEARCH_LIST

針對 WSL 中的 DNS 進行疑難解答

WSL 在 NAT 模式中啟動容器時的預設 DNS 設定是讓 Windows 主機上的 NAT 裝置做為 WSL 容器的 DNS 'server'。 當 DNS 查詢從 WSL 容器傳送至 Windows 主機上的 NAT 裝置時,DNS 封包會從 NAT 裝置轉送至主機上的共用存取服務;回應會以反向方向傳送回 WSL 容器。 此封包轉送程式需要防火牆規則,才能允許 HNS 服務所建立的輸入 DNS 封包,WSL 最初要求 HNS 為其 WSL 容器建立 NAT 虛擬網路。

由於此 NAT - 共用存取設計,有幾個已知設定可能會中斷 WSL 的名稱解析。

1.企業可以推送不允許本機定義的防火牆規則的原則,只允許企業原則定義的規則。

當企業設定此規則時,會忽略 HNS 建立的防火牆規則,因為它是本機定義的規則。 若要讓此組態運作,企業必須建立防火牆規則,以允許UDP埠53到共用存取服務,或WSL可以設定為使用 DNS 通道。 您可以執行下列命令,查看此設定為不允許本機定義的防火牆規則。 請注意,這會顯示所有 3 個配置檔的設定:網域、私人和公用。 如果在任何配置檔上設定,則如果 WSL vNIC 被指派給該配置檔,封包將會遭到封鎖(預設值為 Public)。 這隻是 Powershell 中傳回之第一個防火牆配置檔的代碼段:

PS C:\> Get-NetFirewallProfile -PolicyStore ActiveStore
Name                            : Domain
Enabled                         : True
DefaultInboundAction            : Block
DefaultOutboundAction           : Allow
AllowInboundRules               : True
AllowLocalFirewallRules         : False

AllowLocalFirewallRules:False means the locally defined firewall rules, like that by HNS, will not be applied or used.

2. And Enterprise 可以向下推送封鎖所有輸入規則的組策略和 MDM 原則設定。

這些設定會覆寫任何允許輸入防火牆規則。 因此,此設定會封鎖 HNS 建立的 UDP 防火牆規則,因此會防止 WSL 解析名稱。 若要讓此組態運作, 必須將 WSL 設定為使用 DNS 通道。 此設定一律會封鎖 NAT DNS Proxy。

從組策略:

計算機設定 \ 管理員 原則範本 \ 網络 \ 網络 \ 網络 連線 ions \ Windows Defender 防火牆 \ 網域配置檔 |標準配置檔

「Windows Defender 防火牆:不允許例外狀況」- 已啟用

從 MDM 原則:

./Vendor/MSFT/Firewall/MdmStore/PrivateProfile/Shielded

./Vendor/MSFT/Firewall/MdmStore/DomainProfile/Shielded

./Vendor/MSFT/Firewall/MdmStore/PublicProfile/Shielded

您可以執行下列命令來查看這是否設定為不允許任何輸入防火牆規則(請參閱上述防火牆配置檔注意事項)。 這隻是 Powershell 中傳回之第一個防火牆配置檔的代碼段:


PS C:\> Get-NetFirewallProfile -PolicyStore ActiveStore
Name                            : Domain
Enabled                         : True
DefaultInboundAction            : Block
DefaultOutboundAction           : Allow
AllowInboundRules               : False

AllowInboundRules: False means that no inbound Firewall rules will be applied.

3.使用者流覽 Windows 安全性 設定應用程式,並檢查控件是否有「封鎖所有連入連線,包括允許應用程式清單中的連線」。

Windows 支援使用者選擇加入上述 #2 中所參考企業版可套用的相同設定。 用戶可以開啟 [Windows 安全性] 設定頁面、選取 [防火牆和網络保護] 選項、選取他們想要設定的防火牆配置檔(網域、私人或公用),然後在 [連入連線] 底下,檢查標示為 [封鎖所有連入連線,包括允許應用程式清單中的聯機]。

如果這是針對公用配置檔設定的 (這是 WSL vNIC 的預設配置檔),則 HNS 所建立的防火牆規則將會封鎖 UDP 封包進行共用存取。

您必須取消核取NS Proxy 設定,才能從WSL運作, 或 WSL 設定為使用 DNS 通道。

4.允許 DNS 封包共用存取的 HNS 防火牆規則可能會變成無效,參考先前的 WSL 介面識別符。 這是 HNS 中已使用最新 Windows 11 版本修正的缺陷。 在舊版中,如果發生這種情況,則不容易探索,但它有簡單的解決方法:

  • 停止 WSL

    wsl.exe –shutdown

  • 刪除舊的 HNS 防火牆規則。 在大部分情況下,此 Powershell 命令應該可以運作:

    Get-NetFirewallRule -Name "HNS*" | Get-NetFirewallPortFilter | where Protocol -eq UDP | where LocalPort -eq 53 | Remove-NetFirewallRule

  • 拿掉所有 HNS 端點。 注意:如果使用 HNS 來管理其他容器,例如 MDAG 或 Windows 沙箱,也應該停止這些容器。

    hnsdiag.exe delete all

  • 重新啟動或重新啟動 HNS 服務

    Restart-Service hns

  • 重新啟動 WSL 時,HNS 會建立新的防火牆規則,正確地以 WSL 介面為目標。

針對 Windows 上的網路存取問題進行疑難解答

如果您沒有網路存取權,可能是因為設定錯誤。 請查看 FSE 驅動程式是否正在執行:『sc queryex FSE』。 如果這未顯示 FSE 執行中,請檢查 PortTrackerEnabledMode 登錄值是否在此登錄機碼下結束:reg 查詢 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters。 如果 FSE 未執行或安裝,且 PortTrackerEnabledMode 存在,請刪除該登錄值並重新啟動

手動刪除虛設配接器的方式

准刪除適配卡或虛設 隨插即用 (PnP) 裝置,是指出現在您系統中但未實際連線的硬體元件。 這些「准刪除」裝置可能會導致系統設定中的混淆和雜亂。 如果您在虛擬機 (VM) 中執行 WSL 時看到準刪除適配卡,請遵循這些手動步驟來尋找和刪除這些幻影 PnP 裝置。 Microsoft 正在處理不需要手動介入的自動化解決方案。 更多信息即將推出。

  1. 開啟 [裝置管理員]
  2. 檢視 > 顯示隱藏的裝置

裝置管理員 顯示隱藏裝置功能表的螢幕快照

  1. 開啟網路適配器

網路適配器清單的螢幕快照

  1. 以滑鼠右鍵按兩下准刪除網路適配器,然後選取 [ 卸載裝置]

以滑鼠右鍵按兩下網路清單中的虛設 pnp 並選取卸載裝置的螢幕快照

啟動 WSL,否則安裝散發套件會傳回錯誤代碼

請遵循指示,在 GitHub 上的 WSL 存放庫中收集 WSL 記錄,以收集詳細的記錄,並在 GitHub 上提出問題。

更新 WSL

適用於 Windows 子系統 Linux 版有兩個元件需要更新。

  1. 若要更新Windows 子系統 Linux 版本身,請使用 PowerShell 或 CMD 中的命令 wsl --update

  2. 若要更新特定的 Linux 發行版本使用者二進位檔案,在您要更新的 Linux 發行版本中,請使用命令:apt-get update | apt-get upgrade

Apt-get 升級錯誤

有些套件會使用我們尚未實作的功能。 例如,尚未支援 udev,而且會導致數個 apt-get upgrade 錯誤。

若要修正與 udev 相關的問題,請遵循下列步驟:

  1. 將下列程式碼寫入 /usr/sbin/policy-rc.d 並儲存您的變更。

    #!/bin/sh
    exit 101
    
  2. 將執行權限新增至 /usr/sbin/policy-rc.d

    chmod +x /usr/sbin/policy-rc.d
    
  3. 執行下列命令:

    dpkg-divert --local --rename --add /sbin/initctl
    ln -s /bin/true /sbin/initctl
    

安裝時發生「錯誤:0x80040306」

這與我們不支援舊版主控台的事實有關。 若要關閉舊版主控台:

  1. 開啟 cmd.exe
  2. 以滑鼠右鍵按一下標題列 [內容]>> 取消核取 [使用舊版主控台]
  3. 按一下 [檔案] > [新增] > [專案]

Windows 更新後出現「錯誤:0x80040154」

「適用於 Linux 的 Windows 子系統」功能可能會在 Windows 更新期間停用。 如果發生這種情況,則必須重新啟用 Windows 功能。 如需啟用「適用於 Linux 的 Windows 子系統」的指示,請參閱《手動安裝指南》。

變更顯示語言

WSL 安裝會嘗試自動變更 Ubuntu 地區設定,以符合 Windows 安裝的地區設定。 如果您不想要此行為,您可以執行此命令,以在安裝完成後變更 Ubuntu 地區設定。 您必須重新啟動 bash.exe,這個變更才會生效。

下列範例會將地區設定變更為 en-US

sudo update-locale LANG=en_US.UTF8

Windows 系統還原後的安裝問題

  1. 刪除 %windir%\System32\Tasks\Microsoft\Windows\Windows Subsystem for Linux 資料夾。
    注意:如果您的選用功能已完整安裝且正常運作,請勿這麼做。
  2. 啟用 WSL 選用功能 (如果尚未這麼做)
  3. 重新啟動
  4. lxrun /uninstall /full
  5. 安裝 bash

WSL 中沒有網際網路存取

某些使用者回報了特定防火牆應用程式在 WSL 中封鎖網際網路存取的問題。 回報的防火牆如下:

  1. Kaspersky
  2. 平均
  3. Avast
  4. Symantec Endpoint Protection

在某些情況下,關閉防火牆可讓您存取。 在某些情況下,只是安裝防火牆似乎會封鎖存取。

如果您使用的是 Microsoft Defender 防火牆,請取消核取「封鎖所有連入連線,包括允許的應用程式清單中的連線」以允許存取。

使用 ping 時發生權限遭拒錯誤

對於 Windows 年度更新版 (版本 1607),需要 Windows 中的系統管理員權限,才能在 WSL 中執行 ping。 若要執行 ping,請以系統管理員身分在 Windows 上的 Ubuntu 上執行 Bash,或從具有系統管理員權限的 CMD/PowerShell 提示字元執行 bash.exe。

對於較新版本的 Windows 組建 14926 +,不再需要系統管理員權限。

Bash 已停止回應

當您使用 bash 時,您會發現 bash 已停止回應 (或鎖死),而且沒有回應輸入,請收集和報告記憶體傾印,以協助我們診斷問題。 請注意,這些步驟將會損毀您的系統。 如果您不熟悉這個作業,或未在執行此動作之前儲存您的工作,請不要這麼做。

若要收集記憶體傾印

  1. 將記憶體傾印類型變更為「完成記憶體傾印」。 變更傾印類型時,請記下您目前的類型。

  2. 使用步驟以使用鍵盤控制項設定當機。

  3. 重現停止回應或鎖死。

  4. 使用 (2) 中的機碼序列來損毀系統。

  5. 系統會損毀並收集記憶體傾印。

  6. 系統重新開機之後,請將 memory.dmp 回報給 secure@microsoft.com。 傾印檔案的預設位置是 %SystemRoot%\memory.dmp or C:\Windows\memory.dmp (如果 C: 是系統磁碟機)。 在電子郵件中,請注意,傾印適用於 Windows 小組的 WSL 或 Bash。

  7. 將記憶體傾印類型還原為原始設定。

檢查您的組建編號

若要尋找您電腦的架構和 Windows 組建編號,請開啟
[設定]> [系統] > [關於]

尋找 [作業系統組建] 和 [系統類型] 欄位。
[組建] 和 [系統類型] 欄位的螢幕擷取畫面

若要尋找您的 Windows Server 組建編號,請在 PowerShell 中執行下列命令:

systeminfo | Select-String "^OS Name","^OS Version"

確認已啟用 WSL

您可以在 PowerShell 中執行下列命令,確認已啟用 Windows 子系統 Linux 版:

Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

OpenSSH-伺服器連線問題

嘗試連線 SSH 伺服器失敗,發生下列錯誤:「連線已由 127.0.0.1 連接埠 22 關閉」。。

  1. 請確定您的 OpenSSH 伺服器正在執行:

    sudo service ssh status
    

    您已遵循此教學課程:https://ubuntu.com/server/docs/service-openssh

  2. 停止 sshd 服務並以偵錯模式啟動 sshd:

    sudo service ssh stop
    sudo /usr/sbin/sshd -d
    
  3. 檢查啟動記錄,並確認 HostKeys 可供使用,而且您未看到記錄訊息,例如:

    debug1: sshd version OpenSSH_7.2, OpenSSL 1.0.2g  1 Mar 2016
    debug1: key_load_private: incorrect passphrase supplied to decrypt private key
    debug1: key_load_public: No such file or directory
    Could not load host key: /etc/ssh/ssh_host_rsa_key
    debug1: key_load_private: No such file or directory
    debug1: key_load_public: No such file or directory
    Could not load host key: /etc/ssh/ssh_host_dsa_key
    debug1: key_load_private: No such file or directory
    debug1: key_load_public: No such file or directory
    Could not load host key: /etc/ssh/ssh_host_ecdsa_key
    debug1: key_load_private: No such file or directory
    debug1: key_load_public: No such file or directory
    Could not load host key: /etc/ssh/ssh_host_ed25519_key
    

如果您看到這類訊息,而 /etc/ssh/ 底下遺漏了金鑰,您就必須重新產生金鑰,或只是清除及安裝 openssh-server:

sudo apt-get purge openssh-server
sudo apt-get install openssh-server

啟用 WSL 選用功能時「找不到參考的組件。」

此錯誤與安裝狀態錯誤有關。 請完成下列步驟以嘗試並修正此問題:

  • 如果您正在從 PowerShell 執行 [啟用 WSL 功能] 命令,請嘗試使用 GUI 代替,方法是開啟 [開始] 功能表,搜尋 [開啟或關閉 Windows 功能],然後在清單中選取 [適用於 Linux 的 Windows 子系統],這將會安裝選用元件。

  • 前往 [設定]、[更新],然後按一下 [檢查更新],以更新您的 Windows 版本。

  • 如果這兩種方法都失敗,而且您需要存取 WSL,請考慮使用安裝媒體重新安裝 Windows 以就地升級,並選取 [保留所有項目],確保您的應用程式和檔案都會保留下來。 您可以在重新安裝 Windows 10 頁面找到如何執行此動作的指示。

如果看到此錯誤:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/home/user/.ssh/private-key.pem' are too open.

若要修正此問題,請將下列內容附加至 /etc/wsl.conf 檔案:

[automount]
enabled = true
options = metadata,uid=1000,gid=1000,umask=0022

請注意,新增此命令將包含中繼資料,以及修改 WSL 中所見 Windows 檔案的檔案權限。 如需詳細資訊,請參閱檔案系統權限

無法在 Windows 上使用 OpenSSH,以利從遠端使用 WSL

如果您在 Windows 上使用 openssh-server 並嘗試從遠端存取 WSL,則許多人會看到此錯誤:

The file cannot be accessed by the system.

使用 WSL 的市集版本時,這是已知問題。 您可以使用 WSL 1,或使用 Windows 內部版本的 WSL 來解決此問題。 如需詳細資訊,請參閱 https://aka.ms/wslstoreinfo

在發行版本內執行 Windows 命令失敗

Microsoft Store 中的某些發行版本還不完全相容,無法開箱即用地執行 Windows 命令。 如果您在執行 powershell.exe /c start . 或任何其他 Windows 命令時收到錯誤 -bash: powershell.exe: command not found,您可以遵循下列步驟來解決此問題:

  1. 在您的 WSL 發行版本中執行 echo $PATH
    如果不包含:/mnt/c/Windows/system32,則會重新定義標準 PATH 變數。
  2. 使用 cat /etc/profile 檢查設定檔設定。
    如果其包含 PATH 變數的指派,請編輯檔案以使用 # 字元將 PATH 指派區塊註解排除。
  3. 檢查 wsl.conf 是否存在於 cat /etc/wsl.conf 並確定其不包含 appendWindowsPath=false,否則將其註解排除。
  4. 輸入 wsl -t 後面接著發行版本名稱,或在 cmd 或 PowerShell 中執行 wsl --shutdown,以重新啟動發行版本。

無法在安裝 WSL 2 之後開機

我們注意到一個會影響使用者的問題,那就是使用者在安裝 WSL 2 之後無法開機。 當我們完整地診斷這些問題時,使用者已回報變更緩衝區大小安裝正確的驅動程式 有助於解決此問題。 如需有關此問題的最新更新,請參閱此 GitHub 問題

停用 ICS 時發生 WSL 2 錯誤

網際網路連線共用 (ICS) 是 WSL 2 的必要元件。 主機網路服務 (HNS) 使用 ICS 服務來建立 WSL 2 所依賴的基礎虛擬網路,以利實現 NAT、DNS、DHCP 和主機連線共用。

停用 ICS 服務 (SharedAccess) 或透過群組原則停用 ICS 會防止建立 WSL HNS 網路。 建立新的 WSL 第 2 版映像時,這會導致失敗,而嘗試將第 1 版映像轉換成第 2 版時發生下列錯誤。

There are no more endpoints available from the endpoint mapper.

需要 WSL 2 的系統應該將 ICS 服務 (SharedAccess) 保留為預設的啟動狀態、手動 (觸發程式啟動),以及停用 ICS 的任何原則都應該受到覆寫或移除。 停用 ICS 服務會中斷 WSL 2,不建議停用 ICS,但可以使用這些指示將部分 ICS 停用

使用舊版 Windows 和 WSL

如果您執行舊版的 Windows 和 WSL,例如 Windows 10 Creators Update (2017 年 10 月、組建 16299) 或年度更新版 (2016 年 8 月,組建 14393),則有幾項差異。 我們建議您更新為最新的 Windows 版本,但如果不可能,我們已概述以下的一些差異。

互通性命令差異:

  • bash.exe 已取代為 wsl.exe。 Linux 命令可以從 Windows 命令提示字元或從 PowerShell 執行,但對於早期的 Windows 版本,您可能需要使用 bash 命令。 例如: C:\temp> bash -c "ls -la" 。 傳入 bash -c 的 WSL 命令會轉送至 WSL 程序,而不會進行修改。 檔案路徑必須以 WSL 格式指定,逸出相關字元時必須小心謹慎。 例如:C:\temp> bash -c "ls -la /proc/cpuinfo"C:\temp> bash -c "ls -la \"/mnt/c/Program Files\""
  • 若要查看哪些命令可用於特定的散發套件,請執行 [distro.exe] /?。 例如,使用 Ubuntu:C:\> ubuntu.exe /?
  • Windows 路徑包含在 WSL $PATH 中。
  • 從舊版 Windows 10 中的 WSL 發行版本呼叫 Windows 工具時,您將需要指定目錄路徑。 例如,若要從 WSL 命令列呼叫 Windows 記事本應用程式,請輸入:/mnt/c/Windows/System32/notepad.exe
  • 若要將預設使用者變更為 root,則在 PowerShell 中使用此命令:C:\> lxrun /setdefaultuser root,然後執行 Bash.exe 以登入:C:\> bash.exe。 使用散發套件密碼命令:$ passwd username 重設您的密碼,然後關閉 Linux 命令列:$ exit。 從 Windows 命令提示字元或 Powershell,將預設使用者重設回一般 Linux 使用者帳戶:C:\> lxrun.exe /setdefaultuser username

卸載舊版 WSL

如果您原本在 Creators 更新之前的 Windows 10 版本上安裝 WSL (2017 年 10 月,組建 16299),建議您將任何必要的檔案、資料等從您安裝的舊版 Linux 發行版本移轉至透過 Microsoft Store 安裝的較新發行版本。 若要從您的電腦移除舊版散發套件,請從命令列或 PowerShell 執行個體執行下列命令:wsl --unregister Legacy。 您也可以選擇使用 Windows 檔案總管 或 PowerShell:rm -Recurse $env:localappdata/lxss/,藉由刪除 %localappdata%\lxss\ 資料夾 (及其所有子內容) 來手動移除舊版散發套件。