Windows 开发者必看:WSL2 完全使用指南

5 阅读1分钟

什么是 WSL2?

WSL2(Windows Subsystem for Linux 2)是微软在 Windows 中内置的 Linux 子系统。它不是虚拟机,也不是模拟器,而是在 Windows 内核中集成了一个真正的 Linux 内核。

与 WSL1 的转译层方案不同,WSL2 跑的是完整的 Linux 内核,拥有 100% 的系统调用兼容性。这意味着 Docker、systemd、strace 等在 WSL1 中无法运行的工具,在 WSL2 中都能正常工作。

为什么你需要 WSL2?

  • 不需要双系统或虚拟机,打开终端就能用 Linux
  • 与 Windows 文件系统无缝互通
  • 原生支持 Docker、Node.js、Python 等开发工具链
  • 启动速度快,资源占用少
  • 微软官方维护,更新积极

一、安装 WSL2

1.1 系统要求

  • Windows 10(版本 2004+,内部版本 19041 及以上)或 Windows 11
  • 启用虚拟化功能(BIOS 中的 VT-x / AMD-V)

1.2 一键安装(推荐)

以管理员身份打开 PowerShell,执行:

wsl --install

这个命令会自动完成所有操作:启用「适用于 Linux 的 Windows 子系统」和「虚拟机平台」功能、下载 Linux 内核、安装 Ubuntu(默认发行版)。

安装完成后重启电脑

重启后会自动弹出 Ubuntu 窗口,要求你设置用户名和密码。这个用户就是 Linux 系统的管理员用户(拥有 sudo 权限)。

1.3 安装其他发行版

查看可用的发行版:

wsl --list --online

安装指定发行版:

wsl --install -d Debian
wsl --install -d Arch

常用的发行版:Ubuntu(推荐新手)、Debian(稳定轻量)、Arch(滚动更新,适合进阶用户)。

1.4 确认 WSL 版本

wsl --version

输出类似:

WSL 版本: 2.6.3.0
内核版本: 6.6.87.2-microsoft-standard-WSL2
Windows 版本:10.0.26200.8246

确认默认使用 WSL2:

wsl --status

如果显示「默认版本: 1」,执行:

wsl --set-default-version 2

二、基础操作

2.1 启动与退出

# 启动默认发行版(进入 Linux Shell)
wsl

# 启动指定发行版
wsl -d Ubuntu-24.04

# 直接执行命令(不进入交互模式)
wsl ls -la /
wsl cat /etc/os-release

在 Linux Shell 中输入 exit 或按 Ctrl+D 退出。

2.2 多发行版管理

# 查看已安装的发行版及其状态
wsl -l -v

# 设置默认发行版
wsl --set-default Ubuntu-24.04

# 关闭指定发行版(释放内存)
wsl -t Debian

# 关闭所有发行版
wsl --shutdown

2.3 文件互访

从 Windows 访问 Linux 文件:

在资源管理器地址栏输入:

\\wsl$

或直接访问具体发行版:

\\wsl$\Ubuntu\home\feng

也可以在 Linux 中用 explorer.exe 打开:

explorer.exe .

从 Linux 访问 Windows 文件:

Windows 的 C 盘挂载在 /mnt/c/

ls /mnt/c/Users/YA/Desktop/

2.4 性能提示:文件放在哪?

这是一个很多人忽略但非常重要的问题:

位置I/O 性能说明
Linux 文件系统 (/home/...)WSL2 原生 ext4,接近原生 Linux 速度
Windows 文件系统 (/mnt/c/...)跨文件系统的 9P 协议转发,速度慢 3-5 倍

结论:在 WSL2 中做开发时,把项目代码放在 Linux 文件系统(/home/ 下),不要放在 /mnt/c/ 下。Git 操作、npm install 等在 Linux 文件系统上会快得多。

三、网络与代理配置

3.1 网络架构

