要在 Windows 上跑一套完整的 Linux 工具链,这事搁十年前挺折腾——要么双系统来回重启,要么开虚拟机把内存吃干净。WSL(Windows Subsystem for Linux)出现之后,局面完全变了:你能在 Windows 里直接开一个 Ubuntu 终端,apt 装包、跑 Python、编 C 代码、开 Docker,甚至挂上 GPU 跑 CUDA,手感跟原生 Linux 差不了太多,还能顺手读写 Windows 盘里的文件。我现在做后端开发、写数据脚本、偶尔拿 binwalk 分析一下固件,基本都在 WSL 里完成,Windows 只负责当桌面环境。
不过 WSL 的坑也是真不少。装的时候wsl --install卡在进度条不动,装完发现版本太旧报 "your version of windows subsystem for linux (wsl) is too old",Docker Desktop 启动提示 WSL 后端异常,PyCharm 死活找不到 WSL 里的 conda 环境,MATLAB 根本不认 WSL 路径,企业网络里wsl --update直接返回 403……这些问题我在不同机器上反复踩过。
下面我把从零开始装 WSL、做配置、再和常用工具打通的全过程拆开讲一遍。内容基于我在 Win10 企业版、Win10 LTSC 和 Win11 上的多次实操,从 wsl 安装、wsl 使用到卸载重置都有覆盖,兼顾刚上手的新手和想调优的老手。
1. 先想清楚要不要装 WSL,以及装哪一版
1.1 WSL 1 和 WSL 2 的区别不是简单升级
WSL 1 是微软早期的实现方案,它靠一层系统调用翻译,把 Linux 的请求实时转译成 Windows 能懂的调用。好处是文件系统两边完全互通、启动极快、跨系统读写小文件性能好;坏处是兼容性有限,内核层面缺失的东西跑不起来,Docker 就是最典型的例子。WSL 2 换了个思路,直接在一个轻量级虚拟机里跑真正的 Linux 内核,兼容性逼近原生,能开 Docker、能装 CUDA、能跑各种需要内核特性的工具,代价是内存动态占用、跨系统文件访问有额外开销。
那到底选哪个?我给的建议很直接:只要你的机器支持虚拟化,就别考虑 WSL 1,直接上 WSL 2。唯一值得用 WSL 1 的场景,是你需要 Windows 盘和 Linux 盘之间高频读写大量小文件,比如某些构建流程,那种情况下 WSL 1 的跨文件系统性能确实更好。除此之外,WSL 2 就是默认答案,微软自己也在往这个方向推。
1.2 哪些场景真的适合用 WSL
不是所有人都需要 WSL。它最适合的场景有这么几类:第一类是开发人员,尤其是后端、运维、数据方向,需要 Linux 环境跑服务、装依赖、调脚本,但又不想离开 Windows 的桌面生态;第二类是需要在 Windows 上跑 Linux 命令行工具的人,比如做嵌入式分析要用的 binwalk、做安全测试要用的一堆命令行工具;第三类是想学 Linux 的新手,WSL 比虚拟机省资源,装坏了直接注销重来,试错成本极低。
反过来说,如果你只是偶尔用一两个 Linux 命令,装个 Git Bash 或者 Cygwin 就够了;如果你需要完整的图形界面 Linux 桌面,那还是老老实实装虚拟机或者双系统。WSL 的定位是「命令行为主、轻量集成」,别指望它替代一切。
1.3 发行版与版本号的选择逻辑
发行版这块,Ubuntu 22.04 LTS 是绝大多数人的首选——社区资料多、软件源齐全、微软官方支持到位,报错的时候你能搜到的答案也最多。Ubuntu 24.04 LTS 也逐步成熟了,如果你是新装机、想要更新的工具链,可以上。至于 CentOS 8,已经停止维护了,微软商店里也早下架,除非有存量需求否则不建议折腾,真要用只能用第三方导入的离线包,后续维护成本很高。
这里有个经验:不要盲目追最新版。我见过有人图新鲜装了非 LTS 的版本,结果某个内部依赖的包在源里版本对不上,回头再降级反而更麻烦。LTS 版本有五年支持周期,稳定压倒一切。装之前先确认你的 Windows 版本号,Win10 得是 2004 版本(内部版本 19041)及以上,Win11 全系都行,这个后面会展开讲。
2. 安装前的环境盘点,很多人卡在这一步
2.1 虚拟化与 Windows 功能开关
WSL 2 依赖虚拟化技术,所以第一步是确认 BIOS/UEFI 里的虚拟化(Intel VT-x 或 AMD-V)已经打开。开机进 BIOS 找 virtualization 相关选项打开就行,这个不打开后面全是白搭。系统层面还需要两个 Windows 功能:「适用于 Linux 的 Windows 子系统」和「虚拟机平台」。Win11 和较新的 Win10 用wsl --install会自动帮你开启,但老系统或者企业版可能需要手动来。
手动开启的方式是以管理员身份打开 PowerShell,执行下面两条命令:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完必须重启,重启后再把 WSL 2 设为默认版本:wsl --set-default-version 2。我见过有人功能开了但忘了设默认版本,结果装出来还是 WSL 1,Docker 又装不上,回头排查半天。这一步别偷懒。
2.2 「版本太旧」报错的根源
那个让人头大的 "your version of windows subsystem for linux (wsl) is too old. run the command..." 报错,根源在于你系统里内置的 WSL 组件版本太老,跟要安装的发行版对不上。新版 Windows 把 WSL 做成了独立可分发的组件(叫 WSL 应用包),可以单独更新,而老系统里还是集成在系统里的旧版本。
标准解法是执行wsl --update。但问题来了——这条命令要走网络去微软的分发节点拉包,企业网络或者网络策略限制下经常失败,甚至直接返回 403。后面第 3 节我会专门讲离线绕行方案。另一个快速验证的办法是wsl --version,看看输出里 WSL 版本号是不是太低(低于 1.0 的基本都得更新)。
2.3 安装位置与磁盘规划
默认情况下 WSL 发行版会被装到 C 盘的%LOCALAPPDATA%\Packages\下面,一个 Ubuntu 加上你装的依赖,动不动就吃掉十几个 G。C 盘本来就紧张的话,装完直接红条警告。所以我在装机前会先规划:要么后面把发行版整体迁到 D 盘(用 export/import 的方式),要么一开始就规划好磁盘空间。
迁移这事不难,但要在装完、还没塞太多东西之前做,越早越省事。具体命令在第 4 节。另外提一句,WSL 2 的虚拟磁盘文件(ext4.vhdx)是动态增长的,删东西不会自动缩容,用久了会越来越胖,定期压缩一下有好处,这个也在后面讲。
3. 三条安装路径的完整实操
3.1 一键安装:wsl --install 的正确用法
新系统上最省事的就是一条命令。以管理员身份打开 PowerShell 或终端,直接执行:
wsl --install这行命令会自动开启所需功能、下载 WSL 内核、拉取默认发行版(现在是 Ubuntu)。如果你想指定发行版,用-d参数:
wsl --install -d Ubuntu-22.04想先看看有哪些能装的,用wsl --list --online列出在线清单。安装过程中它会提示你重启,重启后首次启动会让你设置 Linux 用户名和密码,这个密码是 sudo 用的,设置的时候屏幕上不会显示字符,别以为没输进去。
需要提醒的是:wsl --install -d后面跟的发行版名称必须和清单里的一致,写错了会提示找不到。我遇到过一次写-d Ubuntu22.04(少了横杠),结果报错不认,改成Ubuntu-22.04就好了。命名这块比较严格。
3.2 卡在下载:离线包与手动安装发行版
wsl --install太慢、进度条不动,这是最常见的抱怨。原因通常是发行版的包托管在海外分发节点,网络一慢就卡住。解决办法有几条,我按推荐度排一下:
第一条是改用官方提供的离线安装包。微软把各发行版打包成了 AppxBundle 格式,可以手动下载后安装。你可以在 WSL 的官方仓库里找到发行版清单文件(distributions.json),里面列了每个发行版的下载地址。下载对应的.AppxBundle或.tar.gz包,然后本地安装。
对于 AppxBundle,可以改后缀为.zip解压,或者用 PowerShell 的Add-AppxPackage命令安装:
Add-AppxPackage .\Ubuntu_2204.1.7.0_x64.appx装完之后再执行一次wsl --set-default-version 2,然后启动就能用了。这个方式绕过在线下载,速度取决于你的下载手段,但至少是可控的、能断点续传的。
第二条是寻找国内镜像站分发的离线包。很多高校和云厂商的镜像站会同步 Ubuntu 的官方镜像,可以通过这些渠道拿到ubuntu-22.04-server的 rootfs,然后用wsl --import手工导入。这种方式灵活度最高,也最适合企业内网环境,后面 3.3 节会展开。
3.3 老系统与企业网络:403 与更新受限的绕行
wsl --update 已禁止(403)这类报错,本质是网络出口做了白名单限制,微软的分发节点不在放行列表里。这种情况下在线更新和在线安装全都走不通,只能走离线路线。整体思路是:在能联网的机器上准备好离线文件,拷到目标机器上导入。
具体操作分三步。第一步,在能上网的机器上导出一个现成的发行版,或者下载官方 rootfs 压缩包:
wsl --export Ubuntu-22.04 D:\backup\ubuntu2204.tar第二步,把 tar 包拷到目标机器。第三步,在目标机器上导入:
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu2204 D:\backup\ubuntu2204.tar --version 2--import后面三个参数分别是:发行版名称、安装目录、tar 包路径。导入完成后用wsl -d Ubuntu-22.04启动即可。注意导入的发行版默认登录用户是 root,需要手动配置普通用户,这个在 4.1 节讲。
至于 Win10 长期服务版(LTSC)能不能用 WSL,答案是能,但相对麻烦。LTSC 通常不带 Microsoft Store,所以图形化的安装途径没有,但命令行方式(dism 开功能 + 离线导入)完全可行。我自己在一台 LTSC 机器上就是纯命令行方案装起来的,用到现在没问题。
4. 装完之后的初始化与性能调优
4.1 首次启动、用户与 root 配置
用wsl --install装的发行版,首次启动会引导你创建普通用户,直接按提示走就行。但用wsl --import导入的发行版不会走这个流程,默认进的是 root。这时候需要手动建用户:
useradd -m -s /bin/bash yourname passwd yourname usermod -aG sudo yourname建完之后还要告诉 WSL 默认用哪个用户登录。可以在/etc/wsl.conf里配置:
[user] default=yourname改完wsl --shutdown重启一下生效。这里有个小坑:如果/etc/wsl.conf写错了,可能导致启动异常,改之前最好备份一份。另外需要以 root 身份执行单条命令的时候,不用反复输密码,直接:
wsl -d Ubuntu-22.04 -u root这条命令我在做系统级配置时用得非常多,比在 Linux 里敲sudo -i还顺手。
4.2 用 .wslconfig 管住内存和 CPU
WSL 2 默认会吃掉最多一半的物理内存,跑个大型编译或者数据库,机器直接卡成幻灯片。这个可以在用户目录下的.wslconfig文件里限制,路径是C:\Users\你的用户名\.wslconfig(注意这是 Windows 侧的路径,不是 Linux 里的)。文件内容长这样:
[wsl2] memory=8GB processors=4 swap=2GB localhostForwarding=truememory 控制 WSL 能用的最大内存,processors 控制分配的 CPU 核心数,swap 是交换分区大小。我的 16G 内存机器一般给 WSL 分 8G,留一半给 Windows 本身。改完这个文件需要wsl --shutdown重启 WSL 才生效,直接关终端不顶用。
这里有个实测经验:把 memory 设太小,跑 Docker 多容器的时候容易 OOM;设太大,Windows 这边又卡。8G 是个比较平衡的数字。另外新版本 WSL 支持autoMemoryReclaim之类的回收选项,内存回收更积极,如果你的 WSL 版本够新可以加上试试。
4.3 把发行版迁到非系统盘
前面提过,装完尽早迁移。流程就是 export 再 import 两步,但有个细节要注意:导出的时候目标路径必须有足够空间,且不能和现有发行版重名。完整流程:
wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl\ubuntu2204.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\Ubuntu2204 D:\wsl\ubuntu2204.tar --version 2--unregister会把原发行版注销掉,这一步是删数据的,务必确认 tar 包导出成功再执行。导入之后用户配置会重置成默认,记得到/etc/wsl.conf里再把默认用户设回来。整个过程我做过好几次,十几 G 的数据大概几分钟,取决于磁盘速度。
迁移完之后 C 盘能空出一大块。顺便说下虚拟磁盘压缩:WSL 2 的 vhdx 只会长大不会自动缩,长期使用后可以做一次压缩。先wsl --shutdown,然后用 diskpart 或者专门的工具对 ext4.vhdx 做 compact 操作,能回收不少被删文件占用的空间。
4.4 软件源替换,让 apt 快起来
装好系统第一件事,我会把 apt 源换成国内镜像,不然apt update慢得让人想砸键盘。Ubuntu 22.04 的源文件在/etc/apt/sources.list,换成清华或者阿里云的镜像地址,然后sudo apt update刷新缓存。换完之后装包速度差别非常明显,尤其是第一次装一堆构建工具的时候。
换源这事看起来简单,但有个坑:不同 Ubuntu 版本的源代号不一样(22.04 是 jammy,24.04 是 noble),直接把别人的源文件拷过来,代号对不上会报 404。所以要么用 sed 批量替换域名保留代号,要么按自己的版本号手动改。我个人习惯用 sed 只替换域名部分,最稳妥。
5. 和常用开发工具打通
5.1 VS Code 里直接连进 WSL
在 VS Code 里用 WSL 是我日常最高频的场景。做法是先在 Windows 版 VS Code 里装一个叫 WSL 的官方扩展,然后在 WSL 终端里,进到项目目录敲:
code .VS Code 会自动在 WSL 环境下打开这个目录,终端、调试器、扩展全都在 Linux 侧运行,路径、依赖、权限都是对的。这个体验比在 Windows 下跨盘操作舒服太多。要注意的是,扩展需要在 WSL 侧单独装一遍,因为它跑在 Linux 环境里,Windows 侧装的扩展不一定通用。
有个新手常犯的错:把项目放在 Windows 盘(比如/mnt/c/...)里再用 WSL 侧 VS Code 打开,结果文件监听和保存巨慢。原因就是跨文件系统访问的开销。正确做法是把代码放在 Linux 的家目录里,性能差距一个天上一个地下。
5.2 PyCharm 与 WSL 里的 conda 环境
PyCharm 用 WSL 解释器有个前提:必须是Professional 版,Community 版不支持 WSL 解释器,这点很多人不知道,白折腾半天。配置路径是 File → Settings → Project → Python Interpreter → Add Interpreter → WSL,然后在里面指定 Linux 里的 Python 路径。
如果你用的是 conda,解释器路径一般是/home/你的用户名/miniconda3/envs/环境名/bin/python。这里的关键是先在 WSL 里把 conda 装好、环境建好,PyCharm 只是去「指向」那个解释器,不会帮你创建。我踩过的坑是环境建在 root 用户下,普通用户读不到,改成自己的用户目录下建环境就好了。
5.3 Docker Desktop 的 WSL 后端
Docker Desktop 在 Windows 上有两种跑法:老的 Hyper-V 后端和新的 WSL 2 后端。现在默认推荐 WSL 2 后端,性能和资源占用都更好。设置里勾选「Use the WSL 2 based engine」,然后选择要让哪些 WSL 发行版接入 Docker,保存重启即可。
遇到 "docker desktop there was a problem with wsl" 这类报错,八成是 WSL 版本太旧,或者发行版没有正确注册到 Docker。排查顺序是:先wsl --update更新 WSL,再确认 Docker 设置里目标发行版被勾选,最后wsl --shutdown重启一次。如果还不行,检查是不是装了两个 Docker(Docker Desktop 和 WSL 内 apt 装的 docker),两个冲突起来很麻烦,建议只留一个。
顺带提一句 Redis。有在 WSL 里跑 Redis 需求的话,一条sudo apt install redis-server就够了,systemctl 在新版 WSL 里也能用,启动服务和配置跟原生 Ubuntu 没区别。
5.4 在 WSL 里跑 CUDA
WSL 2 支持 GPU 直通,在 Windows 上装好支持 WSL 的 NVIDIA 驱动后,Linux 侧就能用 GPU 跑 CUDA 程序了。关键点在于:Windows 侧装驱动,WSL 侧不要重复装驱动。很多人按习惯在 Ubuntu 里装 nvidia-driver,结果把环境搞坏。正确做法是 Windows 装新版驱动,WSL 里只装 CUDA Toolkit,然后nvidia-smi就能看到显卡了。
版本匹配是个细活:Windows 驱动版本、CUDA Toolkit 版本、你要跑的框架(PyTorch 之类)要求的 CUDA 版本,三者得对得上。建议按公式来——先看框架支持哪个 CUDA 版本,再选对应版本的 Toolkit,最后确认 Windows 驱动够新。我在一台机器上就是驱动太旧,装完 Toolkit 跑起来报错,更新驱动后一次通过。
5.5 MATLAB 识别不到 WSL 怎么办
MATLAB 运行在 Windows 上,它本身没有「WSL 解释器」这个概念,所以想在 MATLAB 里直接调用 WSL 里的 Python 是不现实的。常见的解法有两种:一是把数据文件放在 Windows 盘里,让 MATLAB 正常访问,WSL 侧通过/mnt/d/...访问同一批文件,两边靠文件交换数据;二是从 MATLAB 里用system命令调用wsl执行命令,把结果写到文件再读回来。
第二种方式灵活但链路长,适合批处理。如果只是简单数据传递,第一种更省心。别指望 MATLAB 能像 PyCharm 那样直接指向 WSL 解释器,那是两码事。
6. 高频报错与排查手册
6.1 网络与安装类问题
安装阶段的问题绝大多数跟网络有关。wsl --install卡住、wsl --update报 403、下载速度慢到怀疑人生,这些都属于这一类。根本原因是分发节点访问受限。排查思路是:先确认目标机器能否正常访问外网,再看是不是有企业网络策略做了限制。确认是网络问题后,直接转离线方案最省时间,在网上在线折腾往往越弄越乱。
另外还有一个常被忽略的点:Windows 的 DNS 配置有时会影响 WSL 内部的域名解析。如果 WSL 里apt update提示解析失败,可以检查/etc/resolv.conf,必要时手动指定 DNS。新版 WSL 有 DNS 隧道的选项,遇到解析问题可以尝试开关这个选项来排查。
6.2 启动与运行时问题
启动类问题里,WSL 2 相关的最多。比如启动直接报虚拟化相关的错误,先回去确认 BIOS 虚拟化和虚拟机平台功能都开了。内存报错说明.wslconfig配得不合理,调小一点。磁盘报错多是 vhdx 太大或者磁盘满了,清理或压缩一下。
还有一个经典问题:关闭终端后 WSL 还在后台跑,内存不释放。这是因为 WSL 实例默认会保持运行一段时间。手动回收用wsl --shutdown,一劳永逸的做法是在.wslconfig里配置自动回收选项,让内存归还更积极。
6.3 一份速查表
| 现象 | 大概率原因 | 处理方式 |
|---|---|---|
| wsl --install 卡进度条 | 分发节点访问慢 | 转离线包或手工导入 |
| wsl --update 返回 403 | 网络出口白名单限制 | 离线导入,跳过在线更新 |
| your version ... too old | WSL 组件版本过低 | 更新 WSL 或换离线方案 |
| 启动报虚拟化错误 | 虚拟化未开 | BIOS 开 VT-x/AMD-V,开虚拟机平台功能 |
| Docker 后端报 WSL 异常 | WSL 版本旧或注册冲突 | 更新 WSL,检查重复安装 |
| MATLAB 找不到 WSL | 设计上不支持 | 走文件交换或系统命令调用 |
| PyCharm 无 WSL 选项 | 用的是 Community 版 | 换 Professional 版 |
| apt 速度慢 | 源未替换 | 换成国内镜像并保留版本代号 |
7. 卸载、重置与日常维护
卸载 WSL 要分两层来看:一是注销单个发行版,二是彻底关闭 WSL 功能。只想删掉某个发行版,用wsl --unregister 发行版名,这条命令会连同里面的所有数据一起清掉,用之前确认没有重要文件。Windows 上「应用和功能」里的卸载并不一定能清干净发行版数据,命令行的 unregister 才是最彻底的方式。
彻底关闭 WSL 功能的话,还是回到「启用或关闭 Windows 功能」里,把「适用于 Linux 的 Windows 子系统」和「虚拟机平台」两个勾去掉,重启。不过一般不建议这么做,除非你确定以后不再用了,因为下次再想用得重新走一遍启用流程。
日常维护上,我固定做两件事:一是定期wsl --shutdown回收内存,二是不定期 export 一份备份。备份这件事很多人嫌麻烦,但真出问题的时候,一个 tar 包能救回几天的环境配置工作。我一般一两个月导一次,放在另外一块盘上。另外 WSL 里的时间如果和 Windows 对不上,会影响一些对时间敏感的操作,发现时间漂移就重启一下 WSL,通常能自动同步回来。
8. 最后分享几点个人体会
装了这么多台机器,我最大的感受是:WSL 的安装难点从来不在命令本身,而在网络和版本匹配上。命令就那么几条,记不住查一下就行;真正耗时间的是下载卡住、版本对不上、功能没开全这些环境问题。所以我现在装机都是「能离线就离线,先对齐版本再动手」,把不确定性降到最低。
还有一点,别把 WSL 当成一个不需要维护的东西。它本质上是跑在你 Windows 里的一个完整 Linux 系统,用得越久,磁盘会涨、内存会占、配置会乱,定期清理和备份是必须的。把它当一台真实服务器来对待,很多坑自然就避开了。真要说最实用的一条,就是先把发行版迁到数据盘、再配好内存上限和软件源,这三件事做完,后面基本就顺畅了。