本文整理自 Microsoft Learn 的官方文档(
install/wsl-config/wsl-interop/filesystems四篇)、WSL 开源仓库的发布说明,以及 2026 年多篇开发者实践记录。命令、配置项名称、版本对应关系忠于官方口径;章节组织、选型建议、性能量级判断与评述为本文编辑归纳。适配 WSL 2.x(Store 版)与 Windows 11 22H2 及以上,数据截至 2026-10-03。
先说结论:WSL 的价值不在于"在 Windows 上跑 Linux",而在于消除开发环境与生产环境之间的语义差。
文件权限、路径大小写、shell 脚本行为、服务管理方式 —— 这些看起来琐碎的差异,恰恰是"在我机器上能跑"问题的根源。而 2026 年又多出来一层理由:AI 编程助手真正进入了终端工作流,而它们需要一个真实 shell、干净的 Node 运行时、可回溯的 Git 历史。WSL 恰好同时提供这三样,而且不用放弃 Windows 的桌面体验。
一、为什么 2026 年还需要 WSL
三个绕不开的现实:
1. 工具链的事实标准是 Linux。
Docker、Kubernetes、绝大多数 CI/CD 流水线、大部分 Python 科学计算栈、Node.js 生态的构建工具,在 Linux 上都是一等公民。在 Windows 原生环境跑,你要面对的是一层又一层的兼容补丁。
2. 传统虚拟机太重,双系统太麻烦。
VirtualBox / VMware 要划内存、要等启动、要处理共享文件夹;双系统要重启。WSL2 冷启动不到 1 秒,内存按需回收,文件系统双向互通。
3. AI 编程助手基本都优先适配 Linux。
这是近两年最实际的理由。Claude Code、Codex CLI 这类终端 Agent,官方推荐(或仅支持)的运行环境就是 WSL2。原因很直接:Agent 需要在真实 shell 里执行命令、跑构建、改文件,而 Linux 语义一致、脚本兼容性最好。OpenAI 到目前为止仍把 Windows 原生支持标注为实验性,明确建议在 WSL2 工作区里使用。
WSL2 的本质:跑在轻量级 Hyper-V 虚拟机里的真实 Linux 内核(微软自己维护的分支)。它不是模拟层,系统调用是真实的。这一点区分了 WSL2 与 WSL1(系统调用翻译层),也让 Docker、systemd、GPU 直通这些能力成为可能。
二、先理清概念:WSL1、WSL2 与 Store 版 WSL
这三个概念经常被混在一起。先看对照表:
| 维度 | WSL1 | WSL2 |
|---|---|---|
| 实现方式 | 系统调用翻译层(无虚拟机) | 轻量级虚拟机 + 真实 Linux 内核 |
| Linux 兼容性 | 部分系统调用不支持 | 完整 |
文件 I/O(跨系统 /mnt/c) | 快 | 慢(9P 协议开销) |
| 文件 I/O(Linux 内部) | 慢 | 快(ext4 原生) |
| systemd 支持 | 否 | 是 |
| Docker | 受限 | 原生支持 |
| GPU 直通(CUDA) | 否 | 是 |
| 内存占用 | 低(共享 Windows 内存) | 较高(虚拟机会预占) |
| 网络 | 直接共享 Windows 网络栈 | NAT(或 Windows 11 的 mirrored 模式) |
选型建议:除非有特殊的历史遗留需求,一律用 WSL2。现在 wsl --install 默认装的就是 WSL2。
2.1 “Store 版 WSL” 是什么
这是最容易被忽略的一点。WSL 有两个交付形态:
- Windows 内置组件版(inbox / legacy):随 Windows 更新走,更新频率低,功能滞后。
- Microsoft Store 版 WSL(2022 年后成为主推):独立升级包,支持 systemd、mirrored 网络、
wsl --update等新特性。
判断方法:在 PowerShell 里执行 wsl --version。
- 能打出版本号(如
WSL 版本: 2.x.x.x)→ 你用的是 Store 版,功能齐全。 - 打出的是帮助文本或报错 → 内置组件版,建议升级。
wsl --update # 更新到正式版
wsl --update --pre-release # 尝鲜预览特性(可能不稳定)
where.exe wsl # 确认实际解析路径
坑点:Store 版和内置版可能同时存在于系统里,
wsl.exe的实际解析路径决定你用的是哪个。Store 版通常安装在C:\Program Files\WSL\wsl.exe。
三、安装:四种路径
3.1 一键安装(推荐,覆盖 90% 场景)
前置条件:
- Windows 10 版本 2004 及以上(内部版本 19041+),或任意 Windows 11
- BIOS / UEFI 中已开启虚拟化(Intel VT-x / AMD-V)
检查虚拟化:任务管理器 → 性能 → CPU → 虚拟化,应显示"已启用"。
执行:
- 右键开始菜单 → 终端(管理员) 或 PowerShell(管理员)
- 执行:
wsl --install
这一条命令做了四件事:启用"适用于 Linux 的 Windows 子系统"可选组件、启用"虚拟机平台"可选组件、下载安装 WSL2 内核、下载并安装 Ubuntu(默认发行版)。
重启电脑(必须)
重启后 Ubuntu 窗口自动弹出,设置用户名和密码:
- 用户名:全小写,无空格
- 密码:输入时不回显(正常现象),记牢,
sudo要用
验证:
wsl --list --verbose
预期输出:
NAME STATE VERSION
* Ubuntu Running 2
看到 VERSION = 2 就对了。
3.2 指定其他发行版
wsl --list --online # 查看可选发行版
wsl --install -d Debian
wsl --install -d Ubuntu-24.04
wsl --install -d kali-linux
wsl --install -d openSUSE-Tumbleweed
发行版选择建议:
| 发行版 | 适用场景 |
|---|---|
| Ubuntu / Ubuntu-24.04 | 默认选择,生态最全,遇到问题最好搜答案 |
| Debian | 更稳定保守,与服务器环境一致性更好 |
| Kali Linux | 安全测试、渗透(不要当日常开发环境,预装工具太杂) |
| Arch Linux | 想折腾、要最新内核和软件包 |
| AlmaLinux / Oracle Linux | 需要 RHEL 系兼容性验证 |
3.3 离线 / 手动安装
适合两种情况:Windows 版本低于 2004;企业机器连不上 Microsoft Store。
第一步:启用组件(管理员 PowerShell)
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启电脑。
第二步:安装 WSL2 内核更新包
下载地址 https://aka.ms/wsl2kernel,双击 wsl_update_x64.msi 安装。
第三步:设置默认版本
wsl --set-default-version 2
第四步:安装发行版
- 商店方式:Microsoft Store 搜索 Ubuntu → 获取
- 命令方式:
wsl --install -d Ubuntu - 完全离线:从 GitHub Releases 下载
.wsl包或.appx,也可以从发行版官方渠道取 rootfs tar 后wsl --import
离线导入自定义发行版:
# 语法:wsl --import <新名称> <安装目录> <tar文件> --version 2
wsl --import MyUbuntu D:\WSL\MyUbuntu D:\downloads\ubuntu-rootfs.tar --version 2
# 注意:导入后默认用户会变回 root,需在 /etc/wsl.conf 中重新指定(见第五章)
3.4 国内网络加速
国内直连 wsl --install 经常卡在 0.0%。三个解法:
解法一:改用下载模式
wsl --install --web-download -d Ubuntu-24.04
跳过 Store 走 HTTPS 直链,通常能通。
解法二:给 WSL 配代理
WSL2 默认 NAT 模式下,WSL 内的 localhost 指向自己。若 Windows 侧代理监听 127.0.0.1:7890:
# 获取 Windows 主机 IP(NAT 模式)
export host_ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
export http_proxy="http://${host_ip}:7890"
export https_proxy="http://${host_ip}:7890"
若已在
.wslconfig中启用networkingMode=mirrored,WSL 与 Windows 共享网络栈,直接用127.0.0.1:7890即可。
解法三:APT 换国内源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# Ubuntu 24.04 使用新的 DEB822 格式
sudo tee /etc/apt/sources.list.d/ubuntu.sources > /dev/null <<'EOF'
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
sudo apt update && sudo apt upgrade -y
四、基础使用教程
4.1 命令参考
在 PowerShell / CMD 中执行(管理 WSL 本身):
wsl --install # 一键安装
wsl --list --online # 列出可安装的发行版
wsl --list --verbose # 列出已安装发行版及状态(简写 wsl -l -v)
wsl --list --running # 仅列出运行中的
wsl --set-default Ubuntu # 设置默认发行版(简写 wsl -s Ubuntu)
wsl --set-default-version 2 # 设置新装发行版的默认 WSL 版本
wsl --set-version Ubuntu 2 # 转换已有发行版版本
wsl --terminate Ubuntu # 终止指定发行版
wsl --shutdown # 关闭所有发行版与 WSL 虚拟机
wsl --update # 更新 WSL 组件
wsl --status # 查看状态、内核版本、默认配置
wsl --version # 打印版本信息
wsl --export Ubuntu D:\ubuntu-backup.tar # 导出备份
wsl --import MyUbuntu D:\WSL D:\ubuntu-backup.tar # 导入
wsl --unregister Ubuntu # 注销(删除)发行版 —— 危险,先导出
wsl --mount \\.\PHYSICALDRIVE1 --partition 1 # 挂载物理磁盘
跨发行版执行命令:
wsl -d Debian bash -lc "npm --version" # 在 Debian 中执行
wsl -d Ubuntu -u root # 以 root 进入 Ubuntu
在 WSL 内部执行:
exit # 退出 WSL 会话
cd / # 进入 Linux 根目录
explorer.exe . # 用资源管理器打开当前目录
code . # 用 VS Code 打开当前目录
4.2 多发行版并行管理
WSL 支持装多个互相隔离的发行版,每个的根文件系统都在独立 VHDX 文件中(位于 %LOCALAPPDATA%\Packages\ 下)。
实用模式:按项目隔离环境
wsl --install -d Ubuntu-24.04
# 导出后用新名字导入,得到一个可随时丢弃的独立环境
wsl --export Ubuntu-24.04 D:\tmp\proj-a.tar
wsl --import project-a D:\WSL\project-a D:\tmp\proj-a.tar --version 2
wsl --unregister Ubuntu-24.04
这样 project-a 就是一个可以随时 --unregister 重来的干净环境,非常适合作实验、跑不可信代码。
4.3 Windows Terminal 配置
建议用 Windows Terminal 作为宿主,而不是直接跑 Ubuntu 控制台窗口。理由:多标签、多窗格、可切换发行版、支持 GPU 渲染。
winget install --id Microsoft.WindowsTerminal --exact
推荐的 profile 片段(写入 settings.json 的 profiles.list 数组):
{
"name": "Ubuntu",
"source": "Windows.Terminal.Wsl",
"hidden": false,
"colorScheme": "One Half Dark",
"font": { "face": "Cascadia Code NF", "size": 11 },
"startingDirectory": "//wsl.localhost/Ubuntu/home/YOURNAME",
"useAcrylic": true,
"acrylicOpacity": 0.9
}
Cascadia Code NF是带 Nerd Font 图标的版本,配合下文的 Powerlevel10k 主题使用,否则提示符会显示方块。
4.4 Shell 环境美化
默认 bash 够用,但 zsh + Oh My Zsh + Powerlevel10k 的提示符能显示 Git 状态、退出码、执行时间,日常效率提升明显。
sudo apt update && sudo apt install -y zsh git curl
# Oh My Zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# Powerlevel10k 主题
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# 两个必备插件
git clone https://github.com/zsh-users/zsh-autosuggestions \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting \
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
在 ~/.zshrc 中设置:
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
重开终端后按向导配置即可。
4.5 现代化 CLI 工具
sudo apt install -y ripgrep fd-find bat fzf jq eza tree htop ncdu
| 命令 | 替代 | 用途 |
|---|---|---|
rg | grep | 极速文本搜索(自动忽略 .gitignore) |
fdfind | find | 更简洁的文件查找 |
batcat | cat | 带语法高亮与行号的 cat |
fzf | — | 交互式模糊查找,可接管道 |
jq | — | JSON 处理与格式化 |
eza | ls | 带图标、Git 状态、树形视图 |
ncdu | du | 交互式磁盘占用分析 |
注意包名与命令名不一致:Ubuntu 上
fd-find包安装后的命令是fdfind,bat包安装后是batcat。加个别名更顺手:
echo 'alias fd=fdfind' >> ~/.zshrc
echo 'alias bat=batcat' >> ~/.zshrc
4.6 Git 配置
重点:不要在 WSL 里沿用 Windows 侧的 Git 配置。 行尾符、权限模型都不同。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global core.autocrlf input # 关键:写入时统一为 LF
git config --global core.fileMode true # Linux 下保留文件权限位
# 在 WSL 内生成 SSH 密钥,权限模型才正确
ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub # 复制到 GitHub / GitLab
ssh -T git@github.com # 验证
要不要让 Windows 侧也能用同一套密钥? 两种做法:
- 简单方案:把 WSL 的密钥复制到 Windows 侧(
cp ~/.ssh/id_ed25519 /mnt/c/Users/你/.ssh/),并在 Windows 侧设置core.fileMode false。 - 干净方案:两侧各生成一套密钥,各自添加到 Git 托管平台。推荐这个,避免权限混乱。
五、配置文件:.wslconfig 与 wsl.conf
这两个文件最容易搞混。一句话区分:
.wslconfig | wsl.conf | |
|---|---|---|
| 作用域 | 全局,所有发行版 | 单发行版 |
| 位置 | %UserProfile%\.wslconfig(Windows 侧) | /etc/wsl.conf(发行版内部) |
| 管什么 | 虚拟机资源(内存、CPU、网络、内核) | 发行版行为(启动、挂载、互操作、默认用户) |
| 生效方式 | 需 wsl --shutdown | 需终止该发行版 |
5.1 .wslconfig(全局资源与网络)
路径:C:\Users\<你的用户名>\.wslconfig(文件不存在就直接新建)
# 全局设置,适用于所有 WSL2 发行版
[wsl2]
# 内存上限。默认是 Windows 总内存的 50%,或小内存机器上的 8GB
# 建议设为物理内存的 50%~60%,留足给 Windows 本身
memory=16GB
# 虚拟处理器数量。默认等于 Windows 逻辑核心数
processors=8
# 交换空间。默认是内存的 25%,设为 0 可禁用
swap=4GB
# 交换文件路径。建议放到非系统盘,避免频繁读写影响 C 盘
swapfile=D:\\WSL\\swap.vhdx
# 内存自动回收(重要!老版本 WSL2 会一直占着内存不放)
# 可选值:disabled / gradual / dropCache
autoMemoryReclaim=gradual
# localhost 转发:WSL 内服务可从 Windows 的 localhost 访问
# 注意:networkingMode=mirrored 时此项被忽略
localhostforwarding=true
# 嵌套虚拟化(在 WSL 里跑 Docker 或再开虚拟机时需要)
nestedVirtualization=true
# 磁盘大小上限(默认 1TB)
# diskSize=256GB
# 崩溃转储保留数量
maxCrashDumpCount=5
# 实验性特性 —— 以下均为 Windows 11 22H2+ 才支持
[experimental]
# 镜像网络模式:WSL 与 Windows 共享同一网络栈
# 优点:双向 localhost 直通;VPN 自动继承;IPv6 可用
# 缺点:绑定特定接口的应用可能异常
networkingMode=mirrored
# DNS 隧道,解决 VPN 场景下的 DNS 解析问题
dnsTunneling=true
# 通过 Windows 的代理设置自动配置 WSL 内代理
autoProxy=true
# 应用 Windows 防火墙规则到 WSL 流量
firewall=true
# 稀疏 VHD:磁盘按实际使用量增长,不再预占上限空间
sparseVhd=true
重要提醒:
.wslconfig修改后必须执行wsl --shutdown才生效。 而且不是立刻生效 —— 子系统完全停止大约需要 8 秒。用wsl --list --running确认输出"没有正在运行的分发版"后再启动。
关于 autoMemoryReclaim:这是最值得开的选项之一。老版本 WSL2 有个著名问题 —— Linux 侧释放内存后,Windows 侧看不到内存归还,任务管理器里 VmMem 一直高企。gradual 模式下 WSL 会周期性(每分钟)回收空闲内存;dropCache 更激进但可能影响文件缓存命中率。日常开发用 gradual。
5.2 wsl.conf(单发行版行为)
路径:发行版内 /etc/wsl.conf。可以从 Windows 侧用 \\wsl.localhost\Ubuntu\etc\wsl.conf 编辑,也可以在 WSL 内 sudo nano /etc/wsl.conf。
# 自动挂载 Windows 驱动器
[automount]
enabled=true
# 挂载点根目录。默认 /mnt/,即 C: → /mnt/c
root=/mnt/
# 关键:metadata 让 Linux 权限位在 NTFS 上生效(否则 chmod 无效)
options="metadata,umask=22,fmask=11"
mountFsTab=true
# 网络
[network]
# 自定义主机名,避免 WSL 改 hosts 引起某些软件报错
hostname=devbox
generateHosts=true
generateResolvConf=true
# 互操作:能否从 WSL 调用 Windows 程序
[interop]
enabled=true
# 是否把 Windows PATH 追加进 Linux PATH
# 生产 / 严格环境建议 false,避免命令冲突
appendWindowsPath=true
# 启动时设置的默认用户
[user]
default=yourname
# 启动行为
[boot]
# 启用 systemd(Ubuntu 22.04+ 默认已开)
systemd=true
# 以 root 身份在启动时执行,可用 && 串多条
# 启用 systemd 后尽量用 systemd 管理服务,而不是塞在这里
# command=service docker start
# GPU 直通(默认已开)
[gpu]
enabled=true
# 时间:与 Windows 时区同步,避免时钟漂移
[time]
useWindowsTimezone=true
5.3 systemd 支持
systemd 让 WSL 里的服务管理体验与原生 Linux 一致 —— systemctl、journalctl、timer 全部可用。
前提:Store 版 WSL(wsl --version 能打出版本号)。
sudo tee -a /etc/wsl.conf <<'EOF'
[boot]
systemd=true
EOF
wsl --shutdown
wsl -d Ubuntu
验证:
systemctl list-unit-files --type=service | head
ps -p 1 -o comm= # 应输出 systemd
常用服务:
sudo systemctl start docker && sudo systemctl enable docker
sudo systemctl status postgresql
journalctl -u docker -f # 跟踪日志
让用户级服务在后台常驻(systemctl --user 的场景):
wsl -d Ubuntu -u root loginctl enable-linger yourname
不加这一步,关闭终端后用户级服务会被回收。
六、文件系统与互操作
这是 WSL 里最容易踩坑、也最影响体验的部分。
6.1 两套文件系统的边界
WSL 里存在两个完全不同的存储世界:
| 位置 | 实际存储 | 性能 | 适用 |
|---|---|---|---|
/home/你的用户名/... | 发行版 VHDX 文件内,ext4 | 原生速度 | 代码仓库、构建产物、数据库 |
/mnt/c/、/mnt/d/ | Windows NTFS 分区,9P 协议桥接 | 慢 10~100 倍(小文件密集操作) | 临时读取、跨系统文件交换 |
核心规则(记住这一条就够了):
代码仓库、
node_modules、Python venv、Git 仓库,一律放在/home/用户名/下。放到/mnt/c/下是性能灾难。
差距有多夸张?在 /mnt/c/ 下对一个中等规模仓库(几千文件)跑 git status,可能耗时数十秒;在 ~/ 下是毫秒级。npm install、cargo build、pip install 同理。
跨系统大文件批处理的正确姿势:
# 不要这样做:直接在 /mnt/c 下跑重活
cd /mnt/c/Users/你/BigDataset && python process.py
# 应该这样做:先复制进 Linux 侧,处理完再拷回
cp -r /mnt/c/Users/你/BigDataset ~/work
cd ~/work && python process.py
cp -r ~/work/output /mnt/c/Users/你/BigDataset/
6.2 路径互操作
Windows 路径 → WSL 路径(规则:盘符换成 /mnt/,反斜杠换正斜杠)
| Windows | WSL |
|---|---|
C:\Users\You\Pictures | /mnt/c/Users/You/Pictures |
D:\Media\clip.mp4 | /mnt/d/Media/clip.mp4 |
但不要手敲,用 wslpath:
wslpath "C:\Users\You\Pictures" # → /mnt/c/Users/You/Pictures
wslpath -w /home/you/project # → \\wsl.localhost\Ubuntu\home\you\project
wslpath -m /home/you/project # → C:/... 风格(某些工具需要)
WSL 文件在 Windows 侧:
\\wsl.localhost\Ubuntu\home\yourname\project
或更简单:
explorer.exe . # 在当前目录打开资源管理器
坑点:
\\wsl$或\\wsl.localhost路径只在目标发行版运行时才可访问。如果发行版是 Stopped 状态,资源管理器会报"网络路径错误"。有些脚本和工具(包括某些 AI 生成的代码)会假设这个路径总能访问,导致失败。先wsl -d Ubuntu启动,再访问。
6.3 命令互操作
WSL 中调用 Windows 程序:加 .exe 后缀
notepad.exe file.txt
code.exe . # 打开 VS Code
explorer.exe .
winget.exe install Git.Git
注意:
notepad不行,必须notepad.exe。这是从 Windows 文档复制命令时最常见的错误。
Windows 中调用 Linux 命令:
wsl ls -la
wsl grep "pattern" file.txt
wsl npm --version
wsl sudo apt-get update
# 甚至混用管道
dir | wsl grep git
wsl ls -la | findstr "git"
wsl ls -la > out.txt # Linux 输出重定向到 Windows 文件
6.4 环境变量互操作(WSLENV)
把 Windows 环境变量传给 WSL,带路径转换:
$env:WSLENV = "GOPATH/p"
$env:GOPATH = "C:\Users\you\go"
wsl echo $GOPATH # 输出 /mnt/c/Users/you/go
/p 后缀表示自动转换路径格式。其他标志:
| 标志 | 含义 |
|---|---|
/p | 路径转换(Windows → Linux) |
/l | 值是冒号分隔的列表 |
/u | 仅 Windows → WSL |
/w | 仅 WSL → Windows |
6.5 剪贴板与 GUI
- 剪贴板:Windows Terminal 中用
Ctrl+Shift+V/Ctrl+Shift+C,与 Windows 剪贴板互通。WSL 内也可以用clip.exe写 Windows 剪贴板:echo "hello" | clip.exe - GUI 程序:WSL2 内置 WSLg,可直接运行 Linux GUI 应用(如
gedit、nautilus、xeyes),无需额外配置 X Server。前提是 Windows 11 或较新的 Windows 10。 - 移动硬盘 / U 盘:固定盘自动挂载在
/mnt/,外接设备需手动:
wsl --mount \\.\PHYSICALDRIVE1 --partition 1
或在 WSL 内:
sudo mkdir -p /mnt/usb
sudo mount -t drvfs E: /mnt/usb
七、性能调优
7.1 完整推荐配置
C:\Users\<你>\.wslconfig:
[wsl2]
memory=16GB
processors=8
swap=4GB
swapfile=D:\\WSL\\swap.vhdx
autoMemoryReclaim=gradual
localhostforwarding=true
nestedVirtualization=true
maxCrashDumpCount=5
[experimental]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true
sparseVhd=true
/etc/wsl.conf:
[automount]
enabled=true
root=/mnt/
options="metadata,umask=22,fmask=11"
mountFsTab=true
[network]
hostname=devbox
generateHosts=true
generateResolvConf=true
[interop]
enabled=true
appendWindowsPath=true
[user]
default=yourname
[boot]
systemd=true
[gpu]
enabled=true
[time]
useWindowsTimezone=true
应用:
wsl --shutdown
# 等 8 秒以上
wsl -d Ubuntu
7.2 优化效果参考
社区实测的典型收益(因机器而异,仅供量级参考):
| 指标 | 优化前 | 优化后 | 主要手段 |
|---|---|---|---|
| 冷启动时间 | 40s+ | <10s | systemd 精简 + VHD 稀疏化 |
| 1GB 文件写入 | 90s | 15s | 把工作目录移到 Linux 侧文件系统 |
| 内存占用峰值 | 2.5GB | 800MB | autoMemoryReclaim=gradual + 合理 memory 上限 |
| 网络请求响应 | 300ms | 80ms | mirrored 网络模式 + DNS 隧道 |
注意:
/mnt/c与/home之间的 10~100 倍性能差是架构决定的,任何配置都无法消除。唯一的解法是把工作目录放对位置。
7.3 磁盘回收(WSL 的 VHDX 只增不减)
WSL2 的虚拟磁盘一旦膨胀就不会自动收缩。跑过几次大构建后可能占用几十 GB 而实际内容很少。
df -h / # 在 WSL 内确认实际使用量
回收步骤:
wsl --shutdown
# VHDX 通常在:
# C:\Users\<你>\AppData\Local\Packages\CanonicalGroupLimited.*\LocalState\ext4.vhdx
diskpart
在 diskpart 中:
select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
若启用了
sparseVhd=true,新创建的 VHD 会自动稀疏化,这个问题会缓解很多。但已存在的 VHD 需要手动压缩一次。
更干净的做法:导出 → 导入
wsl --export Ubuntu D:\backup\ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu D:\WSL\Ubuntu D:\backup\ubuntu.tar --version 2
# 导入后默认用户会变回 root,需在 /etc/wsl.conf 中重新指定
八、AI 开发环境搭建
前面都是铺垫。这一节是 2026 年用 WSL 最实际的收益:让 AI 编程助手跑在对的环境里。
8.1 为什么 AI 编码工具应该放在 WSL 里
三个理由:
- 官方推荐。 OpenAI 明确建议 Codex CLI 在 Windows 上使用 WSL2,Windows 原生支持仍标注为实验性。Claude Code 的官方安装脚本同时提供 Linux 与 PowerShell 两条路径,但在 WSL 内 / 外运行,脚本兼容性和权限模型差异巨大。
- Agent 需要真实 shell。 终端 Agent 会执行
npm test、pytest、cargo build、git diff。这些命令在 Linux 下的行为与生产环境一致,脚本几乎不用改。 - 避免 npm 全局权限地狱。 WSL 里用 nvm 管理 Node,全局包装在用户目录下,
sudo npm install -g这类问题基本消失。
8.2 基础运行时
Node.js(用 nvm,不要用 apt 装):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.bashrc # 或 ~/.zshrc
nvm install --lts
nvm use --lts
node --version && npm --version && npx --version
为什么不用
apt install nodejs:apt 源的 Node 版本通常滞后很久,且全局包需要 sudo,权限混乱。nvm 装到~/.nvm下,干净且可多版本切换。
Python(用 uv,快得离谱):
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrc
uv python install 3.12
uv venv && source .venv/bin/activate
uv pip install numpy pandas
uv是 Rust 写的 Python 包管理器,比 pip 快 10~100 倍。如果你还在用pip install,值得切换。
其他常用:
sudo apt update
sudo apt install -y git make build-essential curl wget unzip python3-pip
8.3 Claude Code 安装与配置
Anthropic 的终端 AI Agent。官方现在主推原生安装脚本(避免 npm 全局权限问题)。
安装(在 WSL 内执行):
curl -fsSL https://claude.ai/install.sh | bash
source ~/.bashrc # 或 source ~/.zshrc
claude --version
若更习惯 npm 路径(也可以,但不要加 sudo):
npm install -g @anthropic-ai/claude-code
claude doctor # 健康检查
首次使用:
mkdir -p ~/projects/demo && cd ~/projects/demo
claude
首次运行会打开浏览器登录 Anthropic 账号。认证完成后回到终端即可对话。
它能做什么:
> 创建一个 HTML 页面,点击按钮时改变背景色
> 解释一下 src/utils/parser.ts 里的验证逻辑
> 跑一下测试,然后修复失败的用例
> 把这段代码重构一下,消除重复的 try-catch
Claude Code 会读取并编辑你的文件、在终端执行命令(需你授权)。
权限模式(跳过逐条确认,谨慎使用):
claude --permission-mode acceptEdits # 自动接受文件编辑
claude --permission-mode plan # 只规划不执行
项目级配置:在仓库根目录创建 CLAUDE.md,写入项目约定,Agent 每次会话都会读取:
# 项目约定
## 语言与风格
- TypeScript strict 模式,禁止 any
- 缩进 2 空格,单引号
## 常用命令
- 测试:`npm test`
- 构建:`npm run build`
- 类型检查:`npm run typecheck`
## 目录结构
- src/ 源码,tests/ 测试,src/generated/ 自动生成勿手动改
## 禁止事项
- 不要修改 package-lock.json
- 不要在提交中包含 .env
项目级技能(Skills):把可复用的审查规则沉淀成文件,放在 .claude/skills/<名称>/SKILL.md:
mkdir -p .claude/skills/linux-review
nano .claude/skills/linux-review/SKILL.md
---
name: linux-review
description: 审查 Linux shell 脚本的可移植性、危险命令与错误处理。
---
## 检查项
1. 未加引号的变量、危险的文件操作(rm -rf、未校验的变量)
2. 未处理的命令失败(缺少 set -e / || 处理)
3. 在 Ubuntu 上不兼容的语法
4. 按严重程度汇总发现,并给出针对性修复建议
安全提醒:不要把密码、API Key、私有 prompt 或生产环境信息写进 SKILL.md。这些文件如果提交到仓库,全团队可见。
8.4 Codex CLI 安装与配置
OpenAI 的终端编码 Agent。
# 方式一:官方安装脚本
curl -fsSL https://chatgpt.com/codex/install.sh | sh
# 方式二:npm(需 Node 22+)
npm i -g @openai/codex
# 方式三:Homebrew
brew install codex
codex --version
首次使用:
cd ~/projects/demo
codex
首次运行会引导用 ChatGPT 账号或 OpenAI API Key 认证。
常用参数:
codex --sandbox workspace-write # 允许在工作区写文件
codex mcp --help # 查看 MCP 支持
重要:Codex 会改文件、跑命令。一定要在 Git 仓库里用,而不是随便一个下载目录。版本控制就是你的撤销按钮。
8.5 Gemini CLI(可选)
npm install -g @google/gemini-cli
gemini
首次运行选择 Google 账号登录。也可以直接用 npx 试用,不装:
npx https://github.com/google-gemini/gemini-cli
8.6 三家 CLI 工具对比
| Claude Code | Codex CLI | Gemini CLI | |
|---|---|---|---|
| 厂商 | Anthropic | OpenAI | |
| 模型 | Claude 系列 | GPT 系列 | Gemini 系列 |
| 安装方式 | 原生脚本 / npm | 脚本 / npm / brew | npm |
| 需要 Node | 否 | 是(22+) | 是 |
| 账号要求 | Pro/Max/Teams/Enterprise | ChatGPT Plus 或 API Key | Google 账号 |
| WSL 支持 | 官方推荐路径 | 官方推荐 WSL2 | 跨平台一致 |
| 特色 | 项目上下文处理成熟、Skills 机制 | 与 ChatGPT 生态打通、沙箱模式 | 与 Google 生态集成 |
结论:都装上,按任务选。 很多工程师同时用两三个,遇到一个卡住了换另一个。
8.7 MCP(Model Context Protocol)接入
MCP 让 Agent 接入外部工具与数据源。常见 MCP 服务多数通过 npx 运行 —— 这也再次说明为什么 WSL 里需要干净的 Node。
# 示例:Playwright MCP —— 让 Agent 能操作浏览器
npx @playwright/mcp@latest
# 示例:文件系统 MCP
npx -y @modelcontextprotocol/server-filesystem ~/projects
配置位置因工具而异:Claude Code 有 claude mcp add 命令,Codex 有 codex mcp 子命令。接入前先看各 MCP 项目的官方说明。
安全提醒:MCP 服务能读写你的文件、访问网络。不要给 Agent 管理员权限或云凭证,只为了让跑个版本检查。安装前审一遍 MCP 服务的源码和权限需求。
8.8 GPU 直通与本地大模型
WSL2 支持 CUDA / DirectML / Intel oneAPI 直通,这意味着可以在 WSL 里跑本地推理。
前提:在 Windows 侧装好 NVIDIA / AMD / Intel 的 GPU 驱动(不要在 WSL 里装驱动),WSL2 会自动识别。
nvidia-smi # 应显示 GPU 型号与 CUDA 版本
跑 Ollama:
curl -fsSL https://ollama.com/install.sh | sh
ollama run qwen2.5:7b
# 调用 API
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "用一句话解释 WSL2 的内存回收机制"
}'
跑 PyTorch:
uv venv && source .venv/bin/activate
uv pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
内存分配提醒:本地大模型会吃掉大量内存。如果模型加载失败或突然被 OOM Kill,先调大
.wslconfig中的memory和swap。
8.9 完整环境校验脚本
把关键组件一次验证完,建议保存为 ~/check-env.sh:
#!/usr/bin/env bash
# WSL AI 开发环境健康检查
echo "=== 系统信息 ==="
echo "内核: $(uname -r)"
echo "发行版: $(lsb_release -ds 2>/dev/null || grep PRETTY_NAME /etc/os-release)"
echo "CPU 核心: $(nproc)"
echo "内存: $(free -h | awk '/^Mem:/ {print $2}')"
echo
echo "=== 基础工具 ==="
for cmd in git make curl wget unzip jq rg fzf; do
if command -v $cmd &>/dev/null; then
printf " OK %-12s %s\n" "$cmd" "$($cmd --version 2>/dev/null | head -1)"
else
printf " -- %-12s 未安装\n" "$cmd"
fi
done
echo
echo "=== 运行时 ==="
for cmd in node npm npx python3 uv; do
if command -v $cmd &>/dev/null; then
printf " OK %-12s %s\n" "$cmd" "$($cmd --version 2>/dev/null | head -1)"
else
printf " -- %-12s 未安装\n" "$cmd"
fi
done
echo
echo "=== AI 工具 ==="
for cmd in claude codex gemini; do
if command -v $cmd &>/dev/null; then
printf " OK %-12s %s\n" "$cmd" "$($cmd --version 2>/dev/null | head -1)"
else
printf " -- %-12s 未安装\n" "$cmd"
fi
done
echo
echo "=== GPU ==="
if command -v nvidia-smi &>/dev/null; then
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv,noheader
else
echo " 未检测到 NVIDIA GPU 工具"
fi
echo
echo "=== systemd ==="
if pidof systemd &>/dev/null; then
echo " OK systemd 运行中"
else
echo " -- systemd 未启用(检查 /etc/wsl.conf 的 [boot] systemd=true)"
fi
chmod +x ~/check-env.sh && ~/check-env.sh
8.10 安全边界
Agent 有了执行权限,风险是真实的。四条硬规则:
- 在 Git 仓库里用 Agent。 任何改动都可回溯。不要在非版本控制的目录里让它大规模改文件。
- 不要在 prompt 里贴密钥。 环境变量、
.env、token 都不应该出现在对话或 SKILL.md 里。 - 审查它建议的每条命令。 特别是
rm、curl | bash、sudo、chmod、带变量的路径操作。 - 给它的权限要最小化。 需要
acceptEdits就用它,不要一上来给bypassPermissions。
九、故障排查速查表
| 现象 | 原因 | 解法 |
|---|---|---|
wsl --install 卡在 0.0% | Store 网络问题 | wsl --install --web-download -d Ubuntu |
错误 0x80370102 | BIOS 虚拟化未开启 | 进 BIOS 开 Intel VT-x / AMD-V |
错误 0x80070005 | 权限不足 | 必须用管理员 PowerShell |
The virtual machine could not be started | Hypervisor 未启动 | 管理员执行 bcdedit /set hypervisorlaunchtype auto 后重启 |
| 提示需要内核更新 | 缺 WSL2 内核包 | 安装 https://aka.ms/wsl2kernel |
| 家庭版 Windows 装不上 WSL2 | 缺虚拟机平台 | 升级到专业版,或只用 WSL1 |
systemctl 报 “System has not been booted with systemd” | 未启用 | /etc/wsl.conf 加 [boot] systemd=true,然后 wsl --shutdown |
改了 .wslconfig 没生效 | 子系统未完全停止 | wsl --shutdown,等 8 秒以上再启动 |
/mnt/c 下操作极慢 | 9P 协议开销 | 把工作目录移到 ~/ 下 |
| VmMem 一直很高不释放 | 老版 WSL2 内存不归还 | 开 autoMemoryReclaim=gradual |
| 磁盘占用只增不减 | VHDX 不自动收缩 | diskpart compact vdisk 或导出重导入 |
\\wsl$ 路径报网络错误 | 发行版未运行 | 先 wsl -d Ubuntu 启动 |
| WSL 里 sudo 密码忘了 | — | wsl -d Ubuntu -u root 进入后 passwd 你的用户名 |
| 端口冲突 | Windows 保留端口段 | netsh interface ipv4 show excludedportrange protocol=tcp 查看并换端口 |
| WSL 内访问不了 Windows 服务 | NAT 模式隔离 | 用 cat /etc/resolv.conf | grep nameserver 拿主机 IP,或开 mirrored 模式 |
| 时钟漂移 | 未同步时区 | /etc/wsl.conf 设 [time] useWindowsTimezone=true,或 sudo hwclock -s |
| VPN 下 DNS 解析失败 | NAT 模式 DNS 隔离 | 开 dnsTunneling=true |
| Claude Code 全局权限错误 | 用了 sudo npm -g | 改用原生安装脚本,或用 nvm 后不加 sudo |
一键重置网络(遇到诡异网络问题先试这个)
wsl --shutdown
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
# 重启电脑
备份与迁移
# 导出(可在另一台机器导入)
wsl --export Ubuntu D:\wsl-backups\ubuntu-2026-10-03.tar
# 新机器上导入
wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl-backups\ubuntu-2026-10-03.tar --version 2
# 导入后默认用户是 root,需在发行版内创建 /etc/wsl.conf:
# [user]
# default=yourname
十、附录
10.1 高频命令速查
# ---- 管理 ----
wsl --install # 安装
wsl -l -v # 列出(含版本、状态)
wsl --list --online # 可安装的发行版
wsl -s Ubuntu # 设默认发行版
wsl --set-default-version 2 # 新发行版默认用 WSL2
wsl --set-version Ubuntu 2 # 转换已有发行版
wsl --terminate Ubuntu # 终止
wsl --shutdown # 全关
wsl --update # 更新组件
wsl --status # 状态
wsl --version # 版本
# ---- 执行 ----
wsl # 进入默认发行版
wsl -d Debian # 进入指定发行版
wsl -d Ubuntu -u root # 以 root 进入
wsl -d Ubuntu bash -lc "npm -v" # 执行命令
wsl -d Ubuntu bash -lc "cd ~/app && git pull"
# ---- 备份迁移 ----
wsl --export Ubuntu D:\u.tar
wsl --import MyUbuntu D:\WSL D:\u.tar --version 2
wsl --unregister Ubuntu # 删除(危险)
# ---- 磁盘 ----
wsl --mount \\.\PHYSICALDRIVE1 --partition 1
wsl --unmount \\.\PHYSICALDRIVE1
# ---- WSL 内常用 ----
exit # 退出
cd / # 根目录
explorer.exe . # 资源管理器打开当前目录
code . # VS Code 打开
notepad.exe file.txt # 调用 Windows 程序
wslpath "C:\Users\me" # 路径转换
echo hi | clip.exe # 写入 Windows 剪贴板
cat /etc/resolv.conf # 查看主机 IP(NAT 模式)
df -h / # 查看磁盘占用
free -h # 查看内存
nproc # CPU 核心数
10.2 新机器初始化清单
# 1. 系统更新
sudo apt update && sudo apt upgrade -y
# 2. 基础工具
sudo apt install -y git make build-essential curl wget unzip jq \
ripgrep fd-find bat fzf eza tree ncdu zsh python3-pip
# 3. 别名
echo 'alias fd=fdfind' >> ~/.zshrc
echo 'alias bat=batcat' >> ~/.zshrc
# 4. Git 身份
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main
git config --global core.autocrlf input
# 5. SSH 密钥
ssh-keygen -t ed25519 -C "you@example.com"
cat ~/.ssh/id_ed25519.pub # 加到 GitHub
# 6. Node(nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
source ~/.zshrc && nvm install --lts
# 7. Python(uv)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 8. AI 工具
curl -fsSL https://claude.ai/install.sh | bash
npm i -g @openai/codex
# 9. 项目目录
mkdir -p ~/projects
结语
回到开头那句话:WSL 的价值在于消除开发环境与生产环境之间的语义差。文件权限、路径大小写、shell 脚本、服务管理 —— 这些看起来琐碎的差异,恰恰是"在我机器上能跑"问题的根源。而 2026 年多出来的一层价值是:AI 编码工具真正进入了终端工作流,它们需要真实 shell、需要干净的 Node、需要可回溯的 Git 历史,WSL 恰好提供了这三样,而且不用放弃 Windows 的桌面体验。
三条最重要的实践:
- 代码放
~/,不放/mnt/c/。 .wslconfig里开autoMemoryReclaim=gradual和sparseVhd=true。- AI Agent 只放在 Git 仓库里用。
剩下的,交给命令。
说明:本文命令与配置项均对应 WSL 2.x(Store 版)。
[experimental]段的networkingMode、dnsTunneling、autoProxy、firewall、sparseVhd等选项需要 Windows 11 22H2 及以上;在更早的系统上这些键会被忽略,不影响其余配置生效。修改.wslconfig后务必执行wsl --shutdown并等待约 8 秒,否则改动不会生效 —— 这是最常见的"配置没起作用"原因。