在 Windows 里养一只 Linux:WSL 完整指南
一、它是什么
WSL 的全称是”适用于 Linux 的 Windows 子系统”(Windows Subsystem for Linux)。微软官方定义很直接:一项让你在 Windows 计算机上运行 Linux 环境的功能,无需单独的虚拟机,也无需双系统启动。你可以在 Windows 的窗口里直接敲 Linux 命令、跑 Linux 程序、用 Linux 的包管理器装软件。
它最早在 2016 年随 Windows 10 周年更新亮相,2019 年推出 WSL 2,2025 年 5 月正式开源,代码托管在 GitHub 的 Microsoft/WSL 仓库。如今的 WSL 已经从 Windows 内置组件演变为通过 Microsoft Store 独立分发的包,更新节奏更快,社区也能直接向代码提交贡献。
二、架构:那个”看不见的虚拟机”
WSL 2 的核心是一个由微软管理的轻量级虚拟机,你不需要打开任何虚拟化软件去启动或关闭它,它随 WSL 的调用在后台运行,用完也不需要手动清理。
你的每一个 Linux 发行版(Ubuntu、Debian、Kali 等)都作为独立容器跑在这个虚拟机里。这些容器共享同一个 Linux 内核、同一个网络命名空间、同一套 CPU 和内存资源,但各自拥有独立的 PID、挂载和用户命名空间——你在 Ubuntu 里启动的进程和 Debian 里的进程互相看不见,文件系统也彼此隔离。这就是为什么你可以同时装好几个发行版而不会互相打架。
那个 Linux 内核由微软基于 kernel.org 最新稳定分支编译,针对 WSL 场景做了尺寸和性能优化,通过 Windows 更新推送安全补丁。你不需要像维护真服务器那样管内核版本,但代价是更新节奏跟着 Windows 走,而不是跟着上游发行版走。
三、WSL 1 与 WSL 2 的取舍
| 能力 | WSL 1 | WSL 2 |
|---|---|---|
| Windows 与 Linux 集成 | 支持 | 支持 |
| 快速启动 | 支持 | 支持 |
| 完整 Linux 内核 | 不支持 | 支持 |
| 完整系统调用兼容性 | 不支持 | 支持 |
| 跨 OS 文件系统性能(Windows 侧文件) | 更好 | 较差 |
| systemd 支持 | 不支持 | 支持 |
| 与 VirtualBox 共存 | 支持 | 不支持 |
WSL 1 本质上是一层系统调用翻译层:把 Linux 程序发出的请求实时转换成 Windows 内核能理解的操作。这种做法的优势在于文件系统访问——Linux 程序读写 Windows 盘上的文件时不需要跨虚拟机边界。但它无法完整模拟 Linux 内核行为,Docker 这类依赖深层内核特性的工具基本跑不起来。
WSL 2 用真内核换来了完整的系统调用兼容性,代价是跨操作系统文件系统的性能下降。微软官方数据:解压 tarball 时 WSL 2 比 WSL 1 快最多 20 倍,git clone、npm install、cmake 等操作快 2 到 5 倍——但前提是文件在 Linux 自己的文件系统里。把项目放在 /mnt/c/Users/... 下然后用 WSL 2 工具去编译,速度会明显慢于放在 ~/projects 里。这不是 bug,是架构决定的:每次文件访问都要跨越虚拟机边界。
WSL 2 与 VirtualBox 的兼容性问题也源于此。VMware 15.5.5 及以上版本可与 WSL 2 共存,但 VirtualBox 微软官方标注为不支持。如果同时依赖 VirtualBox 跑其他虚拟机,需要提前确认版本搭配。
四、安装与日常使用
在管理员权限的 PowerShell 里运行:
wsl --install
这条命令做了四件事:启用 WSL 和虚拟机平台两个 Windows 可选组件、下载 Linux 内核、把 WSL 2 设为默认版本、安装 Ubuntu 发行版。重启之后,Ubuntu 要求你创建一个 Linux 用户名和密码。
这个账号和 Windows 账号没有任何关系,它是该发行版的管理员,拥有 sudo 权限。密码在输入时屏幕上不显示任何字符——这是正常的盲打,不是键盘失灵。每个发行版有独立的账号体系,重装或重置发行版需要重新设置。
几个常用命令:
wsl --list --verbose:查看所有已安装发行版及其运行的 WSL 版本wsl --set-default-version 2:把新装发行版的默认版本锁定在 2wsl -u root:以 root 身份进入默认发行版(忘记密码时用,然后passwd <用户名>重置)
发行版内部的软件更新需要你自己管,Windows 不会自动帮你 apt upgrade。定期跑 sudo apt update && sudo apt upgrade 是基本习惯。
五、它能做什么,边界在哪
能跑的东西比很多人以为的多:
- 命令行工具链:Bash、grep、sed、awk、vim、emacs、tmux 直接可用
- 语言环境:Node.js、Python、Ruby、Rust、Go 都有成熟安装路径
- 服务端软件:MySQL、PostgreSQL、Apache、MongoDB 可装在 WSL 里做本地开发和测试
- 图形界面:通过 WSLg 组件,Linux 图形应用可直接显示在 Windows 桌面上,无需额外配置 X 服务器
- GPU 加速:有独立显卡时,WSL 可用它加速 Linux 环境里的机器学习任务
它不适合什么:
- 替代生产环境的 Linux 服务器
- 需要完整硬件直通或自定义内核模块的场景
- 与 VirtualBox 同时使用的场景
六、一句话总结
WSL 解决的核心问题很具体:当一个开发者同时生活在 Windows 和 Linux 两个生态里时,怎样让切换成本尽可能接近零。它保留了隔离性,但砍掉了”完整操作系统”的冗余——不用配置虚拟机、不用手动启停、内存动态借还。在这个定位内,它做得相当彻底。
用之前只需记住一条铁律:把项目放在 Linux 自己的文件系统里(~/ 下),用 Linux 的工具处理它。跨到 /mnt/c/ 去操作,性能会惩罚你。