WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)是微软官方提供的、在 Windows 系统内原生运行 Linux 环境的功能。通俗地说:装了 WSL,你不需要安装虚拟机、不需要折腾双系统,直接在 Windows 里打开终端就能使用 Ubuntu 的命令行、安装 Linux 软件、运行 Linux 开发的程序,Windows 与 Linux 之间还能共享文件、互调命令。

WSL简介

WSL 2 是当前推荐版本——它是运行在轻量虚拟机里的真实 Linux 内核,兼容性远好于第一代。

  • WSL 1(2016 年推出)把 Linux 的系统调用”翻译”成 Windows 调用,不需要虚拟机,但与真实 Linux 内核不兼容,很多依赖内核功能的软件(比如 Docker)无法运行;
  • WSL 2(2020 年推出)改为在轻量虚拟机中运行一个由微软维护的真实 Linux 内核,兼容性大幅提升,性能也更快,代价是内存占用略高、跨系统文件访问变慢。今天安装 WSL,默认就是 WSL 2。
对比项 WSL 1 WSL 2
架构 系统调用翻译层 轻量虚拟机 + 真实 Linux 内核
Linux 内核兼容性 不完整 完整(可运行 Docker)
Linux 文件系统内性能 较快 更快
跨系统文件访问(/mnt/c) 较快 较慢(走 9P 协议)
内存占用 较低 可通过 .wslconfig 限制
启动速度 秒级 秒级(按需启动)

WSL的安装

运行 WSL 2 需要:Windows 10 版本 2004(Build 19041)及以上,或 Windows 11;64 位 CPU 并在 BIOS/UEFI 中开启了虚拟化(Intel 的 VT-x、AMD 的 SVM/AMD-V);安装时使用管理员权限。Windows 11 用户开箱即用,老版本 Windows 10 可能需要手动启用两个 Windows 功能。

以管理员身份打开 PowerShell 或命令提示符,执行下面这条命令,它会自动安装 WSL 2 所需的全部组件,并安装默认发行版 Ubuntu:

wsl --install

安装完成后按提示重启电脑。重启后首次启动 WSL,会让你设置一个 Linux 用户名和密码——注意这个账户与你的 Windows 账户无关,只用于 Linux 侧。想装别的发行版(如 Debian、Kali、openSUSE),用 wsl –install -d 发行版名:

wsl --install -d Debian

发行版管理常用命令

安装完成后,下面的命令会陪伴你的日常使用:wsl -l -v 列出所有已安装发行版及其 WSL 版本;wsl –set-version 发行版 2 把某个发行版切换到 WSL 2;wsl –set-default 发行版 设置打开终端时的默认发行版;wsl –update 更新 WSL 内核;wsl –shutdown 关闭所有正在运行的 WSL 实例(修改 .wslconfig 配置后需要执行它才会生效)。

wsl -l -v
# 输出示例(NAME 与 VERSION 列为关键信息):
#   NAME            STATE           VERSION
# * Ubuntu          Running         2
wsl --set-version Ubuntu 2
wsl --set-default Ubuntu

为了直观理解 WSL 2 的组成,下面这张图展示了它的分层架构:最上层是 Windows 应用(终端、VS Code、资源管理器),中间是 Windows 主机系统和虚拟化平台,核心是 WSL2 轻量虚拟机(Linux 用户空间 + 真实内核),底层是物理硬件。右侧是三条与 Windows 互操作的通道。

WSL2 由”应用层 → Windows 主机 → 轻量虚拟机(用户空间 + 真实内核)→ 物理硬件”四层组成,文件与命令通过三条通道与 Windows 交换。

文件系统与 Windows 互操作

记住一条原则:项目文件放在 Linux 侧(/home 下),通过 /mnt/c 和 \\wsl$ 两个通道与 Windows 交换文件。WSL 里有两套文件系统:一套是 Linux 本身的文件系统(发行版被安装在一个虚拟磁盘 vhdx 里),另一套是自动挂载进来的 Windows 磁盘。搞清楚它们的访问方式,就能在两边自如穿梭。

从 Windows 访问 Linux 文件

在资源管理器地址栏输入 \\wsl$\Ubuntu\home\你的用户名 或 \\wsl.localhost\Ubuntu\home\你的用户名,就能像浏览普通文件夹一样看到 Linux 侧的文件。更快的办法是在 WSL 终端里直接运行 explorer.exe .,会用资源管理器打开当前目录——这就是 WSL 的”命令互调”能力,下面会细说。

