适用于 Linux 的 Windows 子系统 (WSL) 在 Windows 和 Linux 之间提供双向互操作。 可以从Windows进程启动 Linux 命令、从 Linux shell 中运行Windows可执行文件、跨两个文件系统共享文件以及转发网络连接。 本页概述了关键互操作模式及其权衡。
Important
WSL 互操作要求安装 WSL,并且至少注册了一个 Linux 分发版。 不要假定存在 WSL — 始终在调用 wsl.exe 或访问 \\wsl$\ 路径之前进行检查。 在未安装 WSL 的系统上, wsl.exe 返回带有错误消息的非零退出代码,UNC \\wsl$\ 路径无法解析。
命令行互操作
从 Windows 运行 Linux 命令
在任何 Windows Shell(PowerShell、命令提示符或 Windows 终端)中使用 wsl.exe 来执行 Linux 命令:
# Run a single command in the default distribution
wsl ls -la /home
# Run a command in a specific distribution
wsl -d Ubuntu-22.04 -- cat /etc/os-release
# Pipe Windows output into a Linux command
ipconfig | wsl grep "IPv4"
从 Linux 运行Windows可执行文件
在 WSL shell 中,按其全名(包括.exe扩展)调用任何Windows可执行文件:
# Open File Explorer in the current Linux directory
explorer.exe .
# Run a PowerShell command from Linux
powershell.exe -Command "Get-Date"
# Pipe Linux output into a Windows command
cat /etc/hosts | clip.exe
注释
从 WSL 调用的 Windows 可执行文件使用 Windows 的 PATH 环境变量。 此 .exe 扩展是必需的 - 如果没有扩展,shell 会查找 Linux 二进制文件。
检测 WSL 是否可用
在应用或脚本中依赖 WSL 互操作之前,请检查可用性:
# PowerShell: Check if wsl.exe exists and WSL is functional
try {
$wslStatus = wsl --status 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Host "WSL is available"
} else {
Write-Host "WSL is installed but not functional"
}
} catch {
Write-Host "WSL is not installed"
}
// C#: Check WSL availability before use
var wslPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.System), "wsl.exe");
if (!File.Exists(wslPath))
{
// WSL is not installed — handle gracefully
return;
}
var process = Process.Start(new ProcessStartInfo
{
FileName = wslPath,
Arguments = "--status",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
}) ?? throw new InvalidOperationException("Failed to start wsl.exe process.");
process.WaitForExit();
if (process.ExitCode != 0)
{
// WSL is installed but no distribution is registered
}
文件系统互操作
从 Windows 访问 Linux 文件
使用 \\wsl$\(或 \\wsl.localhost\)UNC 路径从 Windows 访问 Linux 文件系统:
\\wsl$\Ubuntu-22.04\home\username\project
\\wsl.localhost\Ubuntu-22.04\home\username\project
Important
仅当 WSL 实例正在运行时,\\wsl$\ 路径才可用。 如果发行版已关闭,则该路径将无法解析。 先使用 wsl -d <distro-name> 启动发行版,或者使用 wsl.localhost,它可以在 Windows 11 上自动启动发行版。
从 Linux 访问Windows文件
默认情况下,Windows 驱动器挂载在 /mnt/ 下:
# Access C: drive
ls /mnt/c/Users/username/Documents
# Access D: drive
ls /mnt/d/projects
性能注意事项
| 操作 | Performance | Recommendation |
|---|---|---|
读取 Linux 文件的 Linux 进程(/home/...) |
快速(原生 ext4) | 在此处保留基于 Linux 的工具的项目文件 |
Windows 进程读取 Windows 文件(C:\...) |
Fast (本机 NTFS) | 在此处保留基于Windows的工具的项目文件 |
Linux 进程读取Windows文件 (/mnt/c/...) |
慢(跨文件系统 9P 协议) | 避免用于构建系统、node_modules、Git 仓库 |
Windows 进程读取 Linux 文件(\\wsl$\...) |
慢(跨文件系统 9P 协议) | 用于偶尔进行文件访问,而不是紧密循环 |
Tip
最常见的性能错误是在运行 Linux 生成工具(npm、cargo、make)时将项目文件存储在Windows文件系统(/mnt/c/...)上。 这会导致显著的 I/O 开销。 相反,在主要使用 Linux 工具时,将存储库克隆到 Linux 文件系统(~/projects/)。
路径转换
在 WSL 中使用 wslpath 在 Windows 和 Linux 路径之间进行转换:
# Windows path → Linux path
wslpath "C:\Users\username\file.txt"
# Output: /mnt/c/Users/username/file.txt
# Linux path → Windows path
wslpath -w /home/username/file.txt
# Output: \\wsl.localhost\Ubuntu-22.04\home\username\file.txt
# Linux path → Windows path (with drive letter format)
wslpath -m /mnt/c/Users/username/file.txt
# Output: C:/Users/username/file.txt
网络互操作性
Localhost 转发
默认情况下,WSL 2 会将端口从 Linux 来宾系统转发到 Windows 上的 localhost。 在 WSL 中通过 3000 端口运行的服务器可在 Windows 中通过 http://localhost:3000 访问。
注释
在大多数 Windows 版本中,从 Windows 到 WSL 的 localhost 转发会自动生效。 但是,从 WSL 连接到 Windows 上托管的服务器时,需要使用 Windows 主机 IP(在较旧的 WSL 配置中可使用 cat /etc/resolv.conf | grep nameserver 查找;如果启用了镜像网络,则可直接使用 localhost)。
镜像网络模式(Windows 11)
Windows 11(版本 22H2 及更高版本)支持镜像网络,其中 WSL 与Windows共享相同的网络堆栈。 在 .wslconfig 中启用它:
# %USERPROFILE%\.wslconfig
[wsl2]
networkingMode=mirrored
使用镜像模式:
- WSL 和Windows共享相同的 IP 地址
- 两者都可以在
localhost上双向访问服务 - Windows上的 VPN 连接在 WSL 中自动可用
- IPv6 在 WSL 中工作
环境变量共享
使用WSLENV变量将Windows环境变量传递给 WSL:
# Windows: Share GOPATH with WSL (translate the path)
$env:WSLENV = "GOPATH/p"
$env:GOPATH = "C:\Users\username\go"
wsl echo $GOPATH
# Output: /mnt/c/Users/username/go
该/p标志将Windows路径转换为 Linux 格式。 其他标志: /l (冒号分隔列表)、 /u (仅 WSL→Windows)、 /w (仅Windows→WSL)。
常见错误
Tip
LLM 和代码生成器经常生成的错误:
-
假设
\\wsl$\始终可访问 -- 路径仅在目标 WSL 分发运行时解析。 如果代码在未先启动发行版的情况下打开\\wsl$\路径,就会因网络路径错误而失败。 -
未对未安装 WSL 的情况进行处理 — 许多计算机(尤其是 Windows Server 或企业统一管理的 PC)都未安装 WSL。 请始终在使用前检查
wsl.exe是否存在。 -
将项目文件存储在错误的文件系统上 - 用于
/mnt/c/Linux 项目或\\wsl$\用于Windows项目会导致 9P 文件系统转换导致严重的 I/O 性能下降。 -
硬编码
/mnt/c/——挂载点可在/etc/wsl.conf中配置(通过[automount] root)。 使用wslpath进行可靠的路径转换。 -
从 WSL 调用 Windows 程序时忘记
.exe——notepad不行;你需要notepad.exe。 这是仅适用于 Windows 的文档中常见的复制粘贴错误。 -
假设网络拓扑 - WSL 2 默认(NAT)和镜像模式具有不同的网络行为。 在一台开发人员计算机上工作的代码可能会因其
.wslconfig设置而失败。 - 对 WSL 2 使用 WSL 1 假设 - WSL 1 共享Windows网络堆栈并具有直接文件系统访问权限。 WSL 2 使用具有虚拟网络适配器和 9P 文件共享的轻型 VM。 性能特征和网络不同。