ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WSL 2 + VS Code Remote 开发环境搭建:从安装到避坑指南

WSL 2 + VS Code Remote 开发环境搭建:从安装到避坑指南 在Windows上把WSL配好、再用VS Code打开当日常开发环境这个流程我前后折腾过好几轮。最早是为了在笔记本上跑binwalk解固件、用GCC交叉编译以及给Python项目铺一个真正的Linux风格环境那时候要么开VMware等半天要么直接重启进Ubuntu。后来WSL 2稳定了加上VS Code的Remote-WSL插件我终于把“Windows和Linux两难选”的日常彻底理顺。这篇文章写给两类人一是第一次接触WSL想按部就班配好又没有头绪的新手二是已经装过WSL但遇到过安装卡住、系统报错、想挪到D盘、想在VS Code里打开却无从下手的老手。整体思路是先把原理讲清楚再给可以直接复制的命令最后处理我个人实测里最常见的坑。文中所有命令我都在Windows 11和Windows 10的较新版本上跑过如果你用的系统不太一样差别也不会太大。1. WSL和VS Code这对组合到底解决了我什么痛点1.1 没有Linux却需要Linux的日常做开发的人多少会遇到这种时刻项目要跑在Linux上依赖库只能在Linux里编译压缩包要用Linux的tar命令处理解出来的固件要用binwalk分析甚至只是一个.sh脚本Windows的CMD和PowerShell就是执行得不舒服。以前我的解决办法很粗暴装虚拟机。VirtualBox开一台Ubuntu内存至少吃掉4GBIDE再放进去整个环境变得又笨又重。更麻烦的是文件交换Windows改完代码要拷进虚拟机跑虚拟机里生成的数据又要拷出来看来回折腾得心累。双系统当然也可以但每次切换等于重启一次一天下来回到Windows和Ubuntu之间“蹦迪”好几次生产力反而没有了。后来我试过MSYS2、Cygwin它们能模拟出部分Linux工具链但环境隔离和内核行为始终差一层。至少在Docker容器或者编译大型C/C工程时这种“模拟味道”会带来很多兼容性噪音。1.2 WSL 1到WSL 2同一名字两代实现WSL刚推出来的时候是WSL 1它的机制是翻译层把Linux系统调用的请求翻译给Windows内核执行好处是启动快、目录可以在Windows文件系统里直接互通坏处是很多内核级功能不支持比如Docker、FUSE这些跑起来总有种“半吊子”的感觉。WSL 2就不一样了它基于一个真正的Linux内核通过轻量级虚拟机技术跑起来。这个内核并不是Hyper-V里那种完整虚拟机而是微软封装的、启动很快的专用内核。所以WSL 2里可以跑Docker、可以编译Linux内核模块、可以用perf、可以直通GPU几乎就是一个真正的Linux环境。代价也有WSL 2本质是VHDX虚拟磁盘性能上最忌讳跨文件系统读写。如果你把项目放在/mnt/c/Users/...下面再在WSL里编译速度会明显下降。这一点我们后面还会反复提到。1.3 连接VS Code之后体验才真正闭环WSL装好以后如果你还是用Windows终端直接敲命令那体验最多算“能用的Linux”但没有编辑器联动开发效率还是上不去。真正让我觉得“这套组合可以日常用了”的是VS Code的Remote-WSL插件。它做的事情说白了就是VS Code界面窗口跑在Windows侧文件系统、终端、调试器、语言服务全部在WSL内部运行。你打开一个项目看到的是Linux风格的文件路径终端里执行的是Linux命令断点调试也是真正跑在Linux进程里但集成开发环境的美观和扩展生态还是VS Code的。更舒服的是VS Code会自动在WSL侧安装一个兼容后端你只需要在WSL终端里敲code .或者直接在Windows侧通过命令面板连接不用自己配置SSH和服务器机制完全是自动的。2. 动手前的三个关键选择版本、发行版、安装路径2.1 Windows版本和硬件要求先自查安装WSL 2有一个硬性前提Windows 10版本至少要在2004内部版本19041以上Windows 11则完全没问题。如果你用的还是1903或者更老的版本不是不能装但只能体验WSL 1或部分WSL 2特性不如先升级系统。硬件上必须先确认CPU虚拟化已经开启。WSL 2需要虚拟化能力如果你的CPU是Intel对应VT-xAMD则对应SVM。判断方法很简单打开任务管理器切换到“性能”标签看CPU信息里“虚拟化”这一项是不是“已启用”。另外一个容易被忽略的点是内存。WSL 2本身会动态占用内存默认上限是物理内存的50%。如果你只有8GB内存Windows再开个浏览器、几个VS Code窗口WSL里再跑编译任务压力会比较大。建议至少16GB内存或者后面去.wslconfig里手动限制memory参数。2.2 选哪个Ubuntu一句话版本建议WSL的发行版不止Ubuntu但绝大多数教程、开源项目默认支持最好的是Ubuntu LTS版本。我的建议很直接平时做嵌入式、C/C、Python开发优先装Ubuntu 22.04如果希望新工具链更全、软件包更新的节奏更激进可以直接上Ubuntu 24.04。如果是第一次用别贪心装多个发行版。一个Ubuntu用到熟比我同时装三个不同版本但每个都生疏要强得多。以后有需要wsl --install -d 发行版名可以随时加装不需要重来一遍。2.3 提前决定要不要把WSL挪到D盘很多人装完WSL以后才发现默认发行版的数据放在C:\Users\用户名\AppData\Local\Packages\下面而且是藏在系统的用户目录里。刚开始不觉得等你在里面装了一堆工具链、模型、Docker镜像之后C盘可能突然就爆了。所以在装之前先决定一件事要不要把WSL放到D盘。如果你C盘剩余空间本身很宽裕比如还有200GB以上那直接用默认路径就行。如果你的C盘是120GB甚至更小的固态我强烈建议从一开始就把发行版放到D盘去后续步骤我在第4节详细写。另外提醒一句WSL的默认路径其实是通过注册表记录的不是Linux根目录本身。所以“挪到D盘”操作的本质是“把整个虚拟磁盘迁移”不是简单复制文件夹。3. 一条命令装完WSL以及“装到一半不动了”怎么处理3.1 管理员PowerShell下的标准安装流程现在最正规的安装方式非常简单。右键开始菜单选择“终端(管理员)”或“Windows PowerShell(管理员)”然后执行wsl --install -d Ubuntu-22.04这行命令会自动打开Windows功能、下载并安装WSL内核、安装Ubuntu发行版。装完以后系统大概率提示需要重启重启完再打开终端它会自动进入Ubuntu初始化流程让你设置Linux用户名和密码。新版本WSL还允许你同时指定安装目录比如wsl --install -d Ubuntu-24.04 --location D:\WSL如果你的WSL版本够新这行命令能直接把发行版放到D盘省去后面导出导入的麻烦。如果提示--location不被支持说明WSL版本偏老先执行wsl --update再试。3.2 wsl --install 卡在“正在下载”的常见原因与提速方案我安装过程中最常遇到的问题就是命令卡在“正在下载”或“正在安装”阶段看起来像死机但进度条动都不动。常见原因有两个一是Windows功能变更需要重启但系统还没重启二是网络下载环节卡住。第二个原因在现实环境中很普遍。微软的下载服务在国外默认通道的CDN响应在国内经常极不稳定尤其在有防火墙、校园网或内网代理的情况下更容易出现反复重置、下载中断。我的处理方案按优先级排序先试wsl --install --web-download。这个参数会绕过Windows Store机制改用网页直接下载WSL相关组件部分环境下速度明显改善。wsl --install -d Ubuntu-22.04 --web-download如果还是慢手动下载发行版安装包。微软官方提供了Ubuntu的AppxBundle包你可以从Microsoft Store网页版获取安装包再通过Add-AppxPackage命令本地安装。Add-AppxPackage 下载的AppxBundle路径最硬核的替代方案是直接下载tar包然后用wsl --import导入。这个方法同时解决“安装慢”和“安装到D盘”两个问题具体命令我在第4节展开。如果你知道自己网络环境的代理设置也可以先给PowerShell配置好系统代理但这是次要手段优先把官方下载通道换掉更直接。3.3 老版本WSL怎么升到这个新流程如果你以前装过WSL 1或者用的是很早的预览版升级到WSL 2的套路是wsl --set-default-version 2 wsl --update如果wsl --set-default-version 2提示找不到内核你需要单独下载微软提供的WSL 2 Linux内核更新包wsl_update_x64.msi。安装完再执行一次即可。更老的环境推荐直接卸载已有WSL组件按3.1节重新来过省得历史遗留问题影响后续状态。4. 把WSL挪到D盘的操作逻辑4.1 为什么建议挪盘WSL 2发行版的数据不是一个简单文件夹而是一个VHDX虚拟磁盘文件默认放在C盘的用户AppData目录下。你装多少软件、存储多少数据都会膨胀这个文件。除非你C盘真的非常宽裕否则一旦虚拟机磁盘膨胀到三五十GB清理和维护都很痛苦。把WSL挪到D盘的价值不只是省C盘空间还有两个隐藏好处一是重装Windows时D盘格式化概率低于C盘数据幸存率更高二是机械硬盘或独立固态在D盘时大文件读写不会和系统盘抢IO。4.2 导出/注销/导入三步走的细节想挪到D盘最稳妥的流程是这样的首先确保WSL已经处于停止状态然后执行导出wsl --export Ubuntu-22.04 D:\backup\ubuntu2204.tar这一步会把整个Linux文件系统打包成一个tar。如果你的发行版已经装了不少软件这个文件会比较大耐心等待。接下来注销原发行版wsl --unregister Ubuntu-22.04这个命令意思是从WSL的管理名单里移除这发行版并且删除它在C盘的虚拟磁盘文件。注意这步会删除数据所以上一步的导出不能省。然后导入到目标盘wsl --import Ubuntu-22.04 D:\WSL\Ubuntu22.04 D:\backup\ubuntu2204.tar --version 2这行命令会创建一个新虚拟磁盘放在D:\WSL\Ubuntu22.04目录下从之前的tar包里恢复数据并且指定用WSL 2运行。4.3 挪完别忘了设置默认用户迁移完以后有个后悔坑导入回来的发行版默认用户名是root而不是你以前配置的普通用户。如果你直接wsl -d Ubuntu-22.04进去会看到root机器名这时很多文件的所有权不对劲日常折腾会变得很别扭。解决办法是修改WSL配置文件在Linux终端里执行sudo tee /etc/wsl.conf EOF [user] default你的用户名 EOF然后退出WSL终端执行wsl --shutdown让实例完全重启再进入时就恢复成普通用户了。如果你忘记以前的用户名是什么可以在root状态下ls /home直接查看。5. 报错修复实录乱码式的WSL错误链路怎么拆5.1 错误查询的正确方式不要只盯着最后一段我见过很多人在安装WSL时报错然后截图或记录一串像这样的错误码WSL/INSTALLDISTRO/SERVICE/REGISTERDISTRO/CREATEVM/HCS/ERROR_FILE_N这串东西初次看确实劝退但它其实是一个错误链路每一段都代表安装流程中的一环而不是一个随机字符串。拆开看installdistro指示是发行版安装阶段失败serviceWSL的服务进程执行安装服务时出了问题registerdistro系统尝试注册发行版信息时失败createvmWSL 2需要创建虚拟机实例这一步卡住hcsHost Compute ServiceWindows的宿主计算服务负责调度轻量虚拟机这一步往往和Hyper-V组件相关error_file_n最后指向文件层的错误可能是找不到文件、权限不足、或者磁盘路径不存在所以看到这种长串错误别急着去网上复制整串搜索先把最后一段error_file_n多想想是不是C盘空间不够是不是下载目录不可写是不是用户目录里有中文或特殊字符然后再结合前面的createvm/hcs去查虚拟机平台开关。5.2 最常见的那几类零散错误到底指什么我整理一下自己遇到过以及帮人排查过的常见WSL错误未必100%覆盖但命中率高错误码或提示常见原因首查方向0x80070003安装文件路径错误或磁盘空间不足检查下载目录和C盘剩余空间0x80370102虚拟机平台服务启动失败或虚拟化被禁用检查BIOS虚拟化开关0x8007019e当前配置不支持WSL 2通常是虚拟化未启用开启VT-x/SVM0x800701bc缺少可选的Windows组件重新启用“虚拟机平台”和“Linux子系统”error_file_n / ERROR_FILE_NOT_FOUND文件层错误找不到包或权限不足检查用户目录权限和路径这个表格不是标准错误码大全但适合拿来排查。因为同一段报错在不同版本Windows上的表现差异很大先锁定硬件虚拟化和Windows功能这两层能解决一多半问题。5.3 一套通用排查动作从虚机支持到系统组件我的排查顺序基本都是固定的你也可以按这个顺序走确认虚拟化已启用任务管理器CPU信息里“虚拟化”必须显示已启用。如果没有进入BIOS找Intel Virtualization Technology或SVM Mode打开后重启。在“启用或关闭Windows功能”里确认“适用于Linux的Windows子系统”和“虚拟机平台”两项都勾选。如果曾经勾掉过重新勾上并重启。如果系统开启了内存完整性核心隔离而你有旧版本Windows建议临时关掉再试。内存完整性和旧版Hyper-V组件有时会有兼容问题。用管理员PowerShell执行wsl --update强制刷新WSL内核版本。重置WSL组件。在“设置→应用→已安装的应用”里找到“Windows Subsystem for Linux”或“Windows Subsystem for Linux Update”先尝试修复再尝试重置。如果还没解决检查Windows事件查看器在“应用程序”日志里过滤来源为“Hyper-V”或“WSL”的事件找到更具体的错误文本。5.4 实在查不出来时的终极大法以上都试完还不行我就用这招“重启一切Windows功能”的骚操作在管理员PowerShell里Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart Disable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart重启电脑然后再用Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart再重启一次。这个过程比单纯修复彻底得多能清掉很多组件的“半挂起”状态。若还是不行再用dism /online /cleanup-image /restorehealth修复系统镜像基本是最后的兜底手段。6. 在VS Code中打开WSLRemote-WSL的完整工作流6.1 装一个扩展VS Code才算接上了WSLWSL装好后你以为打开VS Code就能看到Linux文件并不会。必须安装微软官方的远程扩展名字是“Remote - WSL”扩展ID为ms-vscode-remote.remote-wsl。这个扩展安装逻辑有点特殊你需要在Windows侧的VS Code里安装一次然后当你连接WSL时VS Code会自动在WSL内部也安装对应的后端组件。这个过程不需要手动干预但前提是Windows侧的VS Code版本不要太老。装好以后你会发现左下角多了一个绿色图标点击可以看到“连接到主机”和“在 WSL 中打开窗口”这类选项。绿色图标就是远程会话的标识。6.2 三种打开方式我日常用的那一种第一种是图形化连接打开VS Code按F1或CtrlShiftP输入“WSL: Connect to WSL”选择一个发行版。VS Code会重新加载窗口然后左下角显示“WSL: Ubuntu-22.04”。第二种是最推荐的命令行方式先打开Windows Terminal或PowerShell进入WSL终端wsl cd ~/projects/my-app code .VS Code会自动启动并且直接识别出当前目录是WSL路径打开后就是远程会话。这个方式对我来说最顺手因为我不需要先开VS Code再找项目。第三种是从资源管理器进入在地址栏输入\\wsl$\Ubuntu-22.04\home\用户名\项目目录然后用VS Code打开。这个方式适合临时查看文件但我不推荐作为日常开发入口。因为它的路径显示的是UNC网络路径有些插件和调试器在解析路径时会出问题。6.3 WSL里开发的日常操作终端、文件树、扩展隔离进入WSL远程会话以后你会发现VS Code的文件树显示的是Linux路径内置终端自动打开成了bash你可以直接敲Linux命令。这是最核心的体验。还要注意扩展隔离VS Code的扩展分成“本地”和“WSL远程”两侧。比如中文汉化包、C/C扩展、Python扩展在Windows侧装了不代表WSL侧也有。VS Code会智能提示“在WSL中安装”你点了才会在WSL侧生效。实际体验上C/C、Python这类依赖语言服务的插件最好都装到WSL侧而主题、图标这类纯界面扩展装本地即可。如果你发现某个插件在WSL会话里不工作先检查是不是只装了Windows侧而没有装WSL侧。另外把项目放在/home/用户名/下面运行性能最好。我习惯在Windows侧用VS Code编辑WSL里的关键配置文件比如.wslconfig和/etc/wsl.conf但项目源码一定要放到WSL的Linux文件系统里否则大型编译和调试会遇到很多说不清的卡顿。7. 装完环境还得能干活快速配置C/C、Python和GPU7.1 C/C开发环境的一条龙配置很多人在Windows上用VS Code写C会遇到一堆编译器路径问题。在WSL里反而简单因为Linux的软件包管理器能一键装齐sudo apt update sudo apt install build-essential gdbbuild-essential会把你需要的GCC、G、Make等工具链一并装好。然后在VS Code WSL会话里安装C/C扩展ms-vscode.cpptools它会提示你安装WSL侧的clangd或C/C调试组件直接同意。写一个测试C文件后VS Code按F5会生成launch.json一般会自动识别为Linux调试环境选中“C (GDB/LLDB)”即可。至于编译我更习惯直接在VS Code终端里用命令编译gcc -g main.c -o demo ./demo不需要配复杂的task.json命令行跑通后再考虑要不要编辑器一键编译。7.2 Python虚拟环境与VS Code的选择Python在WSL里也是个高频需求。系统自带的Python 3别去动它给每个项目建虚拟环境更卫生sudo apt install python3-pip python3-venv -y cd ~/projects/my-python-project python3 -m venv .venv source .venv/bin/activate然后在VS Code里按CtrlShiftP输入“Python: Select Interpreter”选择.venv里的Python。配合Pylance和Python扩展代码提示和类型检查都很完整。一个小提醒pip在国内默认源经常很慢可以通过清华或阿里云的PyPI镜像加速pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple这个设置在WSL里只对当前用户生效不影响Windows侧Python。7.3 有显卡的注意WSL里CUDA和ROCm的处理方式如果你装WSL是为了跑深度学习或GPU计算重点说一下NVIDIA显卡用户Windows侧安装支持WSL的Game Ready或Studio驱动即可WSL内部不要安装Linux驱动。WSL 2会把GPU们暴露给Linux这一侧你只要在Linux里安装CUDA Toolkit。推荐用NVIDIA官网针对WSL-Ubuntu的deb方式安装装完以后在WSL终端执行nvidia-smi能看到显卡信息说明GPU直通正常。然后在Python里验证PyTorchimport torch print(torch.cuda.is_available())如果返回True深度学习环境就通了。AMD显卡用户比如热词里有人提到RX 7900 XTX跑PyTorch在WSL里的问题我的建议是ROCm目前对WSL的支持远没有NVIDIA的CUDA顺畅虽然社区有人在WSL里通过环境变量和特制镜像跑通了PyTorch但稳定性、踩坑成本和官方支持程度都差不少。我的态度很明确如果主要靠这块卡做深度学习优先考虑原生Linux系统或者换支持更成熟的方案别在WSL里耗太久。最后说两句实际心得现在我的日常已经基本完全稳定在“Windows侧做日常办公VS Code打开WSL写项目”这套组合上。使用中还有一个值得养的细节习惯放WSL里的项目目录用Git管理大型数据、模型权重用软链接指向Windows的共享目录这样既保住Linux文件系统的性能又不浪费Windows盘的容量。如果你也正在搭这套环境不用追求一次把所有工具装完。先把WSL启动通、能在VS Code里打开目录再按需补语言环境和工具链过程会顺畅很多。遇到解决不了的问题先重启WSL实例再用正文里那套排查顺序逐步走大部分坑都能自己拆掉。
返回列表