cd ~
explorer.exe .

从 Linux 访问 Windows 文件

Windows 的每个盘符都被自动挂载到 /mnt 下:C 盘对应 /mnt/c,D 盘对应 /mnt/d,以此类推。在 Linux 里访问 Windows 桌面文件,就是切换目录的事:

cd /mnt/c/Users/你的Windows用户名/Desktop
ls -lah

文件应该放在哪边?

这是新手最容易踩的坑:跨系统访问(如 WSL 里读写 /mnt/c 下的文件)走 9P 协议,速度明显慢于纯 Linux 侧读写。数据库、npm 依赖、项目代码这类有大量小文件读写的场景,放在 /mnt/c 下会明显变慢。正确姿势是:代码和项目放 Linux 侧(/home/你的用户名/),需要分享给 Windows 的内容(比如文档、截图)再放到 /mnt/c 或通过 \\wsl$ 拿出去。

场景 推荐位置 原因
项目代码、数据库、npm 依赖 Linux 侧 /home/用户名 访问速度快,跨系统协议开销大
与 Windows 软件共享的文档/图片 /mnt/c/… 或 \\wsl$ 取回 需要 Windows 侧软件直接打开
Windows 上已有的工作目录 继续留在 /mnt/c 避免两边各存一份造成混乱

命令互调:Windows ↔ Linux 双向执行

WSL 最强的体验是”互调”:在 Windows 终端里,可以用 wsl 命令 直接执行 Linux 命令而不进入交互界面;在 Linux 终端里,可以调用 .exe 程序(Windows 的可执行文件默认加入 Linux 的 PATH)。几个高频用法:

# 在 Windows PowerShell 里执行 Linux 命令
wsl ls -la /home
wsl bash -c "echo '来自 Linux 的输出'"

# 在 WSL 里调用 Windows 程序
notepad.exe 笔记.txt        # 用 Windows 记事本打开文件
explorer.exe .              # 用资源管理器打开当前目录
/mnt/c/Windows/System32/ipconfig.exe   # 查看 Windows 网络配置

# 管道互传:把 Linux 输出复制到 Windows 剪贴板
ls -lah | clip.exe

剪贴板与图形程序

WSL 与 Windows 的剪贴板默认互通:Linux 里复制的内容可以粘贴到 Windows 程序,反之亦然。Windows 11 还内置了 WSLg,在 WSL 里直接运行带界面的 Linux 程序(比如 gedit、firefox),窗口会像普通 Windows 程序一样弹出来,无需额外配置。

日常使用与高频命令

日常使用就三件事:用 apt 装软件、用 ls/cd 管理文件、用 systemd 管理服务,建议把 Windows Terminal 设为默认终端。WSL 里的 Linux 环境与一台真实的 Linux 服务器没有区别,下面按使用频率介绍最常用的一组命令。

包管理器 apt(Ubuntu / Debian)

apt 是 Ubuntu 系的软件包管理器,语法为 sudo apt 子命令 [选项] 包名。sudo 表示以管理员权限执行,首次使用会要求输入你设置的 Linux 密码。核心子命令如下:

子命令 作用 示例
update 刷新软件源索引(安装前先执行) sudo apt update
upgrade 升级所有已安装软件 sudo apt upgrade
install 安装一个或多个软件包 sudo apt install git
search 按关键词搜索软件包 apt search python3
remove 卸载软件包(保留配置文件) sudo apt remove vim
autoremove 清理不再需要的依赖 sudo apt autoremove

一条命令安装多个包,用空格分隔即可;安装前习惯先 update 再 install,避免装到过期版本:

sudo apt update
sudo apt install git curl wget

# 搜索再安装:先确认包名
apt search python3 | head -20
sudo apt install python3-pip python3-venv

文件与目录操作

最常用的文件命令与 Windows 的对应关系:ls(列目录,相当于 dir)、cd(切换目录)、pwd(显示当前路径)、cp(复制)、mv(移动/重命名)、rm(删除)、mkdir(新建目录)。特别提醒:Linux 的删除不可逆,rm -rf 会把目录连同内容一起永久删除,没有回收站,使用前务必三思。

