共用方式為


Linux 的 Windows 子系統故障排除指南

本指南說明如何排除 WSL 問題並找出問題來源。

關於建築的簡短說明

為了幫助判斷問題的原因,我們必須找出它在堆疊中的位置。

當 Linux 二進位檔在 WSL 中被呼叫時,它(大致上)會經過以下幾層,每個層級可能就是錯誤的來源:

graph TD;
    id1["Linux binary in userspace"]-->id2["Linux distro"];
    id2["Linux distro"]-->id3["WSL's stack"];
    id4["WSL's stack"]-->id5["Physical hardware"];

我們會依序逐一分析這堆疊,並引導你判斷錯誤來源是否來自該區段。

Linux 二進位檔在用戶空間

首先我們需要確認這是不是 Linux 二進位檔本身造成的錯誤。 最簡單的方法是看看這個錯誤是否會在真實的 Linux 機器上重現(要麼是裸機,這是首選;要麼在 Hyper-V 上跑完整 Ubuntu,這樣比較比較就好)。 如果在真實 Linux 機器上也出現同樣錯誤,那我們就知道問題出在 Linux 二進位檔或發行版。

或者,你也可以執行這個 strace 指令來判斷發生了什麼事。 這個指令會顯示 Linux 二進位檔正在執行的 Linux 系統呼叫,你可以判斷它想存取什麼,以及可能在哪裡失敗。 本指南不會完整說明如何除錯 strace 堆疊(否則會太長),所以我們來看看一個範例:

使用者發現 WSL 指令 xeyes 在 WSL 中會當機,但在 Linux 機器上卻不會當機。 執行 strace xeyes 顯示指令在執行 openat 系統呼叫時卡住。 這表示 Linux 核心卡住嘗試執行 openat 呼叫,這意味著問題不在二進位檔本身。

如果問題在 Linux 二進位檔該怎麼辦

WSL 中存在的 Linux 二進位檔是由各自的擁有者提供,並非直接由 Microsoft 擁有。 如果你發現 Linux 二進位檔有問題,請直接向該二進位檔的擁有者回報。

Linux 發行版

有些錯誤也可能來自 Linux 發行版本身。 WSL 中的 Linux 發行版其實就是一堆 Linux 二進位檔,所以上述的故障排除步驟也適用。 然而,Linux 發行版負責像套件管理器這類關鍵體驗,這會大幅影響二進位檔之間的互動方式。

要排除問題,你會用前面提到的技術,看看這問題在 Linux 上是否重現,然後用來 strace 判斷故障的原因(或其他錯誤代碼),並嘗試判斷是否來自特定的 Linux 二進位檔。 如果那個二進位檔本身是發行版擁有的,那就是 Linux 發行版的問題。

如果問題出在 Linux 發行版該怎麼辦

類似於 Linux 二進位的故事,WSL 發行版是由各自的維護者提供。 請直接向受影響的 Linux 發行版提出問題。

WSL 的堆疊

接著,錯誤可能來自 WSL 邏輯本身。 如果問題在裸機 Linux 上無法重現,或是機器層級有故障,那這些問題就代表是 WSL 內部的問題。 以下是常見的故障路徑,以及如何找出故障並收集日誌:

WSL 啟動失敗或錯誤來自 wsl.exe

這裡最明顯的錯誤,是直接來自 wsl.exe 的錯誤,例如 這個 GitHub 問題。 此情況下,請收集重現該問題的 WSL 日誌 ,並將該問題存檔至 WSL GitHub 倉庫

WSL 當機

另一個常見錯誤是 WSL 卡住,無法回應任何指令。 在這種情況下,請 依照此程序回報 WSL 程序當機。 你可以透過開啟工作管理員 -> 處理程序 -> 右鍵點擊 VmmemWSL -> 建立記憶體傾印檔案,強制當機並收集轉存。 請包含此崩潰傾印,並在 WSL GitHub 倉庫提交一個問題。

網路錯誤

再次確認這不是 Linux 二進位檔的問題。 另外,如果可能的話,請試試那台機器上的 Hyper-V 虛擬機,確認這不是一般的虛擬化或 VPN 問題,看看是否有限制的網路功能。 如果這個問題只在 WSL 中持續存在,請在 WSL 的 GitHub 倉庫提出問題。

雜項問題

如果你遇到其他你認為與 WSL 有關的 WSL 錯誤,請 附上日誌 並存檔到 WSL GitHub 倉庫

深入探索 WSL 日誌

你可以打開WSL日誌來查看確切的錯誤。 要做到這點,請先安裝 Windows Performance Analyzer

然後,當你有 WSL 日誌(從 這些說明收集到)後,拿起已建立的 .zip 檔案並解壓縮。 打開產生的資料夾,尋找一個名為: logs.etl 的檔案,雙擊此檔案即可在 Windows 效能分析器中開啟。

應用程式開啟後,請執行以下步驟:

  1. 點擊系統活動以展開檢視
  2. 將頂端的「Generic Events」框拖曳到主視窗
  3. 找到「Microsoft.Windows.Lxss.Manager」系列,並點擊箭頭選擇

WinPerf分析器

從那裡,你可以查看WSL發出的所有診斷事件。 最引人注目的是一個叫做「VerboseLog」的,它將提供更詳細的錯誤位置及相關資訊。

其他資源

常見問題與解決方案可在 WSL 故障排除文件頁面找到,請參考相關問題。 也可以去 WSL 的 GitHub 倉庫或任何搜尋引擎搜尋這個問題或那裡的錯誤代碼,看看是否有人遇到同樣的問題。