WSL2 使用虚拟网卡(NAT 模式),和 Windows 主机不在同一个网段。Linux 通过 NAT 访问外网。

查看 Windows 宿主机 IP:

cat /etc/resolv.conf | grep nameserver
# 输出类似: nameserver 10.255.255.254

3.2 配置代理(配合 V2Ray / Clash)

如果你在 Windows 上使用了代理工具(V2Ray、Clash 等),WSL2 中的流量默认不会走代理。需要手动配置:

方法一:环境变量(适用于大部分工具)

~/.bashrc~/.zshrc 中添加:

# 获取 Windows 宿主机 IP
WIN_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
export HTTP_PROXY="http://${WIN_IP}:10808"
export HTTPS_PROXY="http://${WIN_IP}:10808"
export NO_PROXY="localhost,127.0.0.1,.yaqh.com"
export http_proxy="$HTTP_PROXY"
export https_proxy="$HTTPS_PROXY"
export no_proxy="$NO_PROXY"

如果你的代理监听在 127.0.0.1(如 V2Ray 的 TUN 模式),直接用:

export HTTP_PROXY="http://127.0.0.1:10808"
export HTTPS_PROXY="http://127.0.0.1:10808"

方法二:代理工具开启 TUN 模式

V2RayN / Clash 的 TUN(虚拟网卡)模式可以接管所有网络流量,包括 WSL2 的流量。这是最省心的方案,但要注意路由规则:

  • 国内域名走 direct(直连)
  • 国外域名走 proxy(代理)
  • 注意 IPv6 问题 -- 如果直连时解析到 IPv6 但 IPv6 不通,会导致连接失败

3.3 端口转发

WSL2 中的服务端口会自动转发到 Windows。比如你在 WSL2 中启动了一个 Web 服务:

python3 -m http.server 8000

在 Windows 浏览器中直接访问 http://localhost:8000 即可。这个自动转发在 WSL 2.6+ 中已经做得很好了,基本不需要手动配置。

四、进阶配置

4.1 启用 systemd

现代 Linux 发行版使用 systemd 管理服务(Docker、Nginx、Cron 等都依赖它)。WSL2 默认不启用 systemd,需要手动开启。

创建或编辑 /etc/wsl.conf

[boot]
systemd=true

在 PowerShell 中重启 WSL:

wsl --shutdown
wsl

验证 systemd 是否启用:

systemctl list-unit-files --type=service | head
# 如果有输出,说明 systemd 已启用

启用 systemd 后,你可以像在真实 Linux 中一样使用 systemctl 管理服务:

# 启动 Docker
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

# 查看 Nginx 状态
systemctl status nginx

4.2 WSL 配置文件详解

/etc/wsl.conf -- Linux 侧配置:

[boot]
systemd=true

[interop]
enabled=true             # 启用 Windows/Linux 互操作(如 explorer.exe)
appendWindowsPath=true   # 将 Windows PATH 追加到 Linux PATH

[network]
generateResolvConf=true  # 自动生成 /etc/resolv.conf

[user]
default=feng             # 默认登录用户

%USERPROFILE%\.wslconfig -- Windows 侧配置(C:\Users\你的用户名.wslconfig):

[wsl2]
memory=8GB          # 限制最大内存(默认占系统内存的一半)
processors=4        # 限制 CPU 核心数
swap=4GB            # 交换空间大小
localhostForwarding=true  # 端口转发

[experimental]
autoMemoryReclaim=gradual  # 自动回收空闲内存
sparseVhd=true             # 磁盘空间自动回收

4.3 运行 GUI 应用

WSL2 支持运行 Linux GUI 应用(WSLg),无需额外配置:

# 安装一个 GUI 应用试试
sudo apt install x11-apps
xeyes

# 安装 Firefox
sudo apt install firefox
firefox &

# 安装 VS Code 的 Linux 版
sudo apt install code

GUI 窗口会直接显示在 Windows 桌面上,就像原生 Windows 应用一样。