ls -lah          # 列出所有文件,-l 显示详情,-a 含隐藏文件,-h 人性化大小
cd /home/你的用户名   # 进入指定目录;cd .. 返回上级;cd ~ 回到家目录
mkdir -p 项目/子目录   # 递归创建多层目录
cp -r 项目 项目备份   # -r 递归复制整个目录
mv 旧名.sh 新名.sh   # 重命名
rm -rf 临时目录      # 危险!永久删除目录及内容

systemd 服务管理

较新版本的 WSL 默认启用 systemd(Linux 的服务管理器),意味着可以像管理真实服务器一样管理后台服务。常用操作:systemctl status 服务名 查看状态,start/stop/restart 启停,enable 设置开机自启(WSL 里指每次启动发行版时自动运行)。例如让 SSH 服务随 WSL 启动:

sudo systemctl enable --now ssh
systemctl status ssh

# 查看所有正在运行的服务
systemctl list-units --type=service --state=running | head -20

终端、用户与权限

微软官方推荐的终端是 Windows Terminal(Microsoft Store 免费安装),它可以同时开多个标签页,每个标签页进入不同发行版,还支持自定义配色。在 WSL 里,whoami 查看当前用户,sudo su – 切换到 root,exit 退出当前会话。权限方面,Linux 用”读 r / 写 w / 执行 x”三位权限位控制访问,普通场景只需会用 chmod +x 文件 给脚本添加执行权限:

whoami
chmod +x 我的脚本.sh
./我的脚本.sh     # 直接运行脚本

网络与代理

WSL2 使用 NAT 网络模式:Linux 侧访问外网默认没问题;Linux 里访问 Windows 主机上运行的服务(如 3306 端口的 MySQL),可用网关 IP(ip route | grep default 查看),或利用 WSL 的 localhost 转发特性——Windows 侧访问 WSL 里的服务直接填 localhost 即可。如果 Windows 开了代理软件,Linux 侧需要手动指定代理变量:

# 查看默认网关(即 Windows 主机在 WSL 网络中的地址)
ip route | grep default

# 为当前会话设置代理(端口以你的代理软件为准,常见 7890 / 10809)
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

搭建开发环境

开发环境四件套——Git、Python、Node.js、Docker——全部装进 WSL,再用 VS Code 的 Remote 扩展连接,就是一套完整的 Linux 开发环境。下面按”装好就能用”的顺序逐步来。

Git 与 SSH 密钥

Git 是代码版本管理工具,也是和 GitHub/Gitee 等平台交互的基础。安装后先配置用户名和邮箱,再生成 SSH 密钥并添加到代码托管平台,实现免密推送。

sudo apt update
sudo apt install git

# 配置身份(换成你的信息)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

# 生成 SSH 密钥并查看公钥
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
cat ~/.ssh/id_ed25519.pub
# 把输出的公钥粘贴到 GitHub → Settings → SSH and GPG keys → New SSH key

# 测试连接(GitHub 返回 Hi 你的名字 即成功)
ssh -T git@github.com

Python

Ubuntu 自带 Python 3,再补上 pip(包安装器)和 venv(虚拟环境)即可。强烈建议每个项目建一个虚拟环境,避免依赖互相污染:

sudo apt install python3 python3-pip python3-venv

# 进入项目目录,创建并激活虚拟环境
cd ~/my-project
python3 -m venv .venv
source .venv/bin/activate
pip install requests pandas
# 退出虚拟环境
deactivate

Node.js(用 nvm 管理版本)

不推荐直接用 apt 装 Node.js(版本往往偏旧),更优雅的方式是用 nvm(Node 版本管理器)按需安装任意版本。安装 nvm 后需要重新打开终端或执行 source ~/.bashrc 使其生效:

# 安装 nvm(版本号以 nvm 官方仓库最新版为准)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

# 安装并使用 LTS 版 Node.js
nvm install --lts
nvm use --lts
node -v
npm -v

Docker

Docker 是运行容器化应用的标准工具,WSL2 对它有官方支持,两种装法任选。方式一(省事):在 Windows 侧安装 Docker Desktop,设置里勾选”Use the WSL 2 based engine”并打开 WSL Integration,之后在 WSL 里直接使用 docker 命令。方式二(纯 Linux 工作流):在 WSL 内安装 docker engine:

# 方式二:WSL 内安装 docker engine(Ubuntu)
sudo apt install docker.io
sudo systemctl enable --now docker

# 验证安装
docker run hello-world
docker ps -a

数据库与常用服务

