WSL2 调优 — 内存、systemd、DNS、I/O 一次搞定
安装 WSL2 后必须修复的七件事——.wslconfig、systemd、DNS、磁盘回收、VS Code 集成、镜像网络。
如果你已通过 Windows 初始设置 安装了 WSL2,下一步就是调优。使用默认配置会导致内存失控、重启后 DNS 失效、磁盘持续膨胀,以及缺少 systemd。本指南一次性完成七个调优步骤——配置一次,受益每天。
我认为 WSL2 调优是被忽视最多的配置步骤之一。以前开发者安装完就直接使用,然后慢慢遭遇各种性能和稳定性问题;如今在安装后立即完成这七步调优,由于内存和 DNS 等基础配置到位,后续所有工作都建立在稳定的基础上。
目标环境:Windows 11(22H2+)+ WSL2 + Ubuntu(或任何基于 systemd 的发行版)。
TL;DR
| 调优项 | 文件 | 效果 |
|---|---|---|
1. .wslconfig | %USERPROFILE%\.wslconfig(Windows 端) | RAM/CPU/swap 上限 + GUI · 镜像网络 |
2. wsl.conf systemd | /etc/wsl.conf(WSL 内) | 启用 systemd → snap · docker · systemctl 均可用 |
| 3. DNS 稳定 | /etc/wsl.conf + /etc/resolv.conf | 防止 VPN / 重启后 DNS 断联 |
| 4. I/O 性能 | 工作目录位置 | 使用 WSL 原生路径(/home/...)而非 /mnt/c/... |
| 5. 磁盘回收 | export/import | 缩小膨胀的 vhdx(可回收数十 GB) |
| 6. VS Code Remote-WSL | 一个扩展 | 以原生速度编辑 WSL 文件 |
| 7. 镜像网络 | .wslconfig networkingMode=mirrored | 对 VPN/企业网络友好(Win11 22H2+) |
前置条件
- Windows 11 22H2 或更新版本(部分功能建议 23H2+)
- WSL2 已安装 + 至少一个支持 systemd 的发行版(Ubuntu 等)
- 未安装:在管理员 PowerShell 中运行
wsl --install
- 未安装:在管理员 PowerShell 中运行
- 建议管理员权限(
wsl --shutdown需要,.wslconfig本身在用户目录下)
1. .wslconfig — RAM/CPU/swap 上限
默认情况下 WSL2 可占用约 50% 的 Windows 内存——一次大型 Node 构建可能把 Windows 本身推入 swap。设置明确上限。
1.1 模板
.wslconfig# PowerShell
Invoke-WebRequest -Uri https://devalice.jaceclub.com/assets/windows/wsl-tuning/wslconfig-template.txt -OutFile $env:USERPROFILE\.wslconfig
Get-FileHash $env:USERPROFILE\.wslconfig -Algorithm SHA256
# expected: BFBDAF7AE486916D8AA4E792F9845416E1B6B6EA535F84E1BBCCA2BE9ACCB3C4
# (lowercase: bfbdaf7ae486916d8aa4e792f9845416e1b6b6ea535f84e1bbcca2be9accb3c4)1.2 关键配置项
# %USERPROFILE%\.wslconfig
[wsl2]
memory=8GB # 主机内存的 50–75%
swap=4GB # 磁盘 swap(0 = 禁用)
localhostForwarding=true
guiApplications=true # Linux GUI 应用(Win11 默认)
# processors=8 # 明确限制核心数(可选)1.3 应用
wsl --shutdown # 停止所有 WSL 实例
wsl # 下次启动时读取 .wslconfig1.4 验证
在 WSL 内:
free -h # 内存上限是否匹配(例如 8GB)
nproc # CPU 核心数
swapon --show # swap 是否已激活16GB 主机推荐
memory=10GB。32GB 主机推荐memory=16GB。
2. 启用 systemd — /etc/wsl.conf
WSL2 默认 init 不是 systemd。现代包(docker、snap、postgresql service 等)都依赖它。
2.1 启用
# 在 WSL 内(需要 sudo)
sudo nano /etc/wsl.conf内容:
[boot]
systemd=true
[user]
default=me # 默认用户(可选)保存,然后:
# Windows PowerShell
wsl --shutdown
wsl2.2 验证
ps -p 1 # PID 1 == systemd → 成功
systemctl status # 显示 systemd 信息 → OK现在 sudo systemctl start docker 等命令可以正常使用了。
启动时间增加 1–3 秒,换来真正的服务管理器、journal 日志记录和 Tab 补全。
3. DNS 稳定性
WSL2 的默认 DNS 通过 Windows NAT 桥接,VPN 连接/断开或重启后经常中断。症状:curl github.com 可以,但 apt update 不行,或反过来。
3.1 方案 A — 禁用自动 DNS + 静态解析器
sudo nano /etc/wsl.conf添加:
[network]
generateResolvConf=false保存 → wsl --shutdown → 重启。
现在 WSL 不再重写 /etc/resolv.conf,手动设置:
sudo nano /etc/resolv.confnameserver 1.1.1.1
nameserver 8.8.8.8
企业网络/VPN 环境下,请添加 IT 提供的内部 DNS。
3.2 方案 B — 镜像网络(Win11 22H2+,推荐)
第 7 节会让 WSL 自动共享 Windows 的 DNS。在企业 VPN 下最稳定。
4. I/O 性能 — 工作目录放哪里
最常被忽视的调优项。性能差异显著:
| 位置 | 路径 | 构建速度(例如 npm install) |
|---|---|---|
| WSL 原生 | /home/me/project | 快(Linux ext4) |
| Windows 挂载 | /mnt/c/Users/me/project | 慢 5–10 倍(9p 协议) |
原则:WSL 工作文件放在 WSL 磁盘内。如果 Windows 需要访问同一文件,用 VS Code Remote-WSL(第 6 节)或 Syncthing(参见 文件同步)在两侧各保存一份。
4.1 推荐模式
# 在 WSL 内
mkdir -p ~/work
cd ~/work
git clone git@github.com:org/repo.git
cd repo
npm install # 速度快4.2 反模式
# 在 Windows 上克隆,通过 WSL 构建
cd /mnt/c/Users/me/Documents/project # 跨挂载
npm install # 速度慢(可能要几十分钟)4.3 必须跨挂载时
- 只有 Windows 的工具需要打开同一文件夹(Photoshop 等——罕见情况)
- 在 Windows IDE 中编辑——用 VS Code Remote-WSL 解决
5. 磁盘大小 — vhdx 压缩
WSL 的 .vhdx 虚拟磁盘永远不会自动缩小。建了 30GB 缓存再删掉——文件还是 30GB。
5.1 检查当前大小
# PowerShell
Get-ChildItem -Path "$env:LOCALAPPDATA\Packages" -Recurse -Filter "ext4.vhdx" | ForEach-Object {
"{0,-60} {1:N2} GB" -f $_.Directory.Name, ($_.Length / 1GB)
}5.2 方案 A — 稀疏 VHD(Win11 22H2+)
在 .wslconfig 中(第 1.1 节模板中已注释):
[experimental]
sparseVhd=truewsl --shutdown 后启用。未使用的空间会逐步回收。
5.3 方案 B — 手动压缩(diskpart)
在 WSL 关闭时:
wsl --shutdown
diskpart
# diskpart>
select vdisk file="C:\Users\me\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_*\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit可回收数十 GB。速度很慢——建议在夜间运行。
5.4 方案 C — 导出/导入(最彻底)
完整备份 + 重建。新 vhdx 从最优大小开始。
wsl --shutdown
wsl --export Ubuntu C:\backup\ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu C:\WSL\Ubuntu C:\backup\ubuntu.tar方案 C 最有效,但实例 ID / 安装元数据会重建。需重新应用 systemd 配置、默认用户等。最好在计划迁移时执行。
6. VS Code Remote-WSL
从 Windows VS Code 以原生速度编辑 WSL 文件。解决跨挂载问题的标准方案。
6.1 安装
在 Windows VS Code 应用市场中:
- Remote - WSL(
ms-vscode-remote.remote-wsl)
或从命令行:
code --install-extension ms-vscode-remote.remote-wsl6.2 使用
在 WSL 内:
cd ~/work/repo
code .→ Windows VS Code 打开,左下角显示 WSL: Ubuntu。文件系统、终端和扩展都在 WSL 内运行。
或者,在 Windows VS Code 中:命令面板 → WSL: Connect to WSL → 选择文件夹。
6.3 在 WSL 侧安装的扩展
首次连接时,部分扩展会询问「Install on WSL?」。推荐确认安装:
- ESLint / Prettier
- Python / Pylance
- Go / Rust-Analyzer
- Docker
7. 镜像网络(Win11 22H2+)
比第 3 节更优雅的解决方案。WSL 直接镜像 Windows 的网络接口——VPN、企业网络、DNS 和 localhost 行为与主机完全一致。
7.1 启用
在 .wslconfig 中:
[wsl2]
networkingMode=mirrored
[experimental]
dnsTunneling=true
autoProxy=truewsl --shutdown 后重启。
7.2 效果
- VPN — WSL 自动走 VPN
- 企业代理 — 自动获取 Windows 的 IE/Edge 代理
- localhost — Windows ↔ WSL 双向互通(无需
localhostForwarding) - DNS — 与 Windows 相同,最稳定
7.3 注意事项
- 与部分 Docker Desktop 版本冲突——遇到问题时临时禁用
- 某些高级容器网络场景行为可能不同——如有深度容器工作请验证
验证
五项检查:
- 在 WSL 内,
free -h显示.wslconfig设置的上限(例如 8.0Gi) ps -p 1显示systemdcurl -sS https://www.google.com -o /dev/null && echo OK→ OK(DNS/网络)cd ~ && touch test.txt && ls和cd /mnt/c/Users/$USER && touch test.txt && ls均可用(仅速度不同)- 从 VS Code 中,
code .左下角显示WSL: Ubuntu
故障排查
.wslconfig 更改未生效
- 忘记执行
wsl --shutdown。所有 WSL 实例必须完全停止,下次启动才会读取配置。 - 位置必须是
%USERPROFILE%\.wslconfig(用户主目录),而非%LOCALAPPDATA%。 - 文件名必须是
.wslconfig(以点开头,无扩展名)。
启用 systemd 后启动失败
- 常见原因:
/etc/wsl.conf语法错误(例如缺少[boot]标头)。 - 恢复:在 PowerShell 中用
wsl -u root -d Ubuntu以 root 身份进入并修复/etc/wsl.conf。
apt update 返回 DNS 错误
- 应用第 3.1 节(手动
/etc/resolv.conf),或切换到第 7 节镜像网络。 - 在 VPN 下确保已添加企业 DNS。
npm install 慢得无法忍受
- 见第 4 节——你在从
/mnt/c/...工作。迁移到~/work。
VS Code Remote-WSL 连接失败
code不在 PATH 中。在 Windows 上打开 VS Code 一次 → 命令面板 →Shell Command: Install 'code' command in PATH。- 在 WSL 内用
code -v验证。
Docker Desktop 在启用镜像网络后崩溃
- Docker Desktop 假设了 NAT 模式。重新配置其 WSL 集成,或在使用 Docker 时禁用镜像网络。
vhdx 没有缩小(第 5 节)
diskpart的compact vdisk受碎片化限制。方案 C(导出/导入)最彻底。
参考资料
- Windows 初始设置 — 先安装 WSL2
- Microsoft WSL — 配置
- WSL 镜像网络公告
- 稀疏 VHD 公告
更新日志
- 2026-05-12 — 初版英文翻译(devAlice M2 i18n seed)