从双系统到WSL 2:Windows下Linux开发环境迁移全攻略
每次在Windows和Ubuntu之间切换双系统,都是一场小赌博。你永远不知道这次重启,Grub会把默认项停在哪儿;也永远不知道上次为甲方改的PPT是不是落在Windows桌面,而你现在人已经在Linux里。我受不了这种来回折腾,转投WSL(Windows Subsystem for Linux)之后,生活一下子清爽了——不用关机、不用单独分盘、不用在引导菜单里做任何手动操作,直接在Windows窗口里就能跑原生Linux环境。这篇文章就是把我从双系统迁移到WSL的整套方案、完整步骤和踩坑经验摊开讲清楚,给同样不想装双系统来回切换的人一个从零到能用的参考,无论是日常开发、跑脚本还是学Linux命令,都能少绕几段弯路。
1. 双系统的痛与WSL的真香:它到底解决了什么问题
1.1 双系统最折磨人的三件事
先说说我为什么铁了心要换。以前觉得双系统很酷:左边Windows右边Ubuntu,随便选。用久了才发现,便利性全被这三件事抵消了。
第一是切换成本太高。你在Windows里写方案写得好好的,突然想验证一个Linux命令,要么打开虚拟机,要么保存文档、关机、等它重启,然后在引导菜单里找Ubuntu那一项。进了Linux系统,又发现昨天在Windows里下载的文件没拷贝出来。来回一次,十分钟进去了,工作流上那一缕灵感早就断了。
第二是磁盘分配的囚徒困境。装双系统之前要专门划一个分区给Linux。划多了Windows不爽,划少了Ubuntu今天装个数据集明天就红了。每次想调整分区大小,心里都发怵,怕损坏引导表,怕GPT分区搞出幺蛾子,怕删错分区连Windows一起带走。
第三是引导和驱动的暗雷。我身边不止一个朋友遇到过这种情况:Windows一更新,Grub菜单没了;或者装完NVIDIA驱动之后,开机直接黑屏。双系统的每个子系统都活得好好的,但只要它们住在一个硬盘上,宿命就是互相踩引导区。
1.2 WSL到底是怎么"省事"的
WSL的解决思路是把Linux整个搬进Windows的进程空间里,而不是让它住在另一块分区上。对用户来说,你打开一个终端窗口,敲wsl,几秒钟就进了Ubuntu的shell;关掉窗口,Linux环境就安静地退居后台,Windows一切照旧。不需要重启,不需要分区,不需要处理引导区。
日常使用里最直观的几个体验:
- 启动速度按秒算,不是按分钟。一个干净的WSL发行版,从输入命令到看到shell提示符,通常两三秒钟。
- 文件不用来回搬运。Windows能直接读Linux里的家目录,Linux也能直接挂载Windows的C盘D盘,两边互拷数据就像操作本地文件夹。
- 同时跑两边的程序。你可以在WSL里跑程序,同时用Windows浏览器访问它启动的网页服务;也可以在Linux环境里直接调用Windows路径下的可执行文件。
对于大多数"需要在Windows日常办公、偶尔用Linux环境"的人来说,WSL就是那个消除切换成本的方案。
1.3 谁适合直接上WSL,谁还得保留双系统
WSL不是万能的,它替代的是"为了用Linux而装双系统"的那批人。我根据自己的使用场景做了个判断表:
| 使用场景 | 双系统 | WSL | 建议 |
|---|---|---|---|
| 日常办公 + 偶尔跑Linux命令 | 成本高 | 非常适合 | 直接用WSL |
| Web后端开发、Python处理脚本 | 可以 | 很合适 | 用WSL 2 |
| 需要完整图形桌面做设计、看视频 | 方便 | WSLg可用但有局限 | 双系统或虚拟机 |
| 需要修改内核模块、做系统级调试 | 必须 | 不完全支持 | 保留双系统 |
| 硬件直通实验、跑物理机服务 | 必须 | 不适合 | 保留双系统 |
简单说:如果你的Linux用途是"在终端里跑程序、装开发环境、写服务端代码",WSL完整体验足够。如果你要用图形桌面搞重度视觉设计,或者需要操作物理硬件接口,那还是继续用双系统或者虚拟机吧。
2. 安装前必须看懂的版本差异:WSL 1 和 WSL 2 到底差在哪
2.1 两种架构,两种性格
很多新手不知道WSL其实有两个大版本,而且两者的运行原理完全不同。
WSL 1走的是系统调用翻译层路线。它不跑真正的Linux内核,而是靠Windows内核专门实现的转换层,把Linux程序发出的系统调用翻译成Windows能执行的调用。好处是开销极低、启动飞快,而且因为是直接读写Windows文件系统,跨盘文件操作速度非常猛。坏处是有些依赖深度内核机制的程序跑不了,比如Docker里的Linux容器、FUSE文件系统、systemd这类,兼容性有明显天花板。
WSL 2则走的是轻量虚拟机路线。微软在Hyper-V虚拟机技术之上,塞进了一个完整的Linux内核。所以WSL 2里的环境是"真正的Linux内核在运行",几乎所有Linux应用都能装能跑,包括Docker、systemd、各种需要内核模块的工具。对应的代价是,它需要虚拟化技术支持,物理机上必须开启CPU虚拟化,而且某些对磁盘IO敏感的场景会明显感觉比WSL 1慢一点。
两者的直观对比:
| 对比项 | WSL 1 | WSL 2 |
|---|---|---|
| 架构 | 系统调用翻译 | 轻量虚拟机 + 完整Linux内核 |
| 启动速度 | 更快 | 很快,但首次启动略慢 |
| 跨盘文件IO | 优秀 | 一般,访问/mnt/c(Windows盘)较慢 |
| 内核兼容性 | 较差 | 完整Linux内核,兼容性好 |
| Docker支持 | 不支持原生容器 | 支持 |
| systemd支持 | 需要特殊处理 | 原生支持《新版》 |
| 硬件资源占用 | 极低 | 按需分配内存/CPU |
2.2 为什么我现在只推荐WSL 2
早几年WSL 1还有存在价值,因为它的文件跨盘性能确实好。但时代变了,WSL 2可以用一个简单的配置开启"镜像网络"、支持systemd,还能把磁盘挂载(比如把Linux自身的ext4虚拟磁盘直接挂载到Windows上用),功能完整度已经完全拉开差距。我在实际迁移中装了系统,碰到的大部分"兼容性问题"其实都出在WSL 1上,换到WSL 2就好了。
现在微软官方也在默认推送WSL 2,wsl --install默认装的就是它。所以建议你不需要纠结,直接以WSL 2为目标来配置即可。
2.3 安装WSL 2前要确认的硬件与系统条件
在动手之前,先花两分钟检查三样东西:
-
Windows版本。通常Windows 10博物馆版(2004及以上)和Windows 11都可以完整支持WSL 2。如果你的系统比较老,建议先升级系统补丁,否则很多新命令会执行失败。
-
CPU虚拟化。WSL 2依赖虚拟化技术,Intel要开VT-x,AMD要开AMD-V。一般在BIOS里能找到入口,名字可能是"Intel Virtualization Technology"或者"SVM Mode"。检查方式是打开任务管理器,看"性能"页的CPU信息里有没有"虚拟化:已启用"字样。如果显示未启用,就得重启进BIOS打开。
-
内存预留心理准备。WSL 2是轻量虚拟机,默认情况下最多可以拿走物理内存的50%甚至更多。8GB内存的机器跑大型编译时可能紧张,建议在
.wslconfig里手动限制内存。
如果你这三件事都确认了,那安装过程会非常顺利,踩坑概率能降一大半。
3. 手把手安装:一条命令装好,还是分步操作更稳?
3.1 最快安装路径:一条wsl命令搞定
Windows 10 2004以上版本,最简单的方法轮不到手动开功能面板,直接打开一个PowerShell或者CMD窗口(建议以管理员身份),输入:
这条命令会自动帮你完成四件事:启用"适用于Linux的Windows子系统"和"虚拟机平台"两个Windows功能、下载并安装WSL内核、设置WSL 2为默认版本、安装最新的Ubuntu发行版。
命令跑完会提示重启系统。重启后,系统会自动进入Ubuntu初始配置界面,要求你创建UNIX用户名和密码。这一步相当于Linux安装时设置root和管理用户的环节。
用这条命令的好处是我完全推荐新手优先尝试。它在多数新电脑上的成功率很高,而且省去了手动开功能的步骤。
3.2 分步安装的完整流程(适合装失败的情况)
如果你的环境比较旧,或者wsl --install命令执行后卡住/报错,那就改用分步操作,每一步都可控。
第一步,启用必要的Windows功能。在“控制面板 - 程序 - 启用或关闭Windows功能”里,勾选这两项:
- 适用于Linux的Windows子系统
- 虚拟机平台
如果没有“虚拟机平台”这一项,说明Windows版本过旧,先把系统升级到2004以上再说。
勾完点确定,系统会要求重启。重启后再打开PowerShell,执行:
如果提示不支持,一般是因为没安装WSL 2内核。去微软官网下载并安装“WSL 2 Linux内核更新包”,装好再执行一次上面的命令。
第二步,安装发行版。可以用命令安装:
也可以去Microsoft Store,搜索Ubuntu,选一个喜欢的版本直接装。我喜欢命令行安装,因为版本控制更精确。目前常用的发行版有Ubuntu、Debian、Kali Linux、openSUSE等,前两个最适合日常使用。
3.3 首次启动:写进历史的配置环节
发行版装好后,第一次启动会要求创建Linux账号。这里有一个新手常踩的坑:它要的不是root,而是一个普通用户。用户名随便起,密码要记住,因为后面几乎所有sudo操作都需要它。
我第一次时因为急着用,随手起了个“test”,结果后面所有环境指针都带着这个路径。如果你想长期使用,建议一开始就把用户名起成自己常用的英文名,省得以后改路径。
进去之后,别急着装工具,先做两件事:
第一,更新软件源。国内用户直接访问Ubuntu官方源多数时候很慢,可以换成阿里云或者清华的镜像源。以Ubuntu 22.04为例:
第二,确认WSL版本。在Windows终端里执行:
看到VERSION那一列是2,就说明你跑的是WSL 2,可以继续后面的进阶内容。
3.4 安装现场最常见的三个报错
这三个报错在热搜词里高频出现,我几乎每次给同事装都至少碰到一个。
第一个是0x800701bc,原因通常是没装WSL 2内核更新包。Windows商店版本有时提示很隐蔽,解决方案就是去微软官网手动下载安装那个内核更新包,然后重启终端。
第二个是wsl/installdistro/service/registerdistro/createvm/hcs/error_file_n,这个错误通常在HCS(Host Compute Service)服务起不来的时候冒出来。常见原因有三个:Hyper-V相关Windows功能没开全、Docker和WSL抢占Hyper-V资源、系统组件损坏。排查思路是先以管理员身份运行PowerShell,依次执行:
然后重启。如果还报错,就在“服务”里手动重启“Hyper-V Host Compute Service”和“Windows Management Instrumentation”,再重试。
第三个是执行wsl --install -d时报“无法解析服务器的名称或地址”,说明当前网络无法访问微软发行版的下载源。这种时候除了稍后重试,更稳妥的方法是直接去Microsoft Store下载Linux发行版本体,或者手动把发行版安装包导入到WSL里。Store路径在多数内网环境也挺稳的,我最常推荐这个备选方案。
把这三个坎过掉,你的WSL环境就真正立起来了,后面就是日常使用和优化的事了。
4. 装完不是结束:文件互访、多发行版管理与日常维护
4.1 文件互访:Windows和Linux之间再也不用U盘
WSL最让人上头的点就是文件系统互通。
在Windows资源管理器地址栏输入\\wsl$\,回车,就能看到所有已安装的Linux发行版。点进Ubuntu,里面的目录结构就是Linux家目录。这样你在Windows侧就能直接用鼠标拖拽、复制、打开Linux环境里的文件,比如把Windows里的数据集直接拖进WSL的某个目录,然后去终端里接着跑脚本。
反过来,Linux侧访问Windows盘符也很直接。在WSL终端里输入:
就能看到C盘的内容,/mnt/d是D盘。第一次用的时候别惊讶,这就是WSL 2默认的跨系统路径映射方式。
不过要记住一个性能法则:尽量把项目代码放在Linux文件系统内部,也就是/home/用户名下面,别放在/mnt/c上跑。 WSL 2的跨盘IO是有性能损耗的,大规模项目在Windows盘上跑,编译和依赖安装会慢上不少。我一开始贪方便,把整个Python项目放在D盘,跑Flask调试都卡卡的,挪到/home之后立刻顺畅了。
4.2 多发行版管理:一个Windows里住好几个Linux
很多人不知道WSL可以同时装多个发行版,而且可以随时切换。
查看当前装了哪些发行版:
设置默认发行版:
直接进入指定发行版:
说一个我的真实用法:我在Windows上同时装了Ubuntu 22.04和Debian 13。Ubuntu做主开发环境,Debian专门用来跑一些跨发行版兼容性测试。两者相互独立,互不干扰。有些文章和脚本是在不同发行版里写的,跑起来环境也不会因为装了一堆库而打架。
仓储空间方面,每个发行版是一个单独的虚拟磁盘文件,在Windows里默认为%LOCALAPPDATA%\Packages\...\LocalState\ext4.vhdx。如果以后磁盘告急,可以执行wsl --shutdown后用diskpart或者Optimize-VHD去压缩,我这套流程后面踩坑部分会细说。
4.3 日常维护三件事:关机、内存限制、备份
wsl --shutdown是关闭所有WSL实例的快速办法,类似“虚拟机关机”。跑了不少后台进程、想一键释放资源时,我一般直接用这个命令。
内存限制是一个很现实的优化项。WSL 2默认对内存的使用没有上限,久而久之会不断占用物理内存。解决办法是在用户目录下建一个.wslconfig文件,内容大概这样:
配置完执行wsl --shutdown再重新进入,配置才会生效。我自己的机器16GB内存,限制6GB给WSL、4GB交换分区,Windows侧永远有富余。
备份发行版也很简单,用一条命令导出成tar包:
以后重新导入:
这比双系统迁移任何数据都方便。以前双系统换盘、重装系统,数据得拿移动硬盘先倒腾一遍,现在最多一条命令的事。
4.4 把Windows Terminal调成顺手的样子
如果你还在用老旧的cmd窗口敲WSL,建议换Windows Terminal,从Microsoft Store可以免费安装。它天生支持多标签页、支持自定义配色,还能探测到WSL发行版并自动创建配置文件。
我的体验是,在Windows Terminal里新建标签页时,下拉菜单里会直接列出Ubuntu、Debian等Profile,点一下就是一个新终端。这种感觉就像MacOS里的iTerm2,窗口、字体、背景都能统一调,工作体验立刻上了一个档次。
平时开发时我习惯开三个标签页:一个跑编辑器或服务,一个跑日志,一个留着敲命令。三屏同时工作,再也不用在多个窗口之间来回跳了。
5. 开发者向的进阶配置:GUI应用、Docker、CUDA与常用工具链
5.1 在WSL里直接跑图形界面程序
别以为WSL只能跑终端。新版WSL(Win10 21H2以上)自带WSLg,可以在Windows桌面直接渲染Linux侧启动的图形程序。
比如在WSL里安装一个图形界面的文件管理器:
它会在Windows桌面上弹出一个真正的GNOME文件管理器窗口,操作跟本机应用没区别。对于需要在Linux里看图片、操作GUI软件的人来说,WSLg解决了一大半问题。我甚至用WSLg跑过几次简单的图像标注工具和GUI版数据库管理工具,基本流畅。
当然,如果你要跑中型3D渲染或重度视觉软件,WSLg的性能还是和原生Linux图形桌面有差距。那就是双系统的领域了。
5.2 VSCode + WSL的开发工作流
这是整个WSL生态里最值得安利的组合。
在Windows侧装好VSCode,然后在WSL里进入项目目录,执行:
VSCode会自动检测到当前环境是WSL,装上一个名为“WSL”的远程插件(首次使用会提示自动安装),然后整个编辑器就会以WSL为“宿主”运行。这意味着:
- 终端直接走WSL shell,用Linux环境的Python、node、git。
- 文件树直接映射到Linux目录,不用纠结路径。
- 插件、代码提示、调试器全部跑在Linux侧,能完整感知Linux依赖。
我自己的主力开发就是这套流程。过去在双系统里,要么用Windows版VSCode打开Linux分区文件,权限和路径别扭;要么为了追求Linux原生环境专门重启到Ubuntu。现在不用了,Windows侧还能同时开着浏览器、微信、Office,旁边挂着WSL终端跑后端服务,一个桌面搞定所有事。
5.3 Docker Desktop 与 WSL 2 的配合
WSL 2之所以在开发圈火,有一半功劳要算给Docker。Docker Desktop官方支持把后端引擎建立在WSL 2之上,你在Windows侧装好Docker Desktop,启用"Use the WSL 2 based engine",Docker就会跑在WSL 2的Linux内核里,而不是Windows的Hyper-V里。
这样做的好处是镜像和容器都住在Linux文件系统里,性能和Linux主机上几乎一致。而Windows侧会有一个Docker CLI联动,你在Windows PowerShell或者WSL终端里敲docker ps都能看到同一个后端。
我用这套方案跑过MySQL、Redis、Nginx、PostgreSQL,也跑过几个前后端联调项目,稳定的很。以前在双系统里为了起数据库还要切到Linux,现在直接在WSL终端一条docker-compose up -d就完事。
5.4 在WSL 2里用GPU跑深度学习
如果你是做深度学习或跑PyTorch的,WSL 2有个杀手级功能:GPU直通。
配套的软件大体是三个层次:首先确保Windows侧显卡驱动是最新的,其次在WSL 2里安装CUDA工具包(现在的主流做法是去NVIDIA官网下载WSL版本的CUDA安装包,或者直接用wsl安装cuda的官方脚本流程),最后在Python环境里装PyTorch时选择CUDA版本对应的命令。
跑起来之后,在WSL里执行nvidia-smi能看到显卡,PyTorch里torch.cuda.is_available()返回True。我拿一块消费级显卡在WSL里跑过小规模训练和推理,性能与原生Linux基本没有肉眼可见的差别。这对"Windows日常办公 + Linux跑深度学习"的人来说,简直是救命方案,再也不需要为了训练模型每天开关机切换系统了。
需要注意一点:显存占用和Windows侧共享,别把Windows桌面特效拉满的同时还在WSL里跑全显存训练,不然两边都卡。亲测教训。
5.5 高频工具场景:binwalk、NAS挂载、端口管理
开发工作之外,WSL还能接管很多运维和工具类的活儿,我挑两个高频的场景说说。
binwalk是固件分析神器,在Linux里配合sudo apt install binwalk就能用。因为WSL 2是完整内核,binwalk对固件镜像的拆包、文件系统提取和双系统时表现一样。遇到过朋友问Windows下怎么跑binwalk,我都会让他们装个WSL,比折腾虚拟机轻太多。
NAS挂载方面,WSL 2可以直接把NFS或者SMB共享挂载进来,和双系统下的操作一致。比如:
这样在WSL里就能直接处理NAS上的数据,省得下载到本地再传,效率高很多。
端口管理也是高频需求。Windows侧关闭端口号,用管理员权限的PowerShell:
WSL侧也有自己的端口管理,一般来说Windows防火墙不会主动拦截WSL的监听端口。但如果你跑的服务局域网访不到,优先去Windows防火墙里放行对应端口,这个坑我踩过,当年折腾半天WSL配置,最后发现是防火墙没放行。
6. 放弃双系统之后的一个半月:迁移复盘与踩坑记录
6.1 迁移得很顺利的东西
数据资产迁移是最轻松的部分。我的Linux家目录整个打包成tar,在WSL里解压一遍,配置文件和脚本就都回去了。Python环境用pip freeze > requirements.txt导出依赖清单,在新环境里重新安装,比想象中省事。Git仓库本来就同步在远端,们把本地配置重新生成一下就能继续推代码。
日常学习类的Linux探索也没压力。我要求自己每天至少敲几个Linux常用命令,WSL让这件事变成"点开终端就顺手练一下",频率反而比双系统时期高了不少。快捷键、管道、日志查看、进程管理这些常用的东西,在WSL里练两次就成了肌肉记忆。
6.2 踩坑复盘:DNS异常、端口冲突、磁盘膨胀
迁移过程不是一路绿灯,有四个坑让我印象很深,写成清单给你:
| 问题 | 现象 | 解决方式 |
|---|---|---|
| DNS解析异常 | apt update超时,curl域名失败 | 检查/etc/resolv.conf,如果被Windows自动覆盖导致异常,可以在.wslconfig开启networkingMode=mirrored,或者手动配置DNS后再用wsl --shutdown重启 |
| 端口冲突 | WSL里的服务端口和Windows程序冲突 | 改端口或关闭Windows侧占用;用netstat -ano确认占用进程后taskkill |
| 磁盘膨胀 | ext4.vhdx文件越来越大,清完文件也不缩 | wsl --shutdown后,下载diskpart工具或者用Hyper-V的Optimize-VHD压缩虚拟磁盘 |
| CPU占用100% | 某些HCS后台进程开机后持续高占用 | 多半是WSL实例开机自启跑着后台进程,用wsl --shutdown终止;如果不需要开机启动,少设init进程 |
第四个磁盘膨胀的事我要多提一句。WSL分配给我的虚拟磁盘文件一度涨到60GB,明明里面只用了10GB。原因就是WSL自动扩容的虚拟磁盘不会自动缩回来。我最后用diskpart选择了compact vdisk,压缩花了些时间,但确实释放了40多GB的空间。心疼这块空间的兄弟建议每个月检查一次。
6.3 我为什么还是留了一台物理Linux机
有一说一,WSL 2已经覆盖了我80%的Linux需求,但我最终没有把那台旧电脑上的原生Ubuntu彻底删掉。原因是它的桌面环境跑视频渲染、3D建模和部分硬件调试项目时,确实比WSL流畅;这两个场景需要完整的图形栈和内核模块,WSLg在重度图形应用上还有距离。
所以我的最终方案是这样的:日常100%在Windows + WSL环境里干活,那台物理Linux机只在跑特定重度图形任务时插电开机,其余时间吃灰。这样把切换成本控制在"我想用的时候再去用"的范畴,而不是"必须用的时候被迫切系统"。
从个人实际体验来说,WSL最打动我的不是技术指标,而是它让"用Linux"变成了一件完全没有心理负担的小事。以前双系统里每次切换都暗示着自己"今天要换一种生活模式",现在窗口一开就能在两种生态之间无缝游走。如果你也被双系统的切换和分区问题烦过,那就照着我上面的流程装一套WSL试试,大概率你会和我一样,越用越回不去了。