五、开发环境搭建

5.1 推荐的日常开发工具

# 更新系统
sudo apt update && sudo apt upgrade -y

# 基础工具
sudo apt install -y git curl wget vim build-essential

# Node.js(推荐用 nvm 管理版本)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.bashrc
nvm install --lts

# Python(Ubuntu 24.04 自带 Python 3.12)
python3 --version

# Docker(启用 systemd 后)
sudo apt install -y docker.io
sudo usermod -aG docker $USER
# 重新登录后生效

5.2 VS Code 集成(强烈推荐)

在 WSL2 中安装 VS Code Server:

code .

第一次执行会自动下载 VS Code Server。之后 VS Code 会远程连接到 WSL2 环境,终端、文件浏览、调试全部在 Linux 中运行,体验和本地开发完全一致。

这种方式的好处:

  • VS Code 运行在 Windows,但文件和终端在 Linux
  • 兼得 Windows 的 GUI 体验和 Linux 的开发环境
  • 扩展自动安装到 WSL2 侧

5.3 Git 配置

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.autocrlf input   # 重要!Windows/Linux 换行符处理

六、常见问题排查

Q1:启动报错「参考的对象类型不支持尝试的操作」

# 以管理员身份运行
netsh winsock reset
netsh int ip reset all
# 重启电脑

Q2:DNS 解析失败,无法联网

# 手动设置 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 防止 WSL 覆盖
sudo chattr +i /etc/resolv.conf

Q3:内存占用过高

WSL2 默认可以占用系统内存的 50%。在 C:\Users\你的用户名\.wslconfig 中限制:

[wsl2]
memory=4GB

修改后执行 wsl --shutdown 生效。

Q4:磁盘占用越来越大

WSL2 的虚拟磁盘文件(vhdx)只会增大不会自动缩小。清理方法:

# 先关闭 WSL
wsl --shutdown

# 压缩磁盘(在 PowerShell 中执行)
diskpart
select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu\LocalState\ext4.vhdx"
compact vdisk
exit

或者在 .wslconfig 中启用自动回收(WSL 2.0+):

[experimental]
sparseVhd=true
autoMemoryReclaim=gradual

Q5:Windows 和 Linux 文件权限不一致

跨文件系统时文件权限会出错(如 Git 提示文件被修改)。解决方法:

# 在 /etc/wsl.conf 中添加
[automount]
options="metadata,umask=22,fmask=11"

这会让 Windows 分区在 Linux 中正确显示文件权限。

Q6:代理配了但某些工具不走代理

不同工具读取代理变量的方式不同:

  • curlwget:读取 http_proxy / https_proxy(小写)
  • gitgit config --global http.proxy http://127.0.0.1:10808
  • apt:需要单独配置 /etc/apt/apt.conf.d/proxy.conf
  • docker:配置 ~/.docker/config.json 或 systemd 的环境变量

建议大小写都设置,覆盖最广。

七、备份与迁移

7.1 导出发行版

wsl --export Ubuntu D:\backup\ubuntu-backup.tar

7.2 导入发行版

wsl --import Ubuntu-Backup D:\wsl\backup D:\backup\ubuntu-backup.tar

7.3 注销(删除)发行版

# ⚠️ 这会永久删除该发行版的所有数据!
wsl --unregister Ubuntu

八、总结

WSL2 让 Windows 拥有了一个真正的 Linux 环境,对于开发者来说是极大的便利。核心建议:

  1. 项目代码放在 Linux 文件系统/home/ 下),不要放 /mnt/c/
  2. 启用 systemd,让 Docker、Cron 等服务正常工作
  3. 配置好代理,解决国内网络问题
  4. 用 VS Code Remote 连接 WSL2 开发,体验最佳
  5. 定期清理磁盘,防止 vhdx 文件无限膨胀

掌握这些,你的 Windows 开发体验会提升一个台阶。