devAlice
← Windows

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
  • 建议管理员权限(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              # 下次启动时读取 .wslconfig

1.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
wsl

2.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.conf
nameserver 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=true

wsl --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 - WSLms-vscode-remote.remote-wsl

或从命令行:

code --install-extension ms-vscode-remote.remote-wsl

6.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=true

wsl --shutdown 后重启。

7.2 效果

  • VPN — WSL 自动走 VPN
  • 企业代理 — 自动获取 Windows 的 IE/Edge 代理
  • localhost — Windows ↔ WSL 双向互通(无需 localhostForwarding
  • DNS — 与 Windows 相同,最稳定

7.3 注意事项

  • 与部分 Docker Desktop 版本冲突——遇到问题时临时禁用
  • 某些高级容器网络场景行为可能不同——如有深度容器工作请验证

验证

五项检查:

  1. 在 WSL 内,free -h 显示 .wslconfig 设置的上限(例如 8.0Gi)
  2. ps -p 1 显示 systemd
  3. curl -sS https://www.google.com -o /dev/null && echo OK → OK(DNS/网络)
  4. cd ~ && touch test.txt && lscd /mnt/c/Users/$USER && touch test.txt && ls 均可用(仅速度不同)
  5. 从 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 节)

  • diskpartcompact vdisk 受碎片化限制。方案 C(导出/导入)最彻底。

参考资料

更新日志

  • 2026-05-12 — 初版英文翻译(devAlice M2 i18n seed)