ARTICLE DETAIL

资讯详情

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

WSL2安装完全指南:从零配置到Docker/VSCode联动

WSL2安装完全指南:从零配置到Docker/VSCode联动 说实话我入坑WSL的动机特别朴素2022年下半年要在Windows 11上跑一批Linux下的数据处理脚本双系统来回重启真的太磨人了虚拟机方案又总觉得性能隔了一层。后来发现WSL2能直接跑完整Linux内核还被VSCode无缝调用才觉得这条路彻底走对了。这篇教程我把从零装WSL的完整过程以及后来断断续续踩过的坑都写出来重点覆盖wsl --install卡在请稍后、下载速度慢到怀疑人生、离线安装Ubuntu、装完换源、VSCode和Docker联动还有几个高频报错的排查思路。不管你是第一次接触WSL的新手还是已经装好但偶尔被报错困扰的用户按这篇文章的顺序走一遍基本能避开我当初绕过的那些弯路。1. 先说清楚WSL到底解决了什么问题1.1 为什么我推荐在Windows上先试WSL而不是直接装双系统先交代一个背景。我最早接触Linux是从双系统开始的Ubuntu和Windows各占一块硬盘用Grub引导。听起来很美好实际上痛苦得很写代码写到一半想切回Windows查个资料得先关掉一堆Linux下的进程再重启等引导菜单运气不好显卡驱动还能给你黑屏一次。后来也试过VirtualBox装Ubuntu Server虽然不用重启了但磁盘IO损耗肉眼可见跑编译任务的时候风扇直接起飞。WSL的出现正好把这两个方案的痛点都绕过去了。它不是虚拟机那种完整硬件模拟也不是双系统那种物理分区共存而是微软在Windows内核里专门做了一层Linux兼容环境。日常写脚本、跑程序、用终端工具链绝大部分Linux软件都能直接在WSL里跑同时你还能正常用Windows的桌面软件两边文件还能互通。对绝大多数后端开发和数据处理场景来说这已经非常够用了。而且WSL的安装成本极低不需要给硬盘单独分区不需要准备启动U盘更不需要担心装完系统引导坏了。试错成本几乎为零装完不喜欢直接在Windows应用里卸载掉系统干干净净。想尝鲜Linux的话WSL是成本最低的一条路。1.2 WSL1与WSL2怎么选两者不是版本升级那么简单很多人以为WSL2只是WSL1的加强版其实两个版本的架构完全不一样。WSL1是把Linux系统调用翻译成Windows系统调用没有真正的Linux内核好处是启动快、内存占用低、和Windows文件系统交互速度快坏处是部分依赖内核特性的软件跑不起来比如Docker、某些内核模块。WSL2则是在轻量级虚拟机里跑了一个完整的Linux内核兼容性大幅提升Docker、CUDA这类对内核有要求的工具都能正常用了。缺点是跨文件系统的读写性能不如WSL1启动和内存占用也比WSL1高一些。我把两者的关键差异整理成了一张表可以直接对照选型对比项WSL1WSL2架构系统调用翻译层轻量级虚拟机 完整Linux内核Linux内核兼容性差部分软件无法运行完整Docker/CUDA可用启动速度极快较快内存占用低较高默认有内存上限跨文件系统访问性能很好较慢适用场景轻量脚本、文件处理后端开发、容器、深度学习现在默认安装的都是WSL2如果你的发行版还在用WSL1可以随时用命令切换wsl --set-version 发行版名 2。我的建议很简单新环境直接上WSL2没必要回头折腾WSL1。只是日常跑几个命令的话两个版本差异不大但一旦涉及Docker这类工具WSL1会很难受。2. 安装前的环境确认版本、虚拟化和BIOS设置2.1 Windows 11版本要求与能不能装的判断标准先说系统版本。Windows 11从21H2开始就内置了wsl.exe这个命令也就是说只要是正常的Windows 11系统理论上都可以直接使用wsl --install一步安装。不需要像老教程那样手动去启用或关闭Windows功能里勾选一堆选项命令会把需要的功能全部自动打开。家庭中文版和专业版在WSL支持上没有本质区别都能正常装。网上那些家庭版装不了WSL的说法其实是误解真正的限制只来自系统版本过老或者虚拟化没开。建议装之前先看下系统信息按WinR输入winver确认系统版本号在22000以上。如果你用的是23H2、24H2这类较新版本WSL的安装体验会更顺畅即使你是预览版的27H2用户也不用担心新版对WSL的集成只会更完善。另外提醒一句如果你的Windows 11是从Win10老系统升级来的升级前系统里可能已经装过旧版WSL组件这会导致wsl --install的行为和全新系统不完全一样。遇到这种情况优先执行一遍wsl --update把WSL本体升到最新再继续后续操作能避免很多奇怪问题。2.2 虚拟化没开是一切问题的根源WSL2依赖Windows的虚拟机平台如果CPU虚拟化功能在BIOS里被关了后面启动WSL2时会直接报错提示请启用虚拟机平台Windows功能并确保在BIOS中启用了虚拟化。这个报错几乎每个WSL新手都会遇到一次而且很多人会误以为是WSL没装好反复重装浪费时间。判断虚拟化有没有开启很简单按CtrlShiftEsc打开任务管理器切到性能标签看CPU这一栏右下角有没有虚拟化已启用。如果显示已禁用就需要重启进BIOS在CPU Configuration或Advanced菜单里找到Intel Virtualization TechnologyIntel VT-x或AMD SVM Mode改成Enabled保存退出。这一步很多人会忽略尤其是公司电脑和个人组装机。公司电脑往往是IT统一锁了BIOS个人组装机则可能是买回来就没注意过这个选项。装WSL之前花两分钟确认一下能省掉后面一堆莫名其妙的错误。另外有用户装了第三方杀毒软件或者某些系统优化工具这类软件可能擅自关闭Windows的虚拟化相关功能检查的时候也要留意。3. 标准安装路径wsl --install 一条命令的完整执行过程3.1 以管理员身份执行命令时要注意的细节确认完系统版本和虚拟化状态后接下来就是最核心的安装步骤。右键点击开始菜单选择终端(管理员)或Windows PowerShell(管理员)注意一定要以管理员身份运行否则后续启用Windows功能的操作会提示权限不足。在终端里执行wsl --install这条命令实际完成了三件事启用适用于Linux的Windows子系统功能、启用虚拟机平台功能、下载并安装默认的Ubuntu发行版。整个过程不需要再手动去控制面板勾选功能也不需要重启后再跑第二遍命令比老教程省事太多。命令执行完如果一切顺利终端会提示重启电脑。重启后再打开开始菜单就能看到Ubuntu的图标了。这里有个小细节重启后第一次点击Ubuntu图标会进入一个等待解压安装的过程有的机器需要几分钟别急着以为又卡住了。如果你想装别的发行版比如Debian或Kali可以用wsl --install -d Debian来指定。想查看当前支持哪些发行版执行wsl --list --online就能看到完整列表。我个人的建议是新手先从Ubuntu开始资料最多遇到问题也最好搜解决方案。3.2 首次启动Ubuntu的初始化配置第一次进入Ubuntu终端系统会提示创建UNIX用户名和密码。用户名会显示在命令行提示符里建议用简单的小写字母组合密码输入时不会显示任何字符这是Linux的默认行为不是键盘坏了。创建完用户后这个账户默认就在sudo组里可以直接用sudo提权。建议第一时间执行sudo apt update sudo apt upgrade -y把系统自带的软件源缓存刷新一遍顺便更新所有基础包。这一步会消耗不少时间但很有必要能避免后续装软件时碰到依赖版本过旧的问题。尤其在Ubuntu 22.04和24.04这些版本上基础库的更新频率挺高跳过这步后面装Python包或编译工具时容易撞上依赖坑。3.3 用命令确认当前WSL版本状态初始化完成后回到Windows终端里验证一下WSL的运行状态wsl --status wsl --list --verbose第一条会显示默认版本和内核信息第二条会列出所有已安装的发行版以及每个发行版当前的WSL版本。正常情况下Ubuntu那一行应该显示为2。如果显示的是1用下面这条命令切换wsl --set-version Ubuntu 2另外建议顺手把WSL本体更新到最新版wsl --update为什么一直强调更新WSL本体因为WSL现在已经不是当年那个随Windows组件一起更新的老版本了它改为在微软商店独立分发迭代速度很快。很多工具报WSL版本过旧的错追根究底都是WSL本体太老而不是发行版的问题。4. 卡在请稍后和下载慢网络问题的完整排查链路4.1 卡在请稍后的根因分析这是我被问得最多的问题也是wsl --install太慢和wsl安装速度慢解决方法这些搜索词的来源。wsl --install在执行到下载发行版那一步时需要从微软的服务器拉取Ubuntu安装包而微软的分发服务器在部分网络环境下访问速度一直不太稳定。表现就是终端卡在正在下载Ubuntu或请稍后这个提示上进度条长时间不动。首先要明确一点绝大多数情况下它不是真的死锁就是单纯的慢。慢到什么程度快的机器两三分钟下完网络状况差的时候我见过卡了半个多小时的。所以第一步是给点耐心该等的等不要一看到没动静就CtrlC中断中断太频繁反而可能留下半截安装状态。4.2 判定真卡死还是假卡死的方法如果你实在不确定它是慢还是卡可以再开一个终端窗口执行wsl --status wsl --list --verbose如果这两条命令能正常返回结果说明WSL服务本身没挂安装进程大概率还在跑。再等10到15分钟如果仍然没有任何进展那就可能是网络链路实在不给力这时候再中断也不迟。中断后先清理现场避免留下半吊子的安装状态wsl --shutdown然后重启电脑确保之前启用的功能已生效。如果重新执行wsl --install还是卡住那就不要死磕默认路径了直接切换到下面的手动下载方案。这里我再补充一个判断技巧如果你能看到任务管理器里有Vmmem或VmmemWSL进程说明WSL内核已经在内存里跑起来了安装进程大概率没有死只是下载慢不用慌。4.3 手动下载发行版安装包的离线方案手动装WSL的原理很简单WSL本体先装好发行版再通过离线包导入。好处是下载过程可以交给浏览器或下载工具完成速度稳定可控而且下载下来的安装包能反复使用换机器或者重置系统后不用重新折腾。两个途径一是从微软官方的WSL发行版下载页面获取安装包二是如果你的场景是完全离线的内网环境可以从一台已经装好的机器上把发行版根文件系统导出来或者找对应版本的离线包。这里主要说官方离线包方式不需要额外工具。拿到安装包后如果是.appx或.msixbundle后缀直接用解压工具解压找到里面那个后缀为.install.tar.gz或.tar.gz的文件这就是WSL可以直接导入的根文件系统镜像。如果没有专门解压工具把后缀改成.zipWindows资源管理器自己就能解压。这个细节很容易卡住人我第一次手动装的时候就是卡在不知道解压哪个文件。4.4 wsl --import导入发行版的完整步骤假设你已经拿到了Ubuntu的rootfs压缩包比如Ubuntu 22.04的离线包。执行导入命令wsl --import Ubuntu-Offline D:\WSL\Ubuntu-Offline D:\Downloads\ubuntu-22.04.tar.gz三个参数依次是发行版名称、存放虚拟磁盘文件的目标目录、离线包的路径。注意发行版名称不要和已有的重名目标目录建议放在空间充足的盘因为虚拟磁盘文件会随着使用不断增大。导入完成后执行wsl -d Ubuntu-Offline进入系统后你会发现默认就是root用户没有日常使用的普通账户。建议建一个自己的用户并把它设置为默认用户useradd -m -s /bin/bash yourname passwd yourname然后在Windows终端里配置默认用户ubuntu-offline.exe config --default-user yourname导入的发行版默认不会自动换源里面的软件源还是Ubuntu官方源记得按下一章的方法配置国内镜像。手动导入的虚拟磁盘文件默认是动态扩容的装的东西越多文件越大不会被预先占满磁盘空间这点可以放心。5. 装完后的第一件事换源和基础工具配置5.1 apt换国内镜像源的完整操作WSL里的Ubuntu默认使用官方源国内访问速度一言难尽尤其是执行apt update的时候进度条经常半天不动。换源是装完WSL之后优先级最高的一件事没有之一。先备份原始源文件然后编辑sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo nano /etc/apt/sources.list不过要特别提醒Ubuntu 22.04及之后的版本用的是deb822格式源文件路径在/etc/apt/sources.list.d/ubuntu.sources别改错地方了。如果你还在改sources.list却没效果大概率就是版本问题。以清华源为例把ubuntu.sources文件内容替换为Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ Suites: jammy jammy-updates jammy-backports Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg保存后执行sudo apt update看到下载速度明显提升就说明换源成功了。阿里云、中科大源的配置方式完全一样只是URIs那行换成对应的镜像地址。不同镜像的同步频率略有差异如果遇到某个包在清华源上没有切换到阿里云源试试很多时候能解决404找不到包的怪问题。5.2 pip和conda的换源方法Python环境是WSL里最常用的场景之一pip的源同样建议换成国内镜像。一行命令的事pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple如果用的是conda在用户目录下创建或修改.condarc文件channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud改完后执行conda clean -i清一下索引缓存再跑conda update --all验证。源配好之后WSL才算真正能顺畅干活。另外建议顺手装上一批基础工具避免后面用到一个缺一个sudo apt install -y build-essential git curl wget unzip zipbuild-essential包含了gcc、g和make这些编译工具很多Python包在WSL里装的时候需要本地编译缺了它会出现一堆command gcc failed之类报错。git和curl更是日常必备早装早省心。6. 与Windows生态的融合VSCode和Docker的联动实践6.1 用VSCode打开WSL里的项目安装WSL的直接好处之一就是VSCode可以无缝打开WSL里的目录在Windows图形界面下编写和调试Linux环境的代码。操作方式是先在VSCode里安装微软官方的WSL扩展然后在WSL终端里进入你的项目目录执行code .VSCode会自动以WSL: Ubuntu的模式打开当前目录。打开后你看到的文件系统是WSL里的路径终端也自动变成了bash编译和运行都发生在Linux环境里但编辑器的体验和Windows本地完全一致。这对做嵌入式、做后端、跑Python脚本的人来说基本就是官方钦定的开发组合。需要注意第一次执行code .时VSCode会在WSL环境里安装一个服务器组件需要等一小会儿看到终端输出一堆东西别慌那是正常的初始化过程。我还习惯在Windows资源管理器地址栏输入\\wsl$\Ubuntu直接以文件夹形式访问WSL里的整个文件系统。日常想从Windows这边往WSL里丢个文件用这个路径比在终端的/mnt/c路径下cd来cd去方便得多。反过来的逻辑也一样WSL里看到的/mnt/c就是Windows的C盘。6.2 Docker Desktop使用WSL2后端时的常见问题Docker和WSL2的配合是另一个高频场景。Docker Desktop在Windows上默认有两个后端选项Hyper-V和WSL2现在绝大多数人都用WSL2后端性能和体积都占优。安装Docker Desktop后在设置里勾选Use the WSL 2 based engine然后在Resources里勾选要使用WSL2后端的发行版即可。但这里有个非常常见的报错Docker Desktop - there was a problem with WSL。出现这个报错的原因通常有两个一是WSL内核版本太旧解决方法是先在PowerShell里执行wsl --update把内核升到最新二是WSL发行版处于异常状态在任务管理器里把所有的Vmmem和虚拟机平台相关进程结束后执行wsl --shutdown重新初始化。如果还不行把Docker Desktop设置的WSL Integration全部取消勾选重启后再重新勾选多半能恢复。另外补充一点Docker Desktop在WSL2后端模式下容器里访问宿主机的localhost是直接通的不需要像传统虚拟机那样配端口转发。反过来Windows浏览器里访问容器暴露的端口也直接走localhost就行。这个特性对本地联调非常友好比纯虚拟机方案舒服太多。7. 高频报错与经验总结7.1 WSL版本过旧的提示怎么处理使用binwalk、部署CUDA环境或者跑一些依赖最新内核特性的工具时很容易遇到Your version of Windows Subsystem for Linux (WSL) is too old这种提示。字面意思就是WSL本体太旧和发行版没关系。解决方法就是升级WSL本体。老版本WSL是作为Windows组件存在的升级路径很憋屈现在WSL已经改成在微软商店独立分发直接执行wsl --update如果网络环境导致这个命令也失败可以去微软商店搜索Windows Subsystem for Linux手动更新或者从WSL的GitHub仓库下载最新安装包安装。装完再执行wsl --version确认版本号通常问题就解决了。这个报错在跑CUDA相关工具时特别常见因为新版WSL对GPU直通的支持是逐步完善的内核版本跟不上就会出现各种诡异行为。7.2 下载发行版时出现403错误有不少人遇到wsl --install -d Ubuntu时下载过程直接失败提示403 Forbidden。这个错误本质是微软分发服务器的返回状态通常是网络链路或缓存节点的问题不是命令写错了。我实测有效的两种处理方式。第一种给命令加上--web-download参数让安装程序走网页下载通道wsl --install -d Ubuntu --web-download第二种完全绕开命令行下载直接按4.3节的方法从官方页面手动下载离线包导入。403和安装太慢其实是同一类问题手动下载是最稳的兜底手段。这里想强调一个经验遇到网络类报错不要反复重试同一个命令换一种下载通道往往比死磕更有效率。7.3 MATLAB识别不到WSL的解决办法这个坑比较特殊是Windows上装MATLAB的用户才会碰到的。MATLAB某些版本默认找不到WSL即使WSL已经装好且能正常使用。问题通常出在MATLAB没有把WSL的可执行文件路径加入系统环境变量或者MATLAB内部对WSL的探测逻辑比较老。解决办法有两个方向。一是在MATLAB里直接调用系统命令运行Linux程序比如在MATLAB命令行里执行!wsl ls能正常返回Linux目录列表的话说明WSL本身可用只是MATLAB的图形化集成界面没识别到。二是使用MATLAB的外部语言接口功能时手动把默认shell路径指向C:\Windows\System32\wsl.exe就能在MATLAB代码里无缝调度WSL环境了。如果是做数据处理和仿真我另一个建议是直接在WSL里安装MATLAB的Linux版本利用WSL2的图形支持跑带界面的MATLAB也没问题。两个方案各有利弊Windows版和Linux版混用的场景下优先用外部语言接口的方式省内存也省授权。7.4 几个日常使用中的小坑最后集中说几个我实际踩过的日常小坑都不严重但遇到了挺耽误时间。第一个是WSL内存占用。WSL2默认最多会吃掉物理内存的50%左右跑几个编译任务就容易把Windows内存挤爆。可以在用户目录下建一个.wslconfig文件限制WSL的内存和CPU[wsl2] memory4GB processors4 swap8GB改完执行wsl --shutdown再重新进入配置才会生效。这个文件的坑在于位置必须在Windows用户目录下比如C:\Users\你的用户名\.wslconfig放在C盘根目录或别的路径都不生效。第二个是跨文件系统的IO性能问题。WSL2里访问/mnt/c/下的Windows文件性能远不如访问Linux自己的文件系统。所以正经的开发项目一定要把代码放到WSL内部目录比如~/projects不要放在/mnt/c下去搞编译否则速度慢得想砸电脑。这是WSL2架构决定的不是配置能救的。第三个是Windows 11无法拖拽文件到CMD窗口的问题。这个很多人问过其实和WSL没有直接关系是Win11默认UAC权限隔离导致的拖拽受限。处理方法是在目标目录地址栏直接输入cmd回车以当前目录权限打开终端窗口或者直接用VSCode的文件管理器拖拽。在WSL场景下文件传输我更推荐用cp命令配合/mnt路径操作两个都好用。第四个坑是WSL里用systemd的问题。旧版WSL不支持systemd导致一些服务管理命令比如systemctl start xxx不可用很多人在里面装redis、mysql时发现启动不了就是这个原因。新版WSL默认已经支持systemd需要确认一下的话在WSL的/etc/wsl.conf里配置[boot] systemdtrue重启WSL就能用systemctl了。装好WSL只是第一步真正顺手的环境需要慢慢打磨。我个人的体会是把换源、限内存、装基础工具链这三件事做在前面后面所有开发场景都会顺畅很多。如果你在装的路上卡在某个报错先把WSL本体升级到最新再回头排查八成问题都能解决。
返回列表