你可能已经在各种开发社区里反复看到过 WSL2 这个词,它全称 Windows Subsystem for Linux 2,说人话就是:在 Windows 系统里直接跑一个真正的 Linux 内核,不是模拟器,也不是虚拟机,而是微软把完整的 Linux 内核整合进了操作系统。这篇文章我会从零开始,把下载 WSL2、完整安装、配置 Ubuntu、接上 Docker 和 CUDA、再把图形界面也折腾出来的整个过程讲清楚,每一步都附上实际的命令和踩坑记录。如果你是第一次接触 WSL2,跟着做就行;如果你是在 Windows Server 2022 上,或者从 WSL1 怎么都升不到 WSL2,也能在这里找到对应的解法。
1. 理解 WSL2:本质、差异与适用场景
1.1 为什么需要 WSL2,它解决了什么问题
以前在 Windows 上跑 Linux 只有三种路子:装双系统,每次重启切换;装虚拟机(VMware/VirtualBox),完整启动一个图形化系统,吃内存吃 CPU;再就是装 Git Bash、Cygwin 这类模拟层工具,只是长得像 Linux,实际上不是。WSL2 的出现把这些问题基本都抹平了:它启动只需要一两秒,内存按需动态分配,不占用额外 CPU,而且因为是一个真正的 Linux 内核,所以 apt、systemd、原生 Docker、CUDA 这些都能直接跑,兼容性比 WSL1 那种翻译层方式高了一大截。
我个人的体验是,以前很多项目必须在云 Linux 服务器上跑,本地 Windows 只用来写代码,来回传文件、开调试端口,效率低得让人抓狂。有了 WSL2 之后,本地就可以当作一台低配 Linux 服务器,开发、验证、部署脚本全在同一个环境里跑,再也不用担心“我本机上能跑,服务器上就挂了”这种玄学问题。对于做运维、搞后端、学数据科学的人,这是 Windows 下最值得折腾的基础设施。
1.2 WSL1 和 WSL2 的差异与选型建议
WSL1 是把 Linux 系统调用翻译成 Windows 系统调用,相当于一个兼容层,所以启动极快,跨文件系统访问也没什么障碍,但有些依赖 Linux 内核特性的软件(比如 Docker、需要 inotify 的框架)跑不了或者行为奇怪。WSL2 则是用一个轻量虚拟机去跑真正的 Linux 内核,兼容性大幅提升,代价是跨文件系统读写性能有所下降、内存占用会随内核分配。
| 对比项 | WSL1 | WSL2 |
|---|---|---|
| 架构 | 系统调用翻译层 | 轻量虚拟机(真实Linux内核) |
| 启动速度 | 极快 | 快,秒级启动 |
| Linux内核兼容性 | 不完整 | 完整 |
| 跨文件系统性能 | 较好 | 明显下降 |
| Docker/GPU/CUDA | 不支持 | 原生支持 |
| 内存/CPU占用 | 较低 | 按需分配,默认占满可达100% |
| 适用场景 | 快速脚本、文件互操作 | 服务端开发、容器、GPU计算 |
现在新安装的 WSL 默认就是 WSL2,不建议再装 WSL1。如果你手头已经有 WSL1 发行版,可以之后用命令升级到 WSL2。后面第 3 章我会详细说明怎么切换。简单来说,没有特殊历史包袱的情况下,直接锁死 WSL2 就是最佳选择。
2. 安装前的准备:系统要求与下载选择
2.1 先检查自己的 Windows 版本和支持情况
在动手之前,先确认系统版本是否支持。WSL2 要求 Windows 10 版本 1903 及以上,且内部版本号在 18362 以上(也就是 2019 年中以后的版本),Windows 11 全系支持。Windows Server 2019/2022 也支持,但需要一些额外步骤,这个我放到第 5 章单独讲。
按Win + R,输入winver,就能看到版本和内部版本号。如果版本太低,先把 Windows 系统更新到最新,否则后面很可能遇到“无法安装”“找不到功能”之类的问题。另外需要确认 CPU 支持虚拟化。在任务管理器——性能——CPU 页面右下角,找到“虚拟化”一栏,显示“已启用”就说明 BIOS 里已经开好了。
如果显示“已禁用”,需要重启进 BIOS,找到 Intel VT-x / AMD-V / SVM Mode 之类的选项打开。这一步很多人在最开始就忽略,结果后面装好了 WSL2,一启动发行版就报错:“Please enable the Virtual Machine Platform...”,折腾半天才发现问题是虚拟化开关没开。我建议动手前花一分钟看掉这个,能省很多事。
2.2 启用必要的 Windows 功能
WSL2 依赖两个 Windows 功能:适用于 Linux 的 Windows 子系统和虚拟机平台。在控制面板——程序和功能——启用或关闭 Windows 功能,把这两个勾选上。也可以直接用 PowerShell(管理员模式)一次性执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启系统。请注意,VirtualMachinePlatform是 WSL2 专属,系统里只有 WSL1 的话这个功能通常不会出现,所以很多人从 WSL1 升级到 WSL2 失败,根本原因就是没开它。开启之后再重新执行升级命令,一般就能成功。
2.3 下载 WSL2 的几种途径
这里必须澄清一个概念:WSL2 不是像 QQ 安装包那样的单个文件,它由“功能组件+内核更新包+发行版镜像”三部分组成。所以“下载 WSL2”实际上可能涉及三个下载动作。
第一种途径是通过应用商店下载发行版。打开 Microsoft Store,搜索 Ubuntu,选择你想要的版本(比如 Ubuntu 22.04.3 LTS),点击获取即可。商店里只下载发行版镜像,底层运行所需的内核和功能组件由系统负责更新。
第二种途径是下载 WSL2 内核更新包。微软官方提供wsl_update_x64.msi这个独立安装包,专门用于 Windows 10 1903~1909 等无法自动获取内核的环境。下载后双击安装,安装完成后需要打开 PowerShell 执行:
wsl --set-default-version 2这样后续安装的发行版就默认跑在 WSL2 上了。
第三种途径是离线和批量部署场景,比如内网机器没有外网。这种情况可以在联网机器上用wsl --export导出已经安装好的发行版为.tar文件,然后在目标机器上用wsl --import导回。具体导入导出命令在第 5 章会展示。
我的建议是:不是特别老的系统就用最简单的wsl --install,一条命令把功能、内核和默认发行版全部装好,这也是微软现在推荐的方式。
3. 一步步安装 WSL2 与 Ubuntu(含完整命令细节)
3.1 全新安装:一条命令完成 WSL2 + Ubuntu
如果你的 Windows 版本较新(Windows 11 或更新过的 Windows 10),可以在管理员 PowerShell 中运行:
wsl --install这条命令会完成三件事:启用 WSL 功能、启用虚拟机平台、自动安装默认的 Ubuntu 发行版。默认安装的是最新 Ubuntu LTS 版本,目前是 Ubuntu 24.04。安装结束后系统通常要求重启,重启后自动弹出 Ubuntu 终端,提示你创建用户名和密码。这个用户名不是 Windows 用户名,是 Linux 内独立的账号,注意别搞混。
如果想指定版本,可以在安装时用:
wsl --install -d Ubuntu-22.04如果想看商店里有哪些可用的发行版,执行:
wsl --list --online输出里会列出 Ubuntu、Debian、kalilinux、openSUSE 等一堆名字。把名字对应到-d参数后面就能安装指定发行版。这个技巧在需要固定版本训练或验证环境时非常有用,比如很多项目依赖 Ubuntu 20.04 的老版本 Oxygen 库,直接装 22.04 可能会有兼容问题。
3.2 手动安装:老版本 Windows 或商店不可用的完整流程
如果你的系统版本较老,或者使用的是 Windows Server 2022(默认没有 Microsoft Store,即便打开商店也经常下载失败),就需要手动完成每一步。流程如下:
第一步:启用功能
管理员 PowerShell 执行前面第 2.2 节里的两条dism命令,重启。
第二步:下载并安装 WSL2 内核更新包
从微软官方下载wsl_update_x64.msi,双击完成安装。这个包只有十几兆,主要解决老系统内核更新问题。
第三步:设置默认版本
管理员 PowerShell 执行:
wsl --set-default-version 2如果命令成功会提示 “For information about key differences with WSL 2...” 之类的内容,说明 WSL2 已经成为默认版本。如果报错,大概率是虚拟机平台功能没开或者没重启,回去检查一下。
第四步:安装发行版
在 Microsoft Store 里安装 Ubuntu,或者直接访问 Ubuntu 官网下载.appx/.appxbundle安装包。手动下载的包在 PowerShell 里用Add-AppxPackage安装。安装后用开始菜单打开 Ubuntu 图标,完成初始化账号设置。
整个过程会比wsl --install繁琐一些,但胜在可控。尤其是 Server 系统上,商店经常抽风,手动下载.appx是最可靠的路子。
3.3 安装指定版本的 Ubuntu:20.04 和 22.04 怎么选
WSL2 对发行版的版本支持是按需下载的,所以才可能有“WSL2 安装 Ubuntu 20.04”“WSL2 安装 Ubuntu 22.04”这类搜索词。当前 Ubuntu 长期支持版本有 20.04、22.04、24.04。选哪款主要看你要跑什么:
| 发行版 | 内核版本基础 | 适用人群 |
|---|---|---|
| Ubuntu 20.04 | 基于 20.04 LTS,软件源成熟 | 老项目、ROS Noetic、部分嵌入式工具链 |
| Ubuntu 22.04 | LTS,兼容性更广 | 大多数开发任务、深度学习环境、Docker 服务 |
| Ubuntu 24.04 | 最新 LTS | 尝试新特性的场景,但部分旧软件源可能没跟上 |
我个人的建议是初次使用直接装 22.04,这个版本经历了两年多的补丁,踩坑资料最全。如果后面有特定需求,再wsl --install -d Ubuntu-20.04装第二个发行版,WSL2 完全支持多个发行版共存,切换命令是:
wsl -d Ubuntu-20.04 wsl -d Ubuntu-22.04同一个内核上挂多个 Linux 环境,互不干扰,这种能力真的很适合测试软件在不同发行版上的行为。
4. 装完别急着用:环境配置与扩展重点
4.1 检查 WSL2 状态和调整资源占用
安装完成后,先打开 PowerShell 跑两个命令熟悉下状态:
wsl --status wsl --list --verbosewsl --status会显示默认版本是不是 WSL2;wsl --list --verbose会列出所有已安装的发行版,并标明每个发行版当前是 VERSION 1 还是 VERSION 2。如果你看到的版本是 1,可以用命令升级:
wsl --set-version Ubuntu-22.04 2升级过程可能需要一两分钟,输出提示转换完成后,这个发行版就跑在 WSL2 内核上了。
内存占用是很多人抱怨的点。WSL2 默认“看到”多少内存就尽量用多少,Windows 会被挤得内存吃紧。解决办法是在用户目录下创建.wslconfig文件(路径类似C:\Users\你的名字\.wslconfig),写入限制:
[wsl2] memory=4GB processors=4 swap=0保存后在 PowerShell 里执行:
wsl --shutdown再重新进入 WSL2,配置就生效了。这里的memory=4GB表示最多给 WSL2 分配 4GB 内存,processors=4限制 CPU 核心数。如果你的机器内存只有 8GB,建议把 WSL2 内存限制在 4GB 以内,不然宿主机经常卡顿。
4.2 在 Windows 环境里把 WSL2 和 Docker 组合起来
Windows 环境安装 WSL2 和 Docker 的正确打开方式是安装 Docker Desktop,并在设置里选择一个带有 WSL2 的集成方案。具体步骤:
第一步:在 Windows 安装 Docker Desktop
去官网下载 Docker Desktop for Windows,安装时保持默认选项,保证选中“Use WSL 2 based engine”。安装后 Docker Desktop 会自动检测 WSL2 环境,并创建一个名为docker-desktop的 WSL 发行版。
第二步:在 Docker Desktop 设置里开启 WSL 集成
进入 Settings → Resources → WSL Integration,把你要使用的发行版(比如 Ubuntu-22.04)开关打开。这样在 WSL2 里面直接敲docker命令,就会走 Windows 上 Docker Desktop 的引擎,不需要在 Linux 里再单独装一套 Docker。
第三步:验证
在 Ubuntu 终端里执行:
docker --version docker run hello-world能正常输出版本和运行信息,就说明 Docker 环境已经通了。
如果你不想用 Docker Desktop,也可以在 WSL2 内部直接安装 Docker Engine:
sudo apt update sudo apt install docker.io sudo systemctl enable docker --now这种方式的好处是不依赖图形界面程序,资源占用略低,缺点是 Docker 容器端口映射和 Windows 防火墙配置要自己管。我现在的习惯是:日常开发用 Docker Desktop 集成,跑资源敏感的任务时直接在 WSL2 内启动 Docker,灵活切换。
4.3 在 WSL2 中安装 CUDA:让显卡真正跑起来
WSL2 一个被严重低估的能力是原生 GPU 加速。只要 Windows 上安装的 NVIDIA 驱动版本足够新(460.89 及以上),并且完成 CUDA on WSL 的配置,WSL2 内部就能直接使用显卡计算,不需要在 WSL 里单独安装显卡驱动。这个特性对做深度学习、跑 Stable Diffusion、或者搞 CUDA 编程的人非常实用。
第一步:在 Windows 侧安装 NVIDIA 驱动
注意这里说的是 Windows 版本驱动,不是 Linux 版本。到 NVIDIA 官网下载对应型号的 Windows 驱动装好即可。装完在 Windows 命令行里执行:
nvidia-smi能看到显卡信息和驱动版本就说明基础环境就绪。
第二步:在 WSL2 里安装 CUDA Toolkit
进入 Ubuntu,安装官方提供的 CUDA Toolkit for WSL2:
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt-get update sudo apt-get install -y cuda-toolkit安装过程比较大,建议网络环境可靠时一次性装完。如果只做推理不需要编译,可以装上更轻量的cuda-toolkit子集或直接用 conda 里的 CUDA 运行时。
第三步:验证 GPU 能力
nvidia-smi在 WSL2 终端里如果能看到和 Windows 侧一致的显卡信息,说明 GPU 已经被 WSL2 认出来。用 Python 测试一下:
import torch print(torch.cuda.is_available()) print(torch.cuda.device_count())能输出True,就说明 CUDA 环境完全跑通了。实际使用中我踩过最大的坑是 Windows 驱动更新后,WSL2 内部的 CUDA 相应版本不匹配,这时候只需要重新安装一次 CUDA Toolkit,让它随驱动版本自动对齐。
4.4 给 WSL2 配上图形界面:从 WSLg 到 X11 转发
很多人以为 WSL2 只能敲命令,其实它也能跑图形程序。Windows 11 自带 WSLg,安装完 WSL2 后无需任何配置,直接在终端里敲code .或者启动一个 Linux GUI 应用,窗口就会弹出来。Windows 10 用户则需要用 X 服务器配合环境变量来实现。
Windows 10 的教程我实测过,流程如下:
第一步:在 Windows 侧安装 VcXsrv
下载安装 VcXsrv,启动时注意勾选“Disable access control”,否则 WSL2 里的图形程序会因为权限问题连不上。
第二步:在 WSL2 里配置 DISPLAY 环境变量
在~/.bashrc末尾加一行:
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0保存后执行source ~/.bashrc。这里的原理是,WSL2 使用 NAT 网络,Windows 侧的 X 服务器在网关 IP(也就是/etc/resolv.conf里的 nameserver)上监听。
第三步:安装并启动图形软件
以 GIMP 为例:
sudo apt update && sudo apt install gimp -y gimp这样就能看到 GIMP 图形界面弹出。这个方法在 Windows 10 上跑 Linux 桌面应用非常实用,比如 RStudio、Blender、Qt 程序都能用。不过需要注意性能和缩放表现,高 DPI 屏幕下部分应用会有点模糊,这是 X11 转发的固有问题,没法完全根治。如果图形程序用得频繁,我建议升级到 Windows 11,用 WSLg 体验好得多。
5. 高频问题排查:从 WSL1 升不到 WSL2 到 Server 2022 的坑
5.1 已有 WSL1,怎么都切不到 WSL2 怎么处理
“WSL1 改不成 WSL2”是我看搜索记录里出现频率很高的一个说法。一般表现为执行:
wsl --set-version Ubuntu-20.04 2等了很久之后提示:
Conversion in progress... Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.或者干脆卡住不动。原因基本是三个:虚拟机平台功能没启用、BIOS 虚拟化没开启、内核更新包没装。解决顺序是:
- 确认虚拟机平台已启用:管理员 PowerShell 跑
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart,然后重启。 - 确认 BIOS 虚拟化已开启:任务管理器里查看“虚拟化”是否“已启用”。
- 确认内核更新包已装:打开“应用和功能”搜“Windows Subsystem for Linux”,看能否看到内核版本信息。没有就下载
wsl_update_x64.msi装上。
还有一个冷门原因:发行版系统盘空间不足。转换过程需要一点额外空间,如果系统盘快满了,就跑到一半失败。清理一下磁盘再重试就能过。
5.2 Windows Server 2022 上安装 WSL2 的额外细节
Windows Server 2022 装 WSL2 比客户端系统要麻烦一些。这个系统默认没有 Microsoft Store,即使手动打开商店也可能因为依赖问题无法使用。我在 Server 上装 WSL2 的实测流程是:
第一步:安装功能
管理员 PowerShell:
Install-WindowsFeature -Name Microsoft-Hyper-V, Containers接着与第 2.2 节相同,启用 WSL 和虚拟机平台功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启。
第二步:手动下载发行版包
由于 Server 上没有商店,需要在有网络的机器上从微软网站下载 Ubuntu 的.appx包(比如用浏览器打开 Ubuntu 在 Microsoft Store 页面里的官方下载链接),把.appx后缀改为.zip解压,然后在解压目录执行:
.\ubuntu.exe install或者直接用:
Add-AppxPackage .\Ubuntu.appx就能把发行版注册进去。
第三步:设置版本
照旧执行wsl --set-version Ubuntu-22.04 2。Server 2022 上最容易犯的错是跳过了VirtualMachinePlatform功能,直接去跑--set-version 2,结果一直失败。先确认两个功能都启用,再谈升级。
5.3 迁移发行版位置和备份还原
WSL2 的发行版默认安装在 C 盘,用一阵子之后体积可能膨胀到几十 GB,把系统盘挤爆。我强烈建议从初始阶段就把发行版迁移到其他盘。流程:
先终止要迁移的发行版:
wsl --shutdown导出当前发行版为 tar 文件:
wsl --export Ubuntu-22.04 D:\wsl-ubuntu.tar从 WSL 中注销当前发行版:
wsl --unregister Ubuntu-22.04再导入到目标目录:
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-ubuntu.tar导入后注意默认用户会变成 root。可以通过在 WSL 里修改/etc/wsl.conf加入:
[user] default=你的用户名让下次启动切回普通用户。这个方法也是备份和还原的万能解法,我在重装系统前一定会把重要发行版先导出。
5.4 网络访问与文件共享的几个小经验
WSL2 是 NAT 网络,IP 地址每次重启都会变。因此从 Windows 访问 WSL 里的服务,推荐直接用localhost,WSL2 会自动把 Windows 的端口请求转发到 Linux。也就是说你在 WSL2 里跑了一个 8080 端口的服务,浏览器里访问http://localhost:8080就能打开。
从 WSL 访问 Windows 文件非常方便,直接通过/mnt/c、/mnt/d挂载点即可。反过来从 Windows 访问 WSL 文件系统,打开文件资源管理器输入\\wsl$,就能看到所有发行版,可以像普通网络路径一样拖拽文件。这种方式适合小文件传输,大批量读写推荐放在 Linux 文件系统内部完成,比如/home/用户名/下,因为跨文件系统的 IO 性能差很多。
还有个常见坑是防火墙拦截。在 WSL2 里启动服务后,局域网其他电脑直接访问Windows 的局域网 IP + 端口可能不通。原因是虚拟网卡防火墙规则。需要在管理员 PowerShell 里添加端口规则,或者临时关闭专用网络的防火墙测试。这个行为取决于你所在网络的安全策略,内部开发环境可以用,公网环境务必谨慎。
6. 一些私货:我的避坑清单和最终建议
WSL2 我已经用了两年多,踩过的坑比写出来的还多,最后分享几条真实体会:
第一条,遇到奇怪的问题,先执行wsl --shutdown再重进。这个命令能清掉 WSL2 的所有运行时状态,多数“突然连不上网络”“程序卡死”“磁盘占用突高”都能靠它解决。它比重启电脑快得多,也是排障的第一步。
第二条,不要把自己困在 WSL2 里当 Windows 的“二等公民”。WSL2 的文件系统、网络、虚拟化特性已经足够成熟,完全可以把它当主力开发环境。如果你依赖 Windows 的图形工具,就用 VS Code 的 Remote-WSL 插件把编辑器留在 Windows 侧,运行环境放 WSL2 里,两边都舒服。
第三条,.wslconfig是性能调优的关键。没设置任何限制时,WSL2 会默认占用大量内存,尤其是跑 Docker 或大型构建时,Windows 会卡到怀疑人生。花两分钟写一个限制配置文件,绝对值回票价。
第四条,发行版数据及时导出。WSL2 的发行版就是一个普通 Linux 文件系统,重装系统前不导出,数据就全没了。我把wsl --export当成日常备份习惯,平时多几个 GB 的 tar 包,关键时刻能救命。
关于 WSL2 本身,后续还可以继续扩展很多内容:比如直接在这个环境里跑 systemd 服务、用 Ansible 批量管理、挂载磁盘、配置多用户,都是很好的方向。但你不需要一次性搞定所有东西,先把这篇文章里的安装、Docker、GPU、图形界面这几个环节走通,就已经能覆盖百分之八十的开发场景了。如果安装过程中遇到我这里没写到的报错,先看 Windows 版本和功能状态,再看 BIOS 虚拟化,最后查内核更新包,九成问题都出在这三处。