WSL 完全指南:从安装、日常使用到 AI 开发环境

一份 Windows 平台上的 WSL 工程实战手册:四种安装路径(含国内网络加速)、.wslconfig 与 wsl.conf 的配置边界、/mnt/c 性能陷阱的真实量级、systemd 与 mirrored 网络模式、磁盘回收,以及把 Claude Code、Codex CLI、MCP、GPU 直通与本地大模型接进来的完整流程,附故障排查速查表与可抄的配置模板。

本文整理自 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

这三个概念经常被混在一起。先看对照表:

维度WSL1WSL2
实现方式系统调用翻译层(无虚拟机)轻量级虚拟机 + 真实 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 → 虚拟化,应显示"已启用"。

执行:

  1. 右键开始菜单 → 终端(管理员) 或 PowerShell(管理员)
  2. 执行:
wsl --install

这一条命令做了四件事:启用"适用于 Linux 的 Windows 子系统"可选组件、启用"虚拟机平台"可选组件、下载安装 WSL2 内核、下载并安装 Ubuntu(默认发行版)。

  1. 重启电脑(必须)

  2. 重启后 Ubuntu 窗口自动弹出,设置用户名和密码:

    • 用户名:全小写,无空格
    • 密码:输入时不回显(正常现象),记牢,sudo 要用
  3. 验证:

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
命令替代用途
rggrep极速文本搜索(自动忽略 .gitignore)
fdfindfind更简洁的文件查找
batcatcat带语法高亮与行号的 cat
fzf—交互式模糊查找,可接管道
jq—JSON 处理与格式化
ezals带图标、Git 状态、树形视图
ncdudu交互式磁盘占用分析

注意包名与命令名不一致: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

这两个文件最容易搞混。一句话区分:

.wslconfigwsl.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/,反斜杠换正斜杠)

WindowsWSL
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+<10ssystemd 精简 + VHD 稀疏化
1GB 文件写入90s15s把工作目录移到 Linux 侧文件系统
内存占用峰值2.5GB800MBautoMemoryReclaim=gradual + 合理 memory 上限
网络请求响应300ms80msmirrored 网络模式 + 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 里

三个理由:

  1. 官方推荐。 OpenAI 明确建议 Codex CLI 在 Windows 上使用 WSL2,Windows 原生支持仍标注为实验性。Claude Code 的官方安装脚本同时提供 Linux 与 PowerShell 两条路径,但在 WSL 内 / 外运行,脚本兼容性和权限模型差异巨大。
  2. Agent 需要真实 shell。 终端 Agent 会执行 npm test、pytest、cargo build、git diff。这些命令在 Linux 下的行为与生产环境一致,脚本几乎不用改。
  3. 避免 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 CodeCodex CLIGemini CLI
厂商AnthropicOpenAIGoogle
模型Claude 系列GPT 系列Gemini 系列
安装方式原生脚本 / npm脚本 / npm / brewnpm
需要 Node否是(22+)是
账号要求Pro/Max/Teams/EnterpriseChatGPT Plus 或 API KeyGoogle 账号
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 有了执行权限,风险是真实的。四条硬规则:

  1. 在 Git 仓库里用 Agent。 任何改动都可回溯。不要在非版本控制的目录里让它大规模改文件。
  2. 不要在 prompt 里贴密钥。 环境变量、.env、token 都不应该出现在对话或 SKILL.md 里。
  3. 审查它建议的每条命令。 特别是 rm、curl | bash、sudo、chmod、带变量的路径操作。
  4. 给它的权限要最小化。 需要 acceptEdits 就用它,不要一上来给 bypassPermissions。

九、故障排查速查表

现象原因解法
wsl --install 卡在 0.0%Store 网络问题wsl --install --web-download -d Ubuntu
错误 0x80370102BIOS 虚拟化未开启进 BIOS 开 Intel VT-x / AMD-V
错误 0x80070005权限不足必须用管理员 PowerShell
The virtual machine could not be startedHypervisor 未启动管理员执行 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 的桌面体验。

三条最重要的实践:

  1. 代码放 ~/,不放 /mnt/c/。
  2. .wslconfig 里开 autoMemoryReclaim=gradual 和 sparseVhd=true。
  3. AI Agent 只放在 Git 仓库里用。

剩下的,交给命令。


说明:本文命令与配置项均对应 WSL 2.x(Store 版)。[experimental] 段的 networkingMode、dnsTunneling、autoProxy、firewall、sparseVhd 等选项需要 Windows 11 22H2 及以上;在更早的系统上这些键会被忽略,不影响其余配置生效。修改 .wslconfig 后务必执行 wsl --shutdown 并等待约 8 秒,否则改动不会生效 —— 这是最常见的"配置没起作用"原因。