
这几年在Windows上做开发我身边越来越多同事把WSL当成了默认的Linux环境。不夸张地说装了WSL之后我几乎不再需要开虚拟机日常的shell操作、服务部署、数据处理脚本全都在WSL里跑。这篇文章就围绕WSL的安装和迁移展开从最基础的原理讲到真正的坑包括wsl --install太慢怎么办、C盘空间被WSL吃光怎么搬家、VSCode里怎么连WSL写代码、Docker Desktop报WSL错误怎么排查。准备把从零到能用、再到用得顺手的一条完整路径连同我踩过的坑和现在的习惯性操作全部整理出来。无论你是第一次接触WSL的纯新手还是已经在用但被磁盘占用和跨盘迁移折磨过的老手这篇都能直接拿去参考。1. 装之前先搞清楚WSL是什么该不该装1.1 WSL 1和WSL 2到底差在哪WSL的全称是Windows Subsystem for Linux简单说它让Windows可以在不装完整虚拟机的情况下直接运行Linux发行版。现在主流用的都是WSL 2它跟第一代的实现方式完全不同。WSL 1走的是系统调用转译路线把Linux程序发出的系统调用翻译成Windows系统调用。好处是启动极快、内存占用小、不需要虚拟化支持坏处是兼容性不够好很多依赖内核特性的软件跑不了文件操作性能也慢得让人抓狂。WSL 2则改成了轻量级虚拟机方案用一个真正的Linux内核跑在上面兼容性大幅提升Docker、数据库、深度学习框架这些重型工具都能跑。代价是它会占用更多内存虚拟磁盘文件也会随着使用慢慢变大。我自己的对比感受是这样的如果你只是想要一个能敲Linux命令的终端WSL 1勉强够用但如果你要跑Docker、装数据库、编译代码、做深度学习就直接上WSL 2别犹豫。微软也默认把WSL 2作为新版本的标准所以这篇内容默认都基于WSL 2展开。1.2 哪些人不建议用WSLWSL虽好但不是万能。我见过不少同学装了WSL之后发现不是自己想要的所以先把“不适合的场景”说清楚。第一如果你需要跑带图形界面的完整Linux桌面环境比如专门的Qt应用、带复杂GUI的设计软件WSL虽然支持WSLgWindows下的Linux GUI但体验离原生Linux桌面还是有差距。这时候更推荐VirtualBox、VMware或者干脆双系统。第二如果你要做USB设备直通、串口调试、摄像头采集这类重度硬件访问WSL 2在这块支持得比较有限。尽管最新版本对USB设备usbipd有支持但配置复杂、稳定性一般不如虚拟机来得干脆。第三如果你需要长时间运行依赖systemd的服务虽然新版WSL已经支持systemd但默认不开启配置起来也比原生Linux多一层工作。需要长期稳定运行的服务器还是交给真正的Linux机器或者云服务器更合适。所以你看WSL的定位更像是“开发者的日常主环境”而不是“替代所有Linux方案”。装之前先问自己我要不要在Windows里写Linux代码、跑Linux服务如果是WSL就是目前最轻量、最顺手的方案。1.3 前置条件检查在动手指令之前先把电脑条件确认好能省下后面一大半的折腾时间。第一Windows版本。WSL 2需要Windows 10 2004及以上版本Windows 11就不用说了。老版本系统强烈建议先升级否则会遇到一堆“功能无法开启”的报错。第二虚拟化功能。WSL 2依赖虚拟化和虚拟机平台你得去BIOS/UEFI里确认CPU虚拟化已经开启。大部分主流电脑默认是开着的但有些品牌机出厂默认关闭特别容易踩坑。可以在Windows搜索栏输入“任务管理器”切到“性能”标签页最下面能看到“虚拟化已启用”。如果是“已禁用”就得重启进BIOS找Intel Virtualization TechnologyIntel VT-x或AMD SVM把它打开。第三Windows功能。WSL本身依赖几个系统组件最省事的方法是用管理员身份的PowerShell或者命令提示符直接跑以下命令wsl --install这个命令会自动把“适用于Linux的Windows子系统”和“虚拟机平台”两个功能打开然后下载安装默认的Ubuntu发行版。如果系统比较老无法使用这一条命令就得手动去“控制面板 → 程序 → 启用或关闭Windows功能”勾选“适用于Linux的Windows子系统”和“虚拟机平台”重启后再装。2. 安装的两种路线一条快捷一条稳2.1 标准安装流程wsl --install一步到位如果你的网络环境不错最简单的安装方法就是先在管理员PowerShell里更新WSL并安装默认发行版wsl --update wsl --install等命令跑完后按提示重启电脑。重启完系统会自动弹出Ubuntu的初始化窗口让你设置Linux用户名和密码设置完就可以用了。很多人在这一步会卡住因为wsl --install的速度取决于网络到微软服务器的质量部分网络环境下下载发行版镜像慢到怀疑人生。遇到这种情况不要慌可以先执行wsl --install --no-distribution这一步只是把WSL本体和虚拟机平台装好不含发行版速度通常快很多。之后我再单独离线安装Ubuntu。如果想装指定版本的发行版比如Ubuntu 22.04先看有哪些版本可选wsl --list --online然后指定安装wsl --install -d Ubuntu-22.04这套流程走通之后你在开始菜单就能看到Ubuntu的入口点进去就是Linux终端。2.2 安装太慢试试离线安装方案wsl --install太慢是网上被吐槽最多的问题。我自己的经验是与其死等在线下载不如直接走离线安装稳定可控而且只需要做一次。离线安装的核心思路分两步装WSL本体再单独装发行版。第一步如果系统里还没有WSL功能组件先在管理员PowerShell里手动开启dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启一遍保证两个功能生效。第二步手动下载Ubuntu离线包。微软官方为每个发行版提供了单独的安装包常见的下载地址是https://aka.ms/wslubuntu2204下载下来的通常是一个.appx或.msixbundle后缀的安装包。找到文件后用PowerShell执行本地安装Add-AppxPackage .\Ubuntu2204.appx装完就能在开始菜单里找到Ubuntu并初始化。如果这一步还是觉得麻烦还有更“极客”的方式直接下载Ubuntu的rootfs压缩包然后用WSL导入功能创建发行版。这个“导入tar包”的技能其实也是后面迁移的核心操作我放在第3节详细讲。离线安装看似多几步但整个过程完全不依赖系统去商店下载网络再差也能装我实测下来非常稳。2.3 多发行版管理和版本切换一个Windows机器上可以同时装多个WSL发行版这在做不同项目时很实用。比如我本机就同时有Ubuntu 22.04和Debian前者跑日常开发后者用来测试兼容性。查看当前已安装的发行版wsl --list --verbose输出里会标明每个发行版名称、状态、版本号是1还是2。切换默认发行版wsl --set-default Ubuntu-22.04进入指定发行版wsl -d Debian这些命令我建议你记下来因为迁移、多发行版管理、后面Docker排查都会反复用到。装好之后别忘了换软件源国内访问Ubuntu官方源经常慢换成阿里云或清华源能快很多命令我就不贴了每家源配置大同小异但这一步绝对是提升体验的关键操作。3. 系统迁移把WSL从C盘搬家到D盘3.1 为什么要迁移C盘空间和性能WSL用起来很爽但有一个让所有人头疼的问题默认装完它会把整个Linux文件系统塞进C盘一个叫ext4.vhdx的虚拟磁盘文件里。这个文件的位置长这样C:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04...\LocalState\ext4.vhdx这个文件有个特性只增不减。你在WSL里装了一堆包、拉了几个大仓库、跑过一次Docker镜像它还往上膨胀直到撑满C盘。我曾经有次在WSL里装了一个conda环境加一套PyTorch几天下来这个vhdx文件从3GB涨到了27GB而C盘本身也就120GB的空余。而且虚拟磁盘文件在机械硬盘或较慢SSD上拖累整体读写速度迁移到D盘能一举解决空间和性能问题。另外迁移本身也是一种备份。把系统导出成一个tar包就好比给整个Linux环境拍了张快照即使Windows崩溃、重装系统只要这个tar包还在随时能恢复。3.2 迁移实操导出→移除→导入强烈建议在迁移之前先对WSL里的重要数据做好确认最好自己通过Git把代码仓库先推到远程。迁移本身虽然不会动文件但万一中途断电、路径写错损失就大了。第一步完全关闭WSLwsl --shutdown这个命令会立刻停止所有运行中的WSL虚拟机别跳过它。不关闭的话虚拟磁盘文件可能处于占用状态导出时会报错。第二步导出当前发行版为一个tar包。比如我想把Ubuntu-22.04导出就执行wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu2204.tar这个tar包就是你的完整Linux环境包括所有文件、配置、已装的软件。首次导出会花几分钟文件有十几GB也很正常。第三步注销当前的发行版释放C盘空间wsl --unregister Ubuntu-22.04注意unregister这个名字听起来很轻实际上它会删掉WSL里这个发行版的所有数据。导出的tar包如果没生成完毕或者没成功复制走这步就变成灾难了所以做之前一定再检查一遍第二步的tar文件大小是否正常。第四步重新导入到目标盘。在D盘建一个目录比如D:\WSL\Ubuntu2204然后执行wsl --import Ubuntu-2204 D:\WSL\Ubuntu2204 D:\wsl-backup\ubuntu2204.tar --version 2这里第一个参数是新的发行版名字可以跟之前不一样我这里用了Ubuntu-2204第二个参数是vhdx新家目录第三个参数是tar包路径最后指定版本号为2。导入完成之后可以在wsl -d Ubuntu-2204进入系统再确认C盘空间确实释放了。3.3 迁移后必做的配置默认用户和磁盘瘦身导入之后你会发现一个尴尬问题默认用户变成了root。原因很简单tar包里的用户信息没有跟Windows下的“默认用户”绑定在一起导入后的发行版不知道该用哪个普通用户登录。解决办法是写一个/etc/wsl.conf文件。在WSL里执行sudo vim /etc/wsl.conf写入[user] default你的用户名然后在Windows侧执行wsl --shutdown再重新进入默认用户就恢复成原来的普通用户了。还有一个很多人不知道的好功能新版WSL支持把虚拟磁盘设为“稀疏sparse”模式用多少占多少C盘或者D盘不容易被vhdx无限撑大。执行wsl --manage Ubuntu-2204 --set-sparse true如果你已经发现vhdx很大但又不想重新迁移也可以先wsl --shutdown然后用管理员PowerShell跑diskpart手动对vhdx执行压缩compact vdisk。命令网上有现成的我就不重复了记住“先关机再压缩”这个核心原则就行。4. 日常开发体验调优VSCode、字体、Docker与CUDA4.1 VSCode里用WSL开发的正确姿势很多人装完WSL只在开始菜单里点开那个黑色终端窗口这其实浪费了一大半潜力。真正舒服的用法是把VSCode和WSL接起来让整个IDE跑在Linux环境里。做法很简单在VSCode扩展市场安装官方插件“WSL”。装好之后VSCode左下角会出现一个绿色的按钮“打开远程窗口”点它并选择“连接到WSL”然后选择你的发行版。连接成功后左下角会变成“WSL: Ubuntu-22.04”这时候你在VSCode里打开的任何项目、跑的终端命令、装的Python环境全都基于WSL里的Linux环境。为什么会推荐这个方案举个例子你用Windows原生VSCode调试Python项目如果项目里用到了某些Linux专属依赖Windows环境往往装不上还得开虚拟机或连服务器。用WSL插件之后VSCode直接把插件、终端、调试器都跑在WSL的Linux环境里Windows侧只需保留一个VSCode客户端壳体验几乎跟原生Linux开发一样。而且在WSL2里文件读写、npm安装、编译速度都明显快于Windows侧尤其对前端项目和Python项目。4.2 最接近macOS体验的终端字体配置之前有个热搜词专门提到“WSL Ubuntu写代码最推荐的字体接近macOS的体验”一看就是被Windows默认的Consolas折磨过的人。WSL终端默认字体确实偏窄、偏拥挤显示中文还容易出现半个字的尴尬。我自己折腾过一段时间字体最后的结论是最接近macOS代码体感的字体组合是“更纱黑体Sarasa Term SC搭配JetBrains Mono”。更纱黑体是中文用户写代码的“神字体”它解决了等宽字体无法显示中文或中文发虚的问题中文笔画清晰、间距舒适。JetBrains Mono则是JetBrains家出品的英文代码字体连字符ligature设计非常漂亮圆润、辨识度高。组合起来的视觉效果接近macOS上常见的菜单栏字体等宽代码字体搭配。配置方法分两步。第一步在Windows终端Windows Terminal设置里打开设置 → 配置文件 → 默认值 → 外观 → 字体选择“Sarasa Term SC”。如果你用的是旧版控制台窗口可以在“默认值 → 外观 → 字体”里同样调整。第二步如果你希望VSCode里也用这个组合在VSCode的settings.json里加入editor.fontFamily: JetBrains Mono, Sarasa Term SC, Consolas, monospace, editor.fontLigatures: true,顺便说一句字体文件可以直接从GitHub Release页下载把“Sarasa Term SC”解压后右键安装所有TTF文件即可。这绝对是回报率最高的一次终端外观改造。4.3 Docker Desktop弹出WSL报错的排查思路“Docker Desktop there was a problem with WSL”是出现频率极高的报错基本可以排进WSL相关问题的前三名。这个报错的原因有很多但绝大多数是因为Docker Desktop默认使用WSL 2后端而你的WSL环境状态不对。我遇到过一次比较典型的情形电脑休眠唤醒后Docker Desktop突然报这个错误。最先要做的是重启WSLwsl --shutdown然后再启动Docker Desktop很多时候问题就解决了。如果重启后依然报错接着执行wsl --update更新WSL内核。如果还是不行去“控制面板 → 程序 → 启用或关闭Windows功能”确认“虚拟机平台”依然处于开启状态有时候Windows更新会把它关掉而不自知。最后一个大招是在Docker Desktop的设置里把“Use the WSL 2 based engine”取消勾选再重新勾选让它重新初始化WSL集成。这个报错通常不会牵扯更深层问题不用慌。另外如果你发现Docker镜像和数据把C盘占满了可以在Docker Desktop的设置中修改“Disk image location”把wsl的docker-data目录整体迁移到D盘。注意改之前要把所有容器清理干净否则迁移过程会卡住。4.4 WSL里装CUDA的注意事项很多做深度学习的同学想在WSL里用GPU这一点WSL 2已经支持得很好但有个典型的认知误区以为要在WSL里安装NVIDIA驱动。实际上正确的做法是在Windows侧安装支持WSL的NVIDIA驱动然后WSL内部的Linux环境会自动复用这块GPU。具体操作是先在Windows下从NVIDIA官网下载最新的驱动包GeForce或Studio版新版驱动都带WSL支持正常安装完成。然后进入WSL不需要装驱动直接在终端输入nvidia-smi如果显示你的GPU型号和显存信息就说明GPU直通成功了。之后想用PyTorch就在WSL里装显卡版PyTorch或conda安装cudatoolkit。如果只想加快Python的数值计算甚至可以只在conda环境里装cudatoolkit完全不碰CUDA toolkit完整包省时省力。注意WSL里的CUDA版本不需要跟Windows侧驱动版本完全对应驱动会做兼容层别因为版本对不上就反复重装驱动。还有一点WSL里的GPU显存和Windows共享物理显存别把单次batch size拉得太高容易OOM。5. 高频问题实战排查从安装报错到日常使用5.1 安装阶段问题速查我在安装和使用WSL的过程中踩过的坑远比看过的文档多。整理一个高频问题速查表直接对照处理比每次瞎搜要高效得多。问题现象最常见原因解决方案wsl --install卡住或太慢网络到微软服务器不稳定用wsl --install --no-distribution装组件再离线安装发行版Windows提示找不到wsl命令系统版本过旧或功能未开启升级到Win10 2004用dism命令开启两个功能后重启提示“your version of WSL is too old”WSL内核组件版本过低执行wsl --update或在商店升级WSL安装时要求重启但重启后没反应虚拟化未开启进BIOS打开VT-x或SVMUbuntu窗口打开后一直黑屏或闪退发行版初始化失败先wsl --shutdown执行wsl --unregister后重新导入tar包5.2 迁移和使用阶段问题速查问题现象最常见原因解决方案迁移后默认用户变成roottar包重新导入后用户绑定丢失在/etc/wsl.conf写[user] default你的用户名WSL虚拟磁盘越来越大写入量多、文件不回收wsl --shutdown后用diskpart执行compact或启用sparse模式docker-desktop数据占用C盘Docker Desktop默认数据目录在C盘在Docker Desktop设置里修改disk image locationWSL访问Windows文件速度慢跨文件系统读写性能损耗代码放到WSL内部文件系统不要放在/mnt/c下频繁编译WSL与Windows剪贴板无法共享剪贴板集成组件异常wsl --shutdown后重启WSL通常能恢复导入发行版后开始菜单没有图标--import方式创建的发行版没有商店入口直接用wsl -d 发行版名进入不影响使用5.3 硬件和系统异常类排查有些热搜词其实是把WSL和Windows系统本身的故障联系在了一起比如“Windows无法启动这个硬件设备代码50”、“由于配置信息注册表中的不完整或已损坏”。如果这些报错恰好出现在WSL安装或运行后大概率是Windows驱动状态混乱不完全是WSL的锅。我的处理经验是分三步先执行wsl --shutdown把WSL虚拟化资源全部释放然后打开“设备管理器”找到报错设备右键卸载并重启让Windows重新扫描安装驱动如果依然不行再检查事件查看器里的安全日志和系统日志定位是不是某次Windows更新或驱动更新引起了冲突。这类问题本身不复杂但容易让人误判为“WSL把系统弄坏了”。我在写这篇内容时专门回顾了几次排查记录核心原则是先排除WSL占用资源的影响再去碰驱动和注册表。另外如果你装了C盘之外的WSL发行版遇到系统重启后wsl命令找不到发行版也别急着重新导入。先检查D盘或E盘的目标目录里vhdx文件是否还在然后执行wsl --list --verbose看能否正常列出。很多时候只是Windows没有自动挂载执行wsl --mount或直接在命令行带路径进入即可恢复。最后再说说安装WSL这件事我最想分享的体会不要把它当成“虚拟机替代品”来纠结它真正的价值在于让Windows和Linux从“二选一”变成了“同时存在、随时切换”的开发环境。搞定离线安装和跨盘迁移这两件事后边几乎所有日常问题都顺着这个思路迎刃而解了。如果看完这篇你还是想先装一把试试那就直接来实际用两个礼拜比任何文档都管用。