
你在 Windows 上写代码却总被一件事卡住——项目要在 Linux 环境里跑服务器是 LinuxCI 是 Linux连同事的电脑也是 Linux。装个双系统来回重启太折腾开个虚拟机又臃肿到影响日常办公。WSL 就是解决这个尴尬的东西Windows Subsystem for Linux微软官方做的 Linux 子系统直接在 Windows 里跑一个原生 Linux 环境不用装虚拟机、不用换系统命令行一开就能用。这篇攻略写给三类人刚听说 WSL 的入门新手、装了 WSL 但网络和路径搞不定的半桶水、想在 WSL 里折腾 Docker、CUDA、PyTorch 和各类 Linux 工具链的开发者。全文按「原理 → 安装 → 配置 → 场景 → 排错」的顺序展开尽量让你看完就能动手少走弯路。1. WSL 到底是什么先花三分钟搞清楚版本和原理1.1 WSL 1 和 WSL 2 的核心区别网上关于 WSL 的教程很多但不少人装完也不知道自己用的是哪个版本。WSL 有两条技术路线差别非常大安装之前一定要弄清楚。WSL 1 本质是一个系统调用翻译层。它把 Linux 程序发出的系统调用比如读写文件、创建进程、操作网络套接字在运行时就地翻译成 Windows 的系统调用。好处是进程直接跑在 Windows 内核之上启动快跨文件系统的读写性能特别好坏处是兼容性不完整Linux 内核的一些底层机制比如内核模块、iptables、dmesg它没法支持。如果你只是想跑几个 Linux 命令行工具WSL 1 够用但指望它跑 Docker 或者需要内核特性的软件就会碰壁。WSL 2 则完全不同它是一个轻量虚拟机。微软把 Hyper-V 虚拟化平台和真正的 Linux 内核封装起来每个发行版跑在一个独立的虚拟磁盘ext4 格式里。说是虚拟机但启动速度和系统开销比传统虚拟机小得多而且和 Windows 的集成度也高。代价是跨文件系统读写变慢了从 Windows 盘访问 WSL 里的文件或者反过来性能有明显损耗。我把两者的差异整理成一张表方便你对照对比项WSL 1WSL 2架构系统调用翻译层轻量虚拟机 完整 Linux 内核内核支持不支持内核模块、dmesg 等有完整内核可加载内核模块Docker不支持支持GPU / CUDA不支持支持跨系统文件读写快较慢网络与 Windows 共享网络独立虚拟网卡NAT 模式启动速度极快快但首次启动稍慢1.2 为什么现在建议直接用 WSL 2结论放在前面新装环境一律用 WSL 2除非你的电脑有特殊限制比如老旧 CPU 不支持虚拟化或者公司电脑禁用了 Hyper-V。原因很简单WSL 2 才支持 Docker Desktop、CUDA 加速、GPU 推理这些现代开发刚需。你如果是为了跑 PyTorch 训练模型或者做固件分析拿 WSL 1 基本寸步难行。另外一个容易被忽略的点是版本更新机制。早年间 WSL 是 Windows 组件跟着系统更新走版本老旧的问题很常见。现在 WSL 已经拆成独立组件可以在管理员 PowerShell 里用wsl --update手动更新微软的迭代速度明显加快很多新特性都是优先落在新版 WSL 里的。网上有人讨论「WSL 3.0」这个说法其实不用太纠结版本号你只要关注两件事一是wsl --version能看到当前 WSL 版本二是保持更新到最新。像 NAT 模式与镜像模式切换、systemd 支持这些功能都依赖较新的 WSL 版本版本太旧会出现各种「理论上应该能用但就是不行」的诡异问题。2. 从零安装 WSL不同场景下的四套完整方案2.1 最快路径wsl --install 一条命令如果你的 Windows 是 Windows 10 2004build 19041以上或者 Windows 11安装 WSL 其实只有一步打开 PowerShell 或 Windows Terminal以管理员身份运行然后敲wsl --install这条命令会自动开启「适用于 Linux 的 Windows 子系统」和「虚拟机平台」两个 Windows 功能下载并安装 WSL 内核默认安装 Ubuntu 发行版。整个过程无需手动勾选功能、无需单独下载内核这是目前最标准的安装姿势。如果你想指定发行版比如 Ubuntu 24.04可以写成wsl --install -d Ubuntu-24.04查看所有可用的发行版列表用wsl --list --online。装完后系统一般会提示重启重启完首次启动 Ubuntu会让你设置一个用户名和密码。这里有个新手容易慌的点输入密码时终端不显示任何字符这不是键盘坏了是 Linux 的安全策略照常输入然后回车就行。需要注意wsl --install看起来简单但它背后其实做了三件事启用 Windows 功能、安装内核、安装发行版。如果其中任何一步因为系统版本或者网络环境失败命令就会报错。最常见的报错之一就是「无法与服务器建立连接」这通常不是 WSL 本身的问题而是镜像服务器不可达后面的离线安装章节会讲替代方案。2.2 把发行版装到 D 盘路径迁移三步走WSL 默认安装在 C 盘虚拟磁盘文件是ext4.vhdx随着你安装软件、拉取镜像、构建项目这个文件会越来越大。C 盘吃紧的 Windows 用户十个里有八个都会问「能不能把 WSL 装到 D 盘」。答案是能而且不需要重新装系统用三个命令就能完成迁移。操作之前先确保 WSL 里的数据已经备份。然后执行wsl --shutdown wsl --export Ubuntu D:\wsl-backup\ubuntu.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\wsl-backup\ubuntu.tar解释一下每步在干嘛wsl --export把当前整个发行版打包成一个 tar 文件wsl --unregister删除原有发行版注意它会连同 C 盘里的虚拟磁盘一起删掉所以备份一定要先做wsl --import再从 tar 文件还原到指定目录第二个参数是新的安装位置第三个参数是备份文件路径。这里有一个很容易踩的坑用wsl --import还原的发行版默认登录用户是 root而不是你原来的普通用户而且新创建的 WSL 快捷方式也长得和商店版不一样。解决方法是手动创建一个/etc/wsl.conf文件[user] default你的用户名保存后执行wsl --shutdown再进 WSL用户名就恢复正常了。这个方法同样适用于把 WSL 从一台电脑迁到另一台电脑算是 WSL 迁移的万能钥匙。2.3 网络环境受限的替代方案离线安装发行版在实际场景里网络环境不理想导致 WSL 安装失败的情况太常见了。现象就是wsl --install -d Ubuntu-24.04卡在下载阶段或者提示「无法与服务器建立连接」。遇到这种情况别硬等直接切换到离线安装。离线安装的思路是绕过在线分发服务器从官方渠道手动获取发行版安装包。Windows 上 WSL 发行版本质上是一个.appx或.msixbundle格式的应用包你从官方发布渠道下载到本地后用 PowerShell 执行Add-AppxPackage .\Ubuntu_2204.1.7.0_x64.appx安装包添加完成后开始菜单里会出现 Ubuntu 图标点击运行即可完成首次初始化设置用户名密码。这个方法对 Windows Server 2022 这类需要离线部署 WSL 容器的场景同样适用先把 WSL 内核安装包和发行版 appx 一起拷到目标机器上依次安装就能在不联网的情况下把 WSL 环境搭起来。离线安装时注意发行版之间的相互依赖比如 Ubuntu 的 appx 包名里有 CPU 架构标识x64 机器别下 ARM64 版本。装完如果启动报错先确认系统里是否已经装过 WSL 内核内核缺失的话发行版启动会直接失败。2.4 老系统提示“wsl 不是可识别命令”的处理姿势很多人在 PowerShell 里敲wsl得到这样一句wsl: 术语 wsl 不会被识别为 cmdlet、函数、脚本文件或可执行程序的名称。看到这句话先别慌它只说明两件事要么你的 Windows 版本太老根本没有 wsl.exe 这个命令文件要么 WSL 功能没启用。Windows 10 1903 以前的系统wsl --install并不存在需要在「控制面板 → 程序和功能 → 启用或关闭 Windows 功能」里手动勾选「适用于 Linux 的 Windows 子系统」重启后再去微软官方下载中心获取 WSL 内核安装包和发行版安装包。Windows 10 1903/1909 的用户可以勾选功能后直接去商店下载发行版但体验远不如 2004 以上版本。我的建议很简单如果系统版本还停留在 Win10 1909 或更早先更新 Windows 系统。WSL 2 对 Windows 版本的依赖很强老系统勉强化解出来的环境后续跑 Docker 或者新版内核功能大概率还要折腾一遍不如一步到位。3. 装完先别急着用网络、内存、磁盘这三个配置必须落地3.1 网络模式怎么选NAT 还是镜像模式WSL 2 默认的网络模式是 NAT。简单说WSL 里的 Linux 有自己独立的虚拟网卡和 IP 地址和 Windows 主机的网络不在一个网段外界访问不到。好处是隔离性好坏处是你想在 Windows 上访问 WSL 里启动的服务或者反过来偶尔会遇到端口不通、IP 对不上这类问题。其实 WSL 2 做了 localhost 转发大部分场景是自动的你在 WSL 里跑一个 Jupyter Notebook 监听 8888 端口Windows 浏览器直接访问localhost:8888就能打开。但也有限制比如监听地址绑定了特定 IP、或者需要 IPv6 多播、或者你有多个网卡接口的情况NAT 转发就会出岔子。新版 WSL 提供了镜像模式mirrored。在用户目录下创建.wslconfig文件写入[wsl2] networkingModemirrored保存后wsl --shutdown重启 WSL网络接口就会镜像 Windows 主机的网络WSL 和 Windows 共享同一套 IP、同一个网段localhost 自然互通。什么时候用镜像我自己的经验是如果你需要在 WSL 里监听 0.0.0.0 并且希望局域网设备直接访问这个端口或者你日常用 IPv6镜像模式省心很多否则默认的 NAT 模式足够毕竟改动越少出问题的面越小。3.2 WSL 里连不上网先按这个顺序排查「WSL 内不能联网」是我看到的高频问题大概率发生在刚安装完成、还没配置任何网络的情况下。常见症状是ping 8.8.8.8通但ping www.baidu.com不通或者全都超时。第一步先查 DNS。在 WSL 里执行cat /etc/resolv.conf正常情况下里面有一个nameserver指向虚拟网关地址。如果这个文件是空的或者指向了奇怪的地址DNS 解析就会失败表现就是「能 ping 通 IP 但打不开域名」。解决方法比较粗暴但有效在 WSL 里编辑/etc/wsl.conf加入[network] generateResolvConf false然后手动写/etc/resolv.confsudo sh -c echo nameserver 223.5.5.5 /etc/resolv.conf223.5.5.5 是阿里公共 DNS国内访问稳定实测下来效果不错。改完wsl --shutdown再进来DNS 就不会被 WSL 自动覆盖了。第二步查 Windows 防火墙和安全软件。WSL 的虚拟网卡流量有时会被防火墙拦掉尤其某些安全软件会注入网络过滤驱动导致 WSL 的流量异常。排查时可以临时退出安全软件或者把 WSL 相关进程加入白名单后重试。有些网络过滤工具还需要在系统层面进行 Winsock 目录重置这个操作影响面比较大建议作为最后手段并且提前备份好网络配置。最后再说一个几乎万能的办法wsl --shutdown然后重启 WSL。WSL 2 的虚拟交换机偶尔进入异常状态重启一下大部分网络问题都能自愈。3.3 .wslconfig 限制内存和 CPU避免宿主卡顿WSL 2 默认会占用宿主机 50% 的内存或者 8GB取较小值如果你只有 16GB 内存Windows 上还开着浏览器、IDE、微信再有一个 WSL 里的 Docker daemon 吃内存系统很快会卡成幻灯片。限制 WSL 资源用量是每个入门玩家应该学会的第一份配置文件。在 Windows 用户目录下创建.wslconfig文件注意文件名开头有个点内容示例[wsl2] memory6GB processors4 swap8GB localhostForwardingtrue参数含义很直白memory是 WSL 最大可用内存processors是最大可用 CPU 核数swap是交换分区大小localhostForwarding控制 localhost 端口的转发开关。修改完必须wsl --shutdown再重启 WSL 才生效。我遇到过有人把 memory 设成 12GB 想要「尽兴」结果 Windows 自己先卡死了。记住一个原则WSL 不是这台电脑上唯一的应用Windows 本身、IDE、浏览器都要内存给 WSL 留个 6GB 左右基本够日常开发了真跑大训练任务再去调高。3.4 无活动时 WSL 会不会空转内存回收与 wsl --shutdown很多人问“我开着 WSL 什么程序都不跑宿主机内存怎么还是被占着” 这要分两种情况。WSL 2 会在最后一个 Linux 进程退出后自动关闭虚拟机并回收内存所以你什么都不跑、关掉所有窗口之后它一般会自己安静下来。但如果你在 WSL 里启动了常驻进程——数据库、Docker daemon、Redis、开发服务器——这些进程不退WSL 虚拟机就不会自动关闭内存自然一直被占用。想让它立刻安静下来最简单的命令wsl --shutdown这会强制关掉所有正在运行的 WSL 发行版和虚拟机释放全部资源。下次需要时再敲wsl进入又会重新启动。我习惯在睡前或者长时间离开电脑时敲一下这个命令比让 WSL 在后台默默吃资源放心得多。注意它影响的是所有发行版不只是当前这个所以养成「该关就关」的习惯很重要。4. 把 WSL 真正用起来开发环境的四个高频场景4.1 VS Code 无缝接入Remote - WSL 的正确玩法装好 WSL 后第一个值得配置的开发工具就是 VS Code。微软做了官方扩展 Remote - WSL装上之后你在 WSL 里进入任何目录执行code .VS Code 会自动检测到这是 WSL 环境在 Windows 窗口里打开编辑器但左下角会显示一个「WSL: Ubuntu」的标识说明正在连接远程环境。整个过程像远程开发一样你的终端是 Linux、解释器是 Linux、调试器也是 Linux但 UI 还是你熟悉的 Windows 编辑器。这里有个文件存放的重要建议项目代码尽量放在 WSL 的 Linux 文件系统里比如/home/用户名/projects不要放在/mnt/c/...下。原因是 WSL 2 访问 Windows 盘跨文件系统性能很慢编译、安装依赖、跑测试都会有明显延迟。如果你把项目放在/mnt/c然后抱怨 WSL 慢那九成是这个原因。真实的 Windows 文件在哪里看在资源管理器地址栏输入\\wsl$\Ubuntu就能直接浏览整个 WSL 文件系统文件互拷很方便但日常读写还是各归各的好。4.2 Docker Desktop WSL 2容器环境的打通与问题Docker 桌面版在 Windows 上有两种后端Hyper-V 后端和 WSL 2 后端。现在主推的就是 WSL 2 后端因为集成度更高、启动更快、资源占用更少。安装 Docker Desktop 后在 Settings 里勾选 Use WSL 2 based engine然后到 Resources → WSL Integration 里勾选你要集成的发行版比如 Ubuntu。设置完成后你在 WSL 里直接敲docker命令就能连上 Docker daemon和 Windows 上共享一套镜像和容器。这种「Windows 装 Docker DesktopWSL 里用 docker 命令」的模式是我见过的本地容器开发最舒服的组合。镜像默认存在 Windows 侧WSL 里不用单独装 docker 引擎也省掉了 Linux 上配置 docker daemon 的繁琐步骤。在实际使用中有一个高频坑Docker Desktop 更新之后WSL 突然跑不起来了或者 Docker 启动提示 WSL 版本过旧。这个问题后面 5.3 节专门讲这里先记一个原则Docker Desktop 的版本要求和 WSL 内核版本强绑定两者更新不同步就出问题优先把 WSL 更新到最新版。4.3 WSL 里装 CUDA 和 PyTorch深度学习本地调试WSL 2 支持 GPU 加速而且是原生支持 NVIDIA CUDA。这对做深度学习的人来说是个巨大福利不用装双系统就能在 Windows 的 WSL 里跑 PyTorch、跑 CUDA 程序。具体怎么做先说一个最常见的误解在 WSL 里不需要安装 NVIDIA 显卡驱动也不需要安装 Linux 版的 CUDA driver。WSL 通过特殊的用户态库把 Linux 的 CUDA 调用转发给 Windows 的驱动程序。所以你只需要做两件事Windows 侧安装最新版 NVIDIA 显卡驱动然后 WSL 里安装 CUDA 工具链。第一步验证硬件是否可用在 WSL 里执行nvidia-smi如果输出显示显卡型号和驱动版本说明 WSL 的 GPU 转发已经就绪。接下来安装 PyTorch。最简单的方式是直接用 pip 安装预编译包比如 CUDA 12.1 版本pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121安装完成后做个快速验证python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))输出True和显卡型号就说明 CUDA 环境全部打通。至于 CUDA toolkit很多场景其实不需要全量安装PyTorch 自带 CUDA 运行时你只要依赖 PyTorch 提供的包即可。只有当你需要编译原生的 CUDA 扩展或者使用 nvcc 编译器时才需要额外安装 CUDA Toolkit。4.4 Linux 工具链的体验binwalk 等硬件与固件分析工具WSL 对我来说最爽的价值是你随手就能用到 Linux 生态里那些专业工具。举一个例子binwalk一个嵌入式固件分析和文件提取工具在固件逆向、路由器分析、摄像头固件解包等领域几乎是标配。在 Windows 下想跑 binwalk要么装虚拟机要么用臃肿的模拟环境但在 WSL 里一行命令sudo apt update sudo apt install binwalk装完就能直接用。比如拿到一个固件文件router.bin用binwalk -e router.bin就能自动扫描并提取其中嵌入的文件系统。整个过程跟在真实 Linux 服务器上的操作完全一致。这种「WSL 即 Linux 跳板」的思路可以延伸到很多场景嵌入式开发、系统性逆向、自动化脚本、数据处理甚至你想在 WSL 里研究一些 JavaScript 引擎比如 Hermes的实现源码配环境都比在 Windows 里顺畅得多。用过一次之后你就会发现WSL 最大的价值不是替代谁而是把整个 Linux 工具链完整地搬到了 Windows 旁边。5. 高频问题排查速查新手的典型坑一次讲完5.1 启动与安装类报错排查表以下是我在实际操作中被问过最多的几个报错整理成速查表。先看现象再对号入座。报错现象根本原因处理方案wsl 不是可识别的命令系统版本过老或 WSL 功能未启用升级系统或在「启用或关闭 Windows 功能」勾选「适用于 Linux 的 Windows 子系统」重启后重装WSL 2 无法启动因为此计算机上未启用虚拟化BIOS 里 VT-x/AMD-V 未开启或虚拟机平台功能未启用进入 BIOS 开启虚拟化确认「虚拟机平台」已勾选关闭「内核隔离/内存完整性」后重启WSL needs updatingyour version is too oldWSL 内核版本过旧管理员 PowerShell 执行wsl --update重启 WSL无法与服务器建立连接网络下载发行版失败使用离线安装包Add-AppxPackage手动安装安装发行版时遇到 14098 或 0x8037 开头错误WSL 组件异常或虚拟化支持异常按顺序检查虚拟化 →wsl --update→wsl --shutdown→ 重启 LxssManager 服务Get-Service LxssManager这里面我特别想强调虚拟化的问题。很多人的电脑其实支持虚拟化但 BIOS 里默认关闭了也有人的系统开了「内核隔离」导致 WSL 2 无法启动。排查顺序建议是先用任务管理器「性能」标签确认虚拟化是否启用再检查 Windows 功能里「虚拟机平台」是否打开最后才去改 BIOS。不要一上来就乱调 BIOS大部分情况下是 Windows 层面的设置问题。5.2 apt 源不可用Ubuntu 镜像源替换实操「WSL 里 apt update 失败」「无法获取」「无法与服务器建立连接」——这些问题的本质绝大多数是默认的 Ubuntu 官方源在你当前的网络环境下不可达。解决办法不是重装系统而是把 apt 源替换成国内镜像源。先备份原配置Ubuntu 24.04 之后用的是新的 deb822 格式配置文件在/etc/apt/sources.list.d/ubuntu.sources更老的版本则直接修改/etc/apt/sources.list。以 Ubuntu 24.04 为例sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak sudo sed -i s//.*archive.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list.d/ubuntu.sources sudo apt update我把源替换成阿里云镜像国内连通性很好。如果你习惯清华源把mirrors.aliyun.com换成mirrors.tuna.tsinghua.edu.cn即可。替换之后apt update速度会有肉眼可见的提升后续apt install也不容易再卡住。这个操作是每个 WSL 用户都要过的一道坎早晚都要做建议直接养成成文习惯。5.3 Docker 更新后 WSL 跑不起来怎么办Docker Desktop 更新之后 WSL 突然不能用了这个问题的触发点是Docker Desktop 新版本对 WSL 内核版本提出了更高要求而你系统里的 WSL 还停留在旧版。表现可能是 Docker Desktop 弹窗提示 WSL 版本过旧也可能是 WSL 发行版启动失败。处理顺序按下面来基本能覆盖九成情况# 1. 以管理员身份打开 PowerShell更新 WSL wsl --update # 2. 彻底关闭 WSL释放所有被占用的资源 wsl --shutdown # 3. 重启 Docker Desktop如果更新完 WSL 仍有问题检查一下你有没有在.wslconfig里自定义过内核路径[wsl2] kernelC:\path\to\custom\kernel如果指定了自定义内核Docker Desktop 新版本可能对新内核有额外要求稳妥做法是暂时注释掉这行让 WSL 使用微软官方提供的默认内核。这个坑我见过不止一次Docker 更新不是问题本身问题是你用了和默认环境差异太大的配置。5.4 磁盘膨胀与空间管理vhdx 压缩WSL 2 的虚拟磁盘文件ext4.vhdx有个特点自动增长但不会自动收缩。你在 WSL 里安装卸载大量软件、拉取 Docker 镜像、编译项目C 盘上这个文件会越来越大即使你在 WSL 里把数据删了文件占用的空间也不会还回来。这就是「C 盘空间神秘消失」的元凶。压缩 vhdx 的操作可以做成一条标准流程。先备份重要数据然后wsl --shutdown打开管理员 PowerShell用 diskpart 工具压缩虚拟磁盘diskpart # 进入 diskpart 后执行 select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu*\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit注意 vhdx 的实际路径可能因发行版而异你可以在资源管理器里搜ext4.vhdx找到准确位置。执行完压缩后C 盘释放出来的空间通常非常可观我压缩过一次释放了接近 20GB。养成定期检查 C 盘空间的习惯WSL 使用时间长了这一步早晚用得上。写到最后分享一个我个人的体会WSL 入门最大的门槛不是命令而是观念转换。很多人习惯用 Windows 的思维方式去套 Linux遇到问题先想着「装个工具解决」而不是先想想「这个工具在 Linux 生态里的原生姿势是什么」。WSL 给了一个很低的试错门槛——你随时可以wsl --shutdown关掉一切随时可以导出备份、删除重来。我建议你装好之后不要急着追求花哨的多发行版配置先把 Ubuntu 一个环境用熟把wsl --export、.wslconfig、wsl --shutdown这几个命令变成肌肉记忆后面无论换电脑、换磁盘、折腾 Docker 还是 CUDA你都有一整套兜底方案。踩过几次坑之后你会发现WSL 最值钱的地方是把 Linux 从「另一个系统」变成了 Windows 桌面上随时可以打开的一个窗口。