ARTICLE DETAIL

资讯详情

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

Windows10安装WSL2实战:避坑、迁移与Docker/VS Code配置

Windows10安装WSL2实战:避坑、迁移与Docker/VS Code配置 1. 先想清楚WSL解决的是哪一类麻烦很多人第一次在Windows10上安装WSL动机其实非常朴素某个命令行工具只有Linux版本某个脚本在Windows的Git Bash里跑不起来或者不想为了跑一个Redis、一个Docker就把整台机器重启进Ubuntu。WSL的价值就在这儿——它让你不用离开Windows桌面就能拿到一个几乎原汁原味的Linux命令行环境文件、网络、进程和Windows主机挨在一起复制粘贴直接用。但安装WSL这四个字背后其实藏着好几条不同的技术路线选错了路线后面就是无尽的报错和重装。我在不同机器上装过十几次从早期的WSL1手动开组件到后来的wsl --install一条命令搞定中间踩过的坑基本可以写成一本小册子。这篇文章就把Windows10这个特定平台上的安装细节拆开讲包括版本门槛、组件依赖、安装路径选择、常见的卡顿与报错处理以及装完之后真正让WSL好用起来的一轮配置。先说适用人群。如果你满足下面任意一条WSL基本都能明显改善你的工作方式日常开发依赖Linux工具链比如gcc、make、Python虚拟环境、Node版本管理需要跑Docker、Kubernetes本地集群、或者数据库服务做本地测试做嵌入式、固件分析类工作要用binwalk、squashfs-tools、交叉编译工具链习惯bash脚本、zsh、tmux这一套但又离不开Windows上的Office、设计软件和游戏。反过来如果你的需求是完整图形桌面、需要直接访问USB设备做底层调试、或者要跑对内核版本有强要求的软件WSL的边界就会露出来虚拟机或者双系统才是更合适的选择。这个判断在动手之前做完能省掉后面大量返工。1.1 WSL1和WSL2不是同一代东西绝大多数安装完不好用的抱怨根子都在这里。WSL1是把Linux系统调用实时翻译成Windows系统调用本质上是一个兼容层WSL2则是跑在轻量级虚拟机里的一整个真实Linux内核。两者的差别直接决定了你的使用体验。对比项WSL1WSL2内核无真实Linux内核系统调用翻译独立的真实Linux内核跨文件系统性能访问Windows文件较快访问Windows文件明显偏慢Linux内部文件性能一般接近原生Docker支持基本不可用官方支持Docker Desktop默认后端systemd不支持新版本可通过配置开启内存占用低动态占用需要时可限制网络与主机共享独立NAT需要端口转发结论很直接现在装WSL一律按WSL2来。WSL1只在极少数场景还有意义比如你确实需要极低的内存占用而且大量时间都在操作/mnt/c下的文件。对于99%的人这个权衡不成立。1.2 为什么Windows10上的安装体验和Windows11差那么多Windows11把WSL的商店版本、内核更新、图形支持都做成了默认通路一条命令下去基本不会失败。Windows10则要看具体补丁版本2004内部版本19041以后才支持wsl --install这条捷径21H2、22H2才逐渐把WSLg、systemd这些能力补齐而且很多能力依赖从Microsoft Store更新的WSL组件而不是系统内置的那份老版本。这就解释了一个常见现象同样敲wsl --install别人一次性通过你这里却卡住或者报内核缺失。所以第一步永远是先确认自己站在什么地基上这比急着敲命令重要得多。2. 动手前的三项系统体检我在帮别人远程排查时发现大量时间浪费在命令敲下去报错了才开始查环境。把这三项提前确认能过滤掉一大半问题。2.1 确认Windows10的版本号够不够按Win R输入winver回车。你会看到一个弹窗重点看两个信息版本号和操作系统内部版本。内部版本低于19041也就是2004之前的版本没有wsl --install必须走手动开启功能组件的老路而且WSL2支持不完整建议先做一次系统更新。内部版本19041到19044之间可以用wsl --install但WSL相关组件比较旧装完务必执行一次更新。内部版本1904522H2目前Windows10里体验最完整的一档图形界面支持和systemd都可以尝试。如果你想用命令行确认管理员权限的PowerShell里执行Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsBuildNumber, OsArchitectureOsArchitecture这一项也有意义。WSL2支持x64和ARM64如果你的机器是ARM架构后面下载分发版和内核更新包时要选对版本否则会出现装不上或者启动即失败的情况。2.2 虚拟化开关和Hyper-V的关系WSL2必须依赖虚拟化。这里有个很常见的误解很多人以为只有装了Hyper-V才能用WSL2其实Windows10家庭版没有Hyper-V管理器照样可以装WSL2需要的只是虚拟机平台Virtual Machine Platform这个功能组件。需要检查两层第一层是硬件层也就是BIOS里的虚拟化开关。Intel平台叫Intel Virtualization TechnologyVT-xAMD平台叫SVM Mode通常在Advanced或CPU Configuration菜单下。开机时按F2、Del或F10进BIOS找到对应选项设为Enabled保存重启。第二层是系统层。可以在任务管理器里看切到性能标签选CPU右下角会显示虚拟化已启用/已禁用。这里显示已禁用的话即使BIOS开了也可能是被其他虚拟化软件占用了或者系统功能组件没装全。注意如果你机器上装着老版本的VMware或VirtualBox它们和Hyper-V系的虚拟化平台可能互相抢占。遇到WSL2启动失败、报虚拟化相关的错误码时先看看是不是这类软件在运行必要时升级到支持Hyper-V共存的版本。2.3 磁盘空间和存放位置的规划WSL2的每个分发版都是一个独立的ext4虚拟磁盘文件ext4.vhdx默认放在系统盘的%LOCALAPPDATA%\Packages\下面。这个设计有两个后果一定要提前知道它会随着你的使用不断膨胀。删掉文件不等于磁盘变小虚拟磁盘只增不减需要手动压缩。默认落在C盘。做深度学习、编译大型项目的人几十GB很快就没了C盘爆满之后Windows本身都会出问题。所以我的习惯是如果C盘不宽裕在安装之前就把分发版装到其他盘或者装完立刻导出、注销、再导入到目标盘。具体操作在后面的维护章节里讲。这里只需要记住一个数字预留至少40GB。3. 三条安装路线的实际操作3.1 一条命令的现代安装法确认版本够新之后管理员权限打开PowerShell直接执行wsl --install不指定参数的话它会自动开启所需的两个功能组件Windows Subsystem for Linux和Virtual Machine Platform下载WSL2内核安装默认分发版通常是Ubuntu然后提示你重启。重启后首次启动会自动弹出终端窗口让你设置用户名和密码。如果你想指定分发版先看有哪些可选wsl --list --online输出是一个列表每行左边是分发版名称右边是简介。然后按名字装wsl --install -d Ubuntu-22.04装完验证wsl -l -v输出里应该看到你的分发版名字、状态Running或Stopped和版本号VERSION列应该是2。如果VERSION显示1说明默认版本没设对用这条命令改wsl --set-version Ubuntu-22.04 2这个转换过程可能持续几分钟取决于分发版里已有多少文件期间别关窗口。3.2 手动开组件加商店安装的老办法如果你的Windows10版本偏旧或者wsl --install因为某些原因执行不了就走这条更笨但更可控的路。第一步管理员PowerShell开两个功能组件dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart第二条命令是WSL2必需的。如果你的系统版本实在太老它可能提示找不到这个功能名那就说明需要先更新系统。第二步重启电脑。这一步不能省功能组件的启用必须重启才生效。第三步下载并安装WSL2内核更新包。官方提供的是一个msi文件装完之后可以用这条命令确认内核状态wsl --status第四步设置默认版本wsl --set-default-version 2第五步打开Microsoft Store搜索Ubuntu安装或者直接下载官方的离线appx包安装。商店路径的好处是后续更新方便坏处是受商店本身的状态影响偶尔会遇到下载中断。3.3 离线包安装网络条件不好时的兜底方案wsl --install太慢、或者每次都在下载分发版那一步失败是很典型的一种情况。这时候有两个思路。思路一是让WSL跳过商店直接从官方服务器拉取wsl --update --web-download这个参数在WSL较新版本里支持能绕开商店的分发通道速度往往有改善。思路二是彻底走离线路线提前准备好分发版的离线包用导入的方式装。分发版的离线包通常是一个压缩归档文件tar或tar.gz格式拿到之后执行wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\downloads\ubuntu-22.04-rootfs.tar --version 2三个参数分别是注册到系统里的名字、虚拟磁盘要放的目标目录、以及离线包路径。这条命令的好处是把下载和安装彻底解耦你可以用任何方式把包弄到手然后在完全离线的环境里完成安装。我在内网机器上基本都是用这种方式。注意用--import装出来的环境首次启动不会自动提示设置用户默认以root登录。要改默认用户需要在WSL里创建好账户后编辑/etc/wsl.conf[user] default你的用户名写完保存回Windows执行wsl --shutdown关掉子系统再启动就生效了。4. 安装过程里最容易翻车的四个环节这一节是整篇文章里最值钱的部分。上面那些步骤官方文档都有但下面这些排查过程是你翻十篇教程都找不到的。4.1 卡在下载环节迟迟不动现象是命令敲下去进度条停在某个百分比或者干脆没有任何输出十几分钟没反应。原因通常有三种网络到达官方分发服务器路径不畅、商店组件本身状态异常、以及磁盘写入慢导致的假死。排查顺序我建议这样走先按Ctrl C中断看是命令卡住还是系统卡住。如果中断之后能立刻回到提示符说明是网络等待不是死锁。执行wsl --update --web-download走网页下载通道很多时候这一步就能过。如果还是不行检查一下系统的网络设置里有没有异常的DNS配置。WSL的更新和分发版下载走的是标准HTTPSDNS解析不出去会一直重试。最后的手段就是离线包导入。与其反复重试下载不如换条路时间成本低得多。我自己的经验是在家庭宽带上wsl --install通常没问题在公司网络或者带网络策略的环境里直接上离线包导入最省事。4.2 报错your version of WSL is too old的来龙去脉这个报错完整文案大概是Your version of Windows Subsystem for Linux (WSL) is too old. Run the command wsl --update...。它通常不是你在WSL里操作时看到的而是Docker Desktop、VS Code或者某些第三方工具调用wsl.exe时弹出来的。根因在于这些工具要求一定版本以上的WSL组件而你系统里那份可能是Windows10内置的老版本或者商店版和内置版打架了。解决路径wsl --update如果这条命令本身报错或者没反应改用wsl --update --web-download执行完再确认版本wsl --version要注意老版本WSL可能不支持--version这个参数会提示未知选项。那就用wsl --status看内核版本。如果--update一直失败可以手动重启一下相关服务或者直接重启电脑再试一次——听起来很土但对组件注册类的问题有奇效。还有一种更麻烦的情况装完之后Docker Desktop仍然报这个错。这时候去Docker Desktop的设置里找到关于WSL引擎的选项确认它指向的是正确的WSL组件然后重启Docker Desktop。实在不行就卸载Docker Desktop重装让它在安装时重新探测WSL环境。4.3 虚拟化相关的错误码常见的两个0x80370102和0x800701bc。前者含义是虚拟机无法启动因为所需功能未安装后者多是WSL2内核更新缺失。这两个错误的处理逻辑完全不同别混着查。0x80370102的排查清单BIOS里虚拟化是否真的开了。任务管理器性能页确认一遍别只凭记忆。系统功能里VirtualMachinePlatform是否启用。用这条命令看Get-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatformState应该是Enabled。如果是Disabled用前面给的dism命令开启并重启。有没有第三方虚拟化软件在占用。老版本VirtualBox的驱动会和Hyper-V系冲突升级或者临时卸载。0x800701bc就直接装内核更新包。装完执行wsl --shutdown彻底停掉再启动分发版。4.4 分发版装上了但启动黑屏或者秒退这种情况我遇到过两次一次是因为Windows10版本太旧另一次是因为杀毒软件的实时防护拦住了WSL的进程创建。排查思路换一个分发版试试比如从Ubuntu换成Debian。如果换了就好问题在特定分发版的镜像上。临时关掉安全软件的实时防护看是否恢复。用wsl --shutdown彻底停止所有实例再启动。进Windows事件查看器看应用程序日志里有没有对应的错误记录。如果全都试过还是不行用wsl --export把数据导出来wsl --unregister注销再重新导入。重装往往比死磕快。5. 装完必须做的第一轮配置安装成功只是起点。下面这几步做了WSL才真正顺手。5.1 首次启动的账户设置从商店安装的分发版第一次启动会提示你输入UNIX用户名和密码。用户名建议全小写、不含空格密码输入时不显示字符是正常的不是键盘坏了。这个密码后面sudo会频繁用到记牢或者干脆设一个好记的。如果你不想每次输入密码可以在WSL里编辑sudoers用sudo visudo别直接改文件你的用户名 ALL(ALL) NOPASSWD: ALL方便是方便但这是降低安全性的操作。个人开发机上可以接受多人共用的机器上不建议。5.2 软件源与apt加速刚装好的Ubuntuapt update可能要等很久。更换软件源是最直接的优化。Ubuntu 22.04及以前的版本配置在/etc/apt/sources.list24.04开始改用deb822格式在/etc/apt/sources.list.d/ubuntu.sources。改之前先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后把里面的地址替换成你所在网络环境下访问更快的镜像源。改完执行sudo apt update sudo apt upgrade -y顺手装一批基础工具sudo apt install -y build-essential git curl wget unzip vim htop net-tools这行命令我几乎每台新环境都会跑一遍。build-essential是编译工具链net-tools提供ifconfig这类老牌网络命令虽然有人觉得过时但排查网络问题时还是比ip命令直观。5.3 跨文件系统访问的性能陷阱这是WSL2最容易被忽略的一点。WSL2里Windows的C盘挂载在/mnt/cD盘在/mnt/d依此类推。访问这些路径是可以的但性能差异巨大。我实测过一个场景在/mnt/c下解压一个十几万文件的项目耗时是以分钟计的同样操作放在~/下面几秒钟就完事。原因在于跨文件系统访问要走一层协议转换每次文件操作都有额外开销。所以有两条实用规则Linux项目源码、node_modules、Python虚拟环境、数据库数据目录一律放在WSL自己的文件系统里也就是~/下面。Windows上的文件需要给WSL用时尽量用cp复制过来处理处理完再复制回去而不是直接原地操作。如果你必须访问Windows侧的文件用\\wsl$\这个UNC路径从Windows访问WSL文件或者用/mnt/从WSL访问Windows文件都是可行但慢。知道这个特性就不会写出让人抓狂的构建脚本。6. 把WSL接进日常工具链6.1 VS Code的WSL远程模式怎么工作在WSL里进入项目目录敲code .前提是Windows侧装了VS Code和WSL扩展。这里的机制值得说清楚VS Code的界面跑在Windows上但语言服务、终端、调试器全都跑在WSL里。所以你的Python解释器路径、Node版本、编译工具链用的都是WSL环境里的那一套和Windows侧的完全隔离。这个设计的好处是你不需要在WSL里装一个图形界面的编辑器也不需要把项目复制到Windows侧。坏处是复制粘贴大文件时偶尔会有延迟而且扩展要装两遍——一遍在Windows侧用于界面一遍在WSL侧用于实际运行。VS Code通常会提示你在WSL中安装推荐的扩展点一下就行。6.2 Docker Desktop与WSL2后端的配合装了Docker Desktop之后进设置找到引擎相关的选项勾选使用WSL2后端然后在资源里的WSL集成部分打开你常用的那个分发版的开关。做完这些你在WSL终端里敲docker ps就能直接看到容器列表。这里有个实用技巧Docker Desktop可以把容器镜像和卷放在指定的WSL分发版里如果你的镜像很多这个分发版会快速膨胀。定期用docker system prune -a清理无用镜像能省下不少空间。6.3 图形界面能用到什么程度Windows10上的WSLg支持情况不像Windows11那么顺需要系统版本较新而且要用商店版WSL组件。验证方法是执行sudo apt install -y x11-apps xeyes如果弹出一对跟着鼠标转的眼睛说明图形通路是通的。能用但别指望它跑重度图形应用。我的定位很清楚偶尔开个图形化的调试工具、看个matplotlib的图可以正经的图形工作还是回Windows侧做。7. 长期使用要养成的维护习惯7.1 导出、迁移和备份WSL的备份本质上就是把整个ext4虚拟磁盘打包。命令很简单wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu-2204-20250101.tar导出前一定要先--shutdown否则可能出现数据不一致。这个tar文件可以直接在另一台机器上导入属于最省事的环境迁移方案。导入到新位置wsl --import Ubuntu-22.04 D:\wsl\Ubuntu-22.04 D:\wsl-backup\ubuntu-2204-20250101.tar --version 2导入之后默认用户会变回root记得按前面说的改/etc/wsl.conf。这个技巧还有一个重要用途把默认在C盘的分发版搬到其他盘。流程就是导出、注销、导入到新位置。注销的代价是原来的注册信息没了所以导出这一步绝对不能省。7.2 磁盘文件只增不减怎么处理用久了你会发现WSL占的空间比实际文件内容大得多。因为虚拟磁盘不会自动收缩。处理方式是先彻底关闭WSL再用diskpart压缩wsl --shutdown diskpart进入diskpart交互界面后依次执行select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit那个长路径根据你实际的分发版不同而变化可以在%LOCALAPPDATA%\Packages\下面找含LocalState的目录里面就有ext4.vhdx。我一般是每隔两三个月做一次配合前面的清理能把空间占用压下来一大截。7.3 卸载干净再重装的正确姿势直接用Windows的应用和功能卸载分发版经常留下残留的注册信息和虚拟磁盘文件导致重装时报分发版已存在。干净的做法是用WSL自己的命令wsl --list --verbose wsl --unregister Ubuntu-22.04--unregister会同时移除注册信息和虚拟磁盘所以执行前务必确认数据已经导出。如果只是想重置环境而不删数据那就在WSL内部重装相关软件包或者从备份导入一个干净的环境覆盖。最后分享一个我自己用顺手的小配置。在Windows用户目录下创建.wslconfig文件限制WSL2的资源占用[wsl2] memory6GB processors4 swap4GB localhostForwardingtrue不加限制的话WSL2会按需吃掉大量内存用久了Windows侧会明显变卡。给个上限日常开发完全够用机器也不会喘不过气。改完执行wsl --shutdown再启动生效。这个文件放在C:\Users\你的用户名\下面不是放在WSL里面这点容易搞混。
返回列表