檔案系統
WSL 2 有兩套檔案系統:Linux 自己的磁碟,以及掛進來的 Windows 磁碟。工具在哪邊跑,檔案就放哪邊,速度差會非常明顯。
專案放哪
在 Linux 終端機開發(git、npm、pip、編譯器)時:
/mnt/c 是 Windows 的 C:\。跨作業系統讀寫要經過轉譯層,git status、npm install 會變慢一個數量級。官方建議見 Working across file systems。
從 Windows 看 Linux 檔案,檔案總管位址列輸入:
或較新的:
在 Linux 裡開目前資料夾:
結尾的 . 代表「這裡」。也可以用 VS Code 的 WSL 擴充功能直接開 Linux 資料夾,見 VS Code。Windows 11 的檔案總管左側也有「Linux」項目,點進去就是各發行版的根目錄。
進階:為什麼 \\wsl.localhost 是網路路徑,而不是 Windows 裡的一般資料夾
WSL 2 的 Linux 檔案系統(ext4)裝在一顆虛擬硬碟裡,通常位於:
Windows 看不懂 ext4,無法把它當一般資料夾瀏覽。\\wsl.localhost\... 是 WSL 用 9P 檔案分享協定提供的路徑:檔案總管發出請求,由 Linux 端代為讀寫,再把結果傳回 Windows。
因此跨邊存取都比較慢:Windows 程式讀寫 \\wsl.localhost\...,或 Linux 讀寫 /mnt/c/...,都要經過這層轉譯。專案放 Linux 家目錄、用 Linux 端工具操作最快。
不要用 Windows 工具直接打開 ext4.vhdx,也不要改 WSL 1 時代 LocalState\rootfs 裡的檔案。這會繞過 Linux 的權限與中繼資料,可能損毀檔案。一律透過 \\wsl.localhost\ 存取。
大小寫
Windows 預設不區分大小寫(Foo.txt 與 foo.txt 常被當成同一個);Linux 區分。專案若同時被兩邊碰到,避免只靠大小寫區分檔名。需要時可為特定資料夾開啟大小寫區分,細節見官方「Adjust case sensitivity」。
兩邊的指令可以互叫
在 PowerShell 跑 Linux:
在 Ubuntu 跑 Windows 程式,檔名要加 .exe:
這叫 interop。不想讓 Linux 叫 Windows 程式時,可在 wsl.conf 關掉,見 組態檔。
環境變數若要在兩邊共享,使用特殊變數 WSLENV 列出要傳遞的名稱,並用 /p 等旗標轉換路徑格式。
官方短片
「在 WSL 裡如何存取電腦上的檔案」約 1 分 40 秒。
想理解 Windows 如何掛載 Linux 檔案,可看深度解析 How WSL accesses Linux files from Windows(約 25 分鐘),嵌入在 官方影音。