从双系统到WSL2:Windows下搭建高效Linux开发环境全指南
看到"不想安装双系统来回切换",我第一反应就是想起自己当年折腾双系统的惨痛经历。如果你是开发人员,或者工作中经常需要用到Linux环境,但主力电脑又是Windows,那么Windows Subsystem for Linux(简称WSL,Windows上的Linux子系统)这个方案,很可能就是你要找的答案。
这篇文章不打算讲什么高深原理,而是从我真实的使用体验出发,说说为什么我会放弃双系统和传统虚拟机,转而把日常开发完全搬到WSL上。内容会覆盖WSL2和WSL1的区别、完整的安装配置流程、换源、Docker支持、文件互访、常见报错排查,最后再分享几个我自己踩过的坑。不管你之前有没有接触过Linux,只要跟着步骤走,基本都能在半小时内跑起来一个顺手好用的Linux环境。
1. 为什么我最终弃了双系统,投入WSL的怀抱
1.1 双系统的真实体验:切换成本高到你不想动
说实话,双系统本身没什么技术门槛,装个Ubuntu再配个引导,半天时间也能搞定。但真正用起来,问题就来了。
首先是切换成本。我上班的时候,经常Windows开着微信、钉钉、浏览器一堆东西,突然要去Linux那边跑个脚本查个日志。好,保存工作,重启,选择Ubuntu,等它开机,再打开终端找半天路径。跑完脚本,又得重启回Windows。一天这么来回几次,心态直接崩了。说白了,双系统在物理层面把"切换"这件事的成本拉满了。
其次是文件隔离问题。Windows和Linux各自有一套文件系统,虽然Linux能挂载NTFS分区,但中文文件名、软链接、权限这些细节经常会出幺蛾子。我在Windows下载的安装包,放到Linux那边有时候权限要重新设置,有时候符号链接直接失效。而Windows默认又不能读ext4分区,两边数据互通基本靠U盘或网盘中转,效率低到让人抓狂。
还有一个绕不开的坑是引导和驱动的脆弱性。Windows更新偶尔会把引导弄坏,Linux升级内核也可能和GRUB起冲突,更别说有些笔记本的双显卡驱动在Linux下默认用不了,风扇狂转、亮度调不了、合盖睡死之类的毛病,几乎每周都能遇到一次。对于想要稳定干活的人来说,这种不确定性太影响心情了。
1.2 虚拟机的问题:性能开销和文件交换都是坎
双系统不行,那虚拟机总行了吧?我最早也用过VMware Workstation和VirtualBox,体验了一段时间,发现还是不对劲。
虚拟机最大的问题是性能开销。你给虚拟机分4GB内存,Windows这边就少了4GB;CPU资源也是一样,虚拟机里编译一个稍微大点的项目,宿主机风扇就开始起飞。我16GB内存的机器,开着IDE再跑一个虚拟机,明显感觉到卡顿。而且虚拟机的文件交换,虽然可以通过共享文件夹解决,但那个路径映射和权限处理真的够恶心的,有时候Windows改了一个文件,Linux那边缓存不刷新,还得手动sync。
如果真的依赖完整Linux桌面环境,那虚拟机确实是好方案,它隔离性够好,可以随便做快照。但如果你像我一样,平时根本不需要Linux的图形界面,要的只是一个能跑命令、能装开发工具、能跑Docker的干净终端环境,那虚拟机就显得有点大材小用了。更别说GPU加速在虚拟机里基本是残废状态,跑点机器学习相关的推理验证都费劲。
1.3 WSL是什么:官方兼容层的核心逻辑
WSL是微软官方推出的Windows兼容层,全称叫Windows Subsystem for Linux。它分两个大版本:WSL1通过API翻译层把Linux的系统调用直接翻译成Windows系统调用,兼容性受限;WSL2则是跑在轻量级虚拟机里的真正Linux内核,兼容性接近原生。
这里我想把WSL2的原理说得通俗一点。它虽然底层也是虚拟机技术,但和传统虚拟机关键的区别在于集成度。WSL2由Windows系统直接管理,不用你手动分配内存和CPU,启动一个发行版只需毫秒级,内存会根据负载动态申请和释放,Windows文件系统和Linux文件系统之间可以直接互相访问。这种体验就像是在Windows里开了一扇通往Linux世界的大门,而不是养了一只占地方的笼中鸟。
我个人的体会是,WSL2对我这种以命令行为主的开发者来说,和原生Linux的差距已经小到可以忽略。当然,WSL不是万能的,后面我也会说清楚哪些场景它并不合适。
2. 安装前的准备与完整安装流程
2.1 先确认系统版本,别白忙活
安装WSL之前,先看一眼你的Windows版本。Windows 10 2004及以上版本(也就是内部版本号19041以上)和Windows 11都支持一条命令安装,体验非常顺滑。如果版本较老,就需要走手动开启功能的流程。
查看版本的方法很简单:按Win + R,输入winver回车,弹出的窗口里能看到系统版本和内部版本号。如果版本太老,我建议先做一次系统更新,把补丁打齐了再继续,不然装到一半容易遇到各种奇怪的兼容性问题。
还要确认一下架构,现在是x64的环境占绝大多数,ARM版的Windows也能跑WSL,但部分Docker镜像兼容性会有差异,如果你是ARM设备,后面安装软件时遇到莫名其妙的报错,先往架构方向排查一下。
2.2 一条命令安装:wsl --install 到底做了什么
以管理员身份打开PowerShell或Windows Terminal(按Windows键输入"PowerShell",右键选择以管理员身份运行),执行:
这条命令是一个组合动作,它会自动完成以下几件事:启用"适用于Linux的Windows子系统"可选组件、启用"虚拟机平台"可选组件、下载并安装默认的Ubuntu发行版,然后提示你重启电脑。重启后首次打开Ubuntu终端,它会让你设置一个Linux用户名和密码。这个用户名和Windows用户名可以不一样,密码在Linux里输入时不显示字符属于正常现象,别以为键盘坏了。
如果你想指定发行版而不是默认的Ubuntu,先看有哪些可选:
输出会列出一堆支持的发行版,比如Debian、Kali Linux、openSUSE等等。然后指定名字安装:
我个人用得比较多的是Ubuntu,没特殊偏好直接用Ubuntu就行,生态好、教程多、遇到问题能搜到大量解决方案。
2.3 老版本Windows的手动安装流程
如果你的wsl --install命令不存在,说明系统版本偏老,那就走手动流程。打开"控制面板 -> 程序 -> 启用或关闭Windows功能",在列表里勾选"适用于Linux的Windows子系统"。如果要使用WSL2,还要额外勾选"虚拟机平台"。
勾选后点击确定,系统会提示重启,重启完再去Microsoft Store搜索"Ubuntu"等发行版,点击安装。这种方式和老版本配套使用没啥问题,但在最新的Windows上没有必要绕这一步。
2.4 初始设置:默认发行版与版本管理
装好之后,命令行里可以管理和查看所有已安装的发行版。我建议把默认版本设置成WSL2,因为WSL2有完整Linux内核,Docker支持更完善:
这条命令只是设置"以后安装的发行版默认用WSL2",对已安装的发行版,你可以单独检查当前版本:
输出的表格中会显示每个发行版是WSL1还是WSL2。如果某个发行版是1,想升级到2,执行:
这个转换过程会花几分钟,期间不要关机。我在一台旧机器上做转换时不小心断了一次电,结果发行版文件出了点小问题,最后不得不重新导入,所以这个步骤建议在插电状态下进行。
3. 装完之后,这些配置建议立刻做
3.1 换国内镜像源:apt速度立刻起飞
装完一个全新的Linux发行版,第一件事永远是换源。默认的软件源在国外,直接apt install的下载速度可以用惨不忍睹来形容。把软件源换成国内镜像之后,速度会瞬间起飞。
以Ubuntu 24.04为例,先备份源文件,这一步千万别省:
然后编辑源文件,把archive.ubuntu.com替换为清华镜像地址。用sed命令一行搞定:
新版Ubuntu可能用/etc/apt/sources.list.d/ubuntu.sources这个文件,格式略有不同,但思路一样,替换成镜像域名即可。改完先更新索引:
这里想多说一句,换源这件事看似简单,但网上很多教程给的命令直接覆盖整个文件,没做备份,改坏了就麻烦了。我自己就曾经把源文件格式写错,导致apt直接报错无法使用,折腾了半小时才恢复。所以备份源文件这个习惯,真的是血泪教训换来的。
3.2 Windows Terminal:还没有的抓紧装一个
WSL装完之后,如果还在用老的cmd窗口操作Linux,体验会大打折扣。我强烈建议安装微软官方的Windows Terminal。它是一款现代化终端工具,支持多标签页,可以把PowerShell、CMD、WSL的各个发行版全部整合在同一个窗口内,还支持自定义主题、快捷键和字体。
安装方法很简单,打开Microsoft Store搜索"Windows Terminal"点安装即可。装好之后打开,点击标签栏旁边的下拉箭头,会看到你安装的Linux发行版,点一下就能新建一个WSL标签页。这样你就可以在同一个终端窗口里,一会儿用PowerShell查看Windows服务,一会儿切到WSL跑Linux命令,切换效率极高。
Windows Terminal还有一个我很喜欢的功能:粘贴多行命令时会弹窗确认,避免误操作把大块文本直接灌进终端里。这个细节对容易手滑的人非常友好。
3.3 文件互访:Windows和Linux的"任意门"
WSL最惊艳我的功能之一,就是Windows和Linux文件系统的双向互访,基本不用你做任何配置。
在Windows资源管理器的地址栏输入:
回车后,你可以像浏览本地文件一样操作Linux根目录,在Windows里编辑的代码文件保存后,Linux那边立刻就能看到。反过来,在WSL终端里,你的Windows磁盘都挂在/mnt下面,比如C盘是/mnt/c,D盘是/mnt/d。想直接看桌面文件:
这里有个性能问题必须提醒你:跨文件系统的读写速度会比较慢,因为WSL2的跨系统IO需要经过一层转换。不要在Windows目录下直接跑项目构建、不要在大目录里反复grep,否则你会明显感觉到卡顿。正确做法是,项目文件放在Linux目录下(比如/home/你的用户名/projects),需要编辑时用VS Code的WSL插件直接打开,这样IO全程在Linux文件系统内部完成,速度和原生Linux基本没有差别。
3.4 限定WSL2的资源占用:内存不再被吃满
很多人刚用WSL2都会遇到一个问题:明明只开了个终端,内存占用却高得离谱。这是因为WSL2默认会动态占用宿主机相当比例的内存,而且释放时机不算及时。
解决办法是在Windows用户目录下创建一个.wslconfig文件,路径是C:\Users\你的用户名\.wslconfig。文件内容可以这样写:
memory是WSL2最大能占用的内存,processors是最大CPU核心数,swap是交换分区大小。保存文件后,在PowerShell里执行:
然后再重新进入WSL,配置就生效了。实测下来,配置了memory=4GB之后,我的16GB内存机器日常使用明显宽裕了很多,编译大项目时也不会把Windows这边拖垮。
3.5 启用systemd:WSL的服务管理质变
WSL2的早期版本不跑systemd,导致很多人装Docker或者MySQL时还得手动service docker start,非常别扭。好消息是现在WSL2已经默认支持systemd,只是部分旧版本可能需要手动开启。
开启方式是在WSL里编辑/etc/wsl.conf:
然后在PowerShell里执行wsl --shutdown,重新进入WSL。之后systemctl status这类命令就能正常用了。启用systemd之后,安装Docker、SSH、Nginx这些服务都可以用标准的systemctl enable和systemctl start来管理,体验和真正的Linux服务器几乎一致。我当年为了这个功能专门折腾过WSL1和WSL2的切换,现在不用再操这份心了。
4. 日常高频使用场景与实用命令
4.1 在WSL里跑Docker:两种路径都给你说清楚
WSL2对Docker支持完善,这是很多人选择它的核心原因。现在有两条路可以跑Docker,一条是装Windows版Docker Desktop,让它使用WSL2后端,另一条是在WSL内部自己装Docker Engine。
我自己更推荐Windows版Docker Desktop + WSL2后端的方案。Docker Desktop有图形界面,容器管理直观,而且可以和WSL2无缝集成,你在WSL终端里执行docker ps依然能连接到同一个Docker守护进程。缺点是Docker Desktop在商业环境使用需要购买许可证,个人和小团队免费版也够用。
如果你不想装Docker Desktop,直接在WSL里安装Docker Engine也行:
然后启用systemd后,启动Docker服务:
用这种方式,WSL里的Docker和Linux服务器上的Docker没有本质区别。我最近在本地用Docker Compose起了一个PostgreSQL加Redis的环境调试项目,配置文件直接复用生产环境的compose文件,跑起来没有任何落差。
4.2 开发环境搭建:Java、Node、Python三件套
我在WSL里同时维护着Java、Node.js和Python三套开发环境,日常使用完全没问题。
Java这边,先装JDK:
然后装Maven:
Node.js这边,我不建议直接用apt装,系统自带的版本往往比较旧。用nvm来管理版本会更灵活:
安装完成后重新加载shell配置:
然后安装最新的LTS版本:
Python的话,Ubuntu自带的Python环境基本够用,但建议装一下venv和pip:
每次新建Python项目我都用venv隔离依赖,防止全局环境被搞乱。
搭配VS Code的Remote - WSL插件,体验是真的丝滑。在Windows里打开VS Code,装了插件后在WSL终端里执行:
它会自动以WSL环境打开当前目录,编辑器界面在Windows显示,但编译、运行、调试全部走Linux环境。等于你既有Windows的图形体验,又有Linux的命令行生态,两边的好处都占了。
4.3 高频Linux命令:新手的快速上手清单
很多刚接触WSL的朋友不是被安装难住的,而是进了Linux终端后不知道手往哪里放。这里整理几个日常最高频的命令,基本能覆盖80%的使用需求:
pwd:查看当前所在路径。ls -la:列出目录下所有文件,包含隐藏文件和权限信息。cd /home/用户名:切换到指定目录。mkdir -p 目录名:递归创建目录。sudo apt install 软件名:安装软件包。sudo apt remove 软件名:卸载软件。grep -rn "关键词" .:在当前目录递归搜索文件内容。ps aux | grep 进程名:查看指定进程。kill -9 PID:强制结束进程。chmod +x 文件:给脚本添加可执行权限。tar -czvf 备份名.tar.gz 目录:压缩备份目录。df -h:查看磁盘使用情况。free -h:查看内存使用情况。
这些命令单看没什么感觉,但用熟了之后你会慢慢形成肌肉记忆。我的建议是不要死记硬背,每次用到的时候查一下手册,多用几次自然就记住了。
4.4 WSLg:不用装VNC也能跑Linux图形程序
如果你担心WSL没有图形界面,那现在这个顾虑可以放下了。较新版本的WSL2自带WSLg(Windows Subsystem for Linux GUI)支持,Linux图形程序可以直接在Windows桌面上弹窗显示,不需要额外安装X Server。
比如你想在WSL里跑个Visual Studio Code的Linux版本,或者运行一些需要图形界面的Python可视化工具,直接执行命令,窗口就会出现在Windows桌面上。我试过在WSL里跑GTK程序、跑Tkinter的Python小工具,都顺畅弹出窗口,还能使用Windows的剪贴板。
不过说实话,日常开发中我很少用WSLg,因为VS Code和Windows Terminal已经覆盖了我的使用场景。但如果你需要临时跑一个Linux图形软件,WSLg确实省事很多,不用再为了一个GUI去装虚拟机了。
5. 常见问题与排查技巧实录
5.1 安装向导提前结束,报错怎么办
很多朋友安装WSL时会遇到"安装向导提前结束"或类似提示。我在一台旧笔记本上也踩过这个坑,排查思路大致如下。
先确认Windows功能是否全部启用。用管理员身份打开PowerShell,执行:
看返回结果的State是否为Enabled,如果是Disabled,先启用并重启系统。其次检查系统版本,低于Windows 10 2004的版本建议先更新。还有一个常见原因是Windows更新组件损坏,可以在"设置 -> 系统 -> 疑难解答 -> 其他疑难解答"里运行Windows Update疑难解答。如果还不行,可以考虑用DISM工具检查系统映像完整性:
这个方法修复系统文件损坏比较有效,我上次跑了一遍之后再重新执行wsl --install就顺利通过了。
5.2 Windows访问不了WSL里跑的服务
WSL2有个很实用的特性,Windows的浏览器直接访问http://localhost:端口号就能连上WSL里运行的服务。比如你在WSL里跑了一个监听8080端口的Spring Boot项目,Windows浏览器打开http://localhost:8080就能访问。
如果发现访问不了,先确认服务是否真的在监听。在WSL里执行:
如果服务没起来,先排查服务状态。如果服务在监听但Windows还是访问不到,可以检查Windows防火墙是否拦截了WSL子系统的流量,或者在PowerShell里加一条端口转发规则。还有一个容易被忽略的点:WSL2重启后IP会变化,如果你用WSL的具体IP去访问服务,重启之后就失效了,所以尽量用localhost而不是具体IP。
反过来,如果WSL里要访问Windows上跑的MySQL等服务,地址不能用localhost,要填Windows主机的IP。在WSL里执行:
返回的那个IP就是Windows主机在WSL网络中的地址。连接Windows上的MySQL服务,用这个IP加3306端口就行。还需要确认Windows上的服务绑定了所有网卡地址,并且防火墙放行了对应端口。
5.3 磁盘占用越来越大,怎样安全瘦身
WSL2的虚拟磁盘文件(vhd格式)在不用的时候不会自动缩水,你安装一堆软件、拉取Docker镜像之后,它只会越来越大。想给磁盘瘦身,可以按下面的步骤操作。
先关闭WSL:
然后找到虚拟磁盘文件的位置。不同发行版路径不一样,Ubuntu一般在这个目录附近:
打开管理员PowerShell,输入diskpart进入磁盘工具,然后执行:
compact vdisk会压缩虚拟磁盘中未使用的空间,执行完成后重启WSL,你会发现磁盘占用小了一大截。这个方法我在Docker镜像堆积了20多GB之后试过一次,压缩完省了将近10GB,效果非常明显。
5.4 发行版迁移:换盘符或者备份都靠它
如果你C盘空间紧张,想把WSL的发行版整体迁移到D盘或者其他路径,可以用wsl --export和wsl --import组合。
导出:
然后注销当前发行版:
再导入到新路径:
这里有个坑:用import方式导入的发行版,默认用户会变成root,而不是你原来的用户名。解决办法是在WSL里创建一个/etc/wsl.conf文件,添加:
然后wsl --shutdown再重新进入,用户就切回来了。迁移操作本身不复杂,但建议导出之前把重要数据做一份备份,养成习惯总没错。
5.5 WSL版本更新与内核升级
WSL本身也在持续迭代,遇到奇怪的问题,先看看是不是WSL版本太旧。Windows 10和Windows 11可以通过Microsoft Store单独安装"Windows Subsystem for Linux"应用来更新WSL版本,也可以用命令行方式升级:
更新完可以查看版本信息:
我遇到过几次比较诡异的现象,比如WSL2的systemd突然起不来,最后都是通过更新WSL应用解决的。所以如果你遇到文档里找不到答案的怪问题,先怀疑版本,这个排查优先级很高。
5.6 时区不同步:终端时间显示不对
WSL里的时间和Windows显示不一致,绝大多数情况是时区没设置。在WSL里执行:
然后执行date确认时间是否同步。如果时间精确度有问题,可以再执行:
让系统时间从硬件时钟同步过来。时区问题在WSL里很常见,尤其是安装的时候选择的镜像地区和你实际所在地不一致导致的。顺手把时区设置放进初始化脚本里,以后重装系统也不怕忘了。
最后再说点实在话。WSL不是万能的,如果你需要完整的Linux桌面做图形设计、跑GPU深度学习的原生训练、或者调试Linux底层内核驱动,那WSL确实不是最优解,该上物理机或者服务器就得上。但如果你和我一样,主要需求是在Windows环境里跑命令、写代码、搭服务、练运维,那WSL能带给你的便利,真的远超你的预期。我现在的日常就是Windows窗口里开着VS Code,旁边一个WSL终端随时待命,两边文件互通、剪贴板共享、端口直连,这种体验两年前想都不敢想。如果你还在犹豫要不要为了Linux去折腾双系统,我建议你先花半小时把WSL装上试一试,实际操作一次,比看一百篇对比文章都有用。