MySQL、PostgreSQL、Redis 等服务用 Docker 容器跑最省心,一条命令启动、一条命令删除,不污染系统。以 MySQL 8 为例(把密码换成你自己的):

docker run --name mysql8 \
  -e MYSQL_ROOT_PASSWORD=你的密码 \
  -p 3306:3306 \
  -d mysql:8

# 查看容器状态;进入容器内的 mysql 命令行
docker ps
docker exec -it mysql8 mysql -uroot -p

VS Code 无缝连接

在 Windows 侧安装 VS Code 后,再安装官方扩展”WSL”(在扩展市场搜索 WSL,属于 Remote Development 系列)。之后在 WSL 终端里进入项目目录执行 code .,VS Code 会以”远程”模式重新打开,编辑、调试、终端全部跑在 Linux 环境里,体验与本地开发完全一致。

cd ~/my-project
code .

性能调优与常见问题排查

大多数”卡顿、内存吃满、启动失败”问题,都能靠 .wslconfig 限流和 wsl –shutdown 重置解决。WSL2 默认按需分配内存(上限约为物理内存的 50%)并自动回收,但如果你同时跑数据库和容器,可能希望手动限制资源,此时就需要 .wslconfig。

用 .wslconfig 限制内存与 CPU

在 Windows 侧创建文件 C:\Users\你的Windows用户名\.wslconfig(注意没有扩展名),写入以下内容后保存,再执行 wsl –shutdown 并重新打开 WSL 即生效:

[wsl2]
memory=4GB
processors=4
swap=2GB
localhostForwarding=true

磁盘瘦身(vhdx 膨胀)

WSL 的虚拟磁盘(ext4.vhdx)只增不减:装过的软件、删掉的文件不会真正释放磁盘空间,需要手动压缩。步骤是先 wsl –shutdown 关闭 WSL,再用 Windows 自带的 diskpart 压缩虚拟磁盘。vhdx 的默认位置形如 C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu*\LocalState\ext4.vhdx(发行版不同路径略有差异,可全盘搜索 ext4.vhdx 定位)。较新版本的 WSL 还支持直接启用稀疏磁盘:wsl –manage 发行版 –set-sparse true,之后删除的文件会真正释放空间。

# 第一步:在 PowerShell 中关闭所有 WSL 实例
wsl --shutdown

# 第二步:在 diskpart 中压缩 vhdx(交互式命令,逐行输入)
diskpart
select vdisk file="C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu*\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

常见错误速查表

错误 / 症状 原因 解决办法
0x80370102 BIOS 中未开启虚拟化 重启进 BIOS/UEFI,开启 VT-x 或 SVM,保存重启
0x800701bc WSL 内核缺失或过旧 运行 wsl –update 更新内核,必要时重启
WSL 未安装(command not found) wsl.exe 不可用 以管理员运行 wsl –install,重启电脑
忘记 Linux 密码 PowerShell 中运行 wsl -u root,进入后执行 passwd 你的用户名
C 盘空间被占满 vhdx 只增不减 按 5.2 压缩磁盘,或迁移发行版到其他盘
WSL 启动失败 / 发行版损坏 配置或文件损坏 wsl –unregister 发行版 重置(先备份数据,重置会删除该发行版全部内容)
中文显示乱码 locale 未配置中文 sudo apt install language-pack-zh-hans,再执行 sudo update-locale LANG=zh_CN.UTF-8

备份与迁移

WSL 支持把整个发行版导出为 tar 文件,方便备份或迁移到其他电脑/磁盘。导出时发行版需处于关闭状态:

# 导出(备份)
wsl --shutdown
wsl --export Ubuntu D:\backup\ubuntu-backup.tar

# 导入(恢复到新位置;注意导入后默认用户可能变为 root)
wsl --import Ubuntu D:\wsl\ubuntu D:\backup\ubuntu-backup.tar

几个提升体验的小技巧

打开 WSL 时直接进入家目录:wsl –cd ~。如果你不希望 Windows 的 PATH 自动注入 Linux(有时会导致命令冲突),在 Linux 侧编辑 /etc/wsl.conf 关闭它:

[interop]
appendWindowsPath = false

[boot]
systemd = true

保存后执行 wsl –shutdown 再重新进入即可生效。另外,WSL 官方提供 wsl –version 查看 WSL 自身版本,升级 WSL 本体用 wsl –update。

参考文献 / 扩展阅读

0