首页 / 资讯中心 / 文章详情

从VMware换到WSL2:Linux开发环境迁移对比、配置与避坑指南

从VMware换到WSL2:Linux开发环境迁移对比、配置与避坑指南 ★ FEATURED ARTICLE
最近我把用了好几年的 VMware Workstation 虚拟机删了日常的 Linux 开发工作全换到了 WSL2 上。如果你还在 Windows 上开着虚拟机跑 Linux只是因为习惯了这套操作那我建议你先别急着卸载花十分钟看完这篇。我是从“VMware 里装一个 Ubuntu、然后每天点启动”那会儿过来的换到 WSL2 之后最大的感受就是原来在 Windows 上跑 Linux 也可以这么轻、这么快。先把话放前头WSL2 不是万能的内核调试、复杂网络拓扑、多虚拟机并发管理这些场景VMware 依然更合适。但如果你和我一样主要工作是 Web 开发、写脚本、跑 Docker、折腾命令行工具链那 WSL2 的体验和性价比已经远远超出 VMware 了。这篇文章我会把 WSL2 和 VMware 对比的底层原因讲清楚再给出一套可以直接照抄的安装配置流程最后把我踩过的坑和排查方法整理成速查表。不管你是刚接触 WSL2 的新手还是已经在用了但想优化体验这篇应该都能给你省下不少时间。1. 为什么我把VMware换成了WSL21.1 VMware用了几年越用越难受先说下我用 VMware 的场景Windows 11 宿主机VMware Workstation 里放一个 Ubuntu Server然后在 Ubuntu 里跑 Node.js、Python、MySQL、Redis偶尔跑一点 Docker 容器。听起来挺常规但实际用起来槽点一个接一个。首先是启动速度。点开虚拟机到系统真正能干活快则二三十秒慢则一分钟起步中间还得等 GRUB、等 systemd、等 Docker 起来。每天开机第一件事就是等虚拟机久了真的很消耗耐心。其次是内存压力。我给虚拟机分了 4GB但宿主机的 Chrome、IDEA、PowerShell、Docker Desktop 本身也要吃内存16GB 的机器瞬间见底。调低虚拟机内存吧Linux 里的编译和 Docker 又开始卡调高吧Windows 这边先叫苦。再就是磁盘膨胀。虚拟磁盘文件越用越大我记得明明只装了 20GB 的东西vmdk 文件愣是涨到 40 多 GB。说好的动态扩容回收起来特别麻烦。快照更是这样每个快照动辄几个 GB磁盘空间经常告急。还有一个让人崩溃的点交互体验。剪贴板共享经常失灵拖拽文件时好时坏vmtools 在系统更新后时不时抽风。Windows 和 Linux 之间复制文件还得绕道共享文件夹路径一深就很不顺手。当然 VMware 本身功能是强大的我只是想说如果只是“跑一个 Linux 来做开发”VMware 给我的感觉就八个字笨重、昂贵、慢半拍。1.2 WSL2补上的几个大窟窿换到 WSL2 之后上面这些问题几乎每个都有了答案。启动时间从“按分钟算”变成了“按秒算”。打开终端输入wsl基本在 1~2 秒内就能进入 shell。如果你用 Windows Terminal 配置了默认启动 WSL那种感觉就像是打开了一个本地命令行完全不需要等“系统启动”。内存不再被固定分配。WSL2 使用的内存是按需增长、闲置时可回落到几百 MB。虽然它有个“只涨不跌”的毛病后面会讲怎么治但整体上比 VMware 固定吃 4GB 要好很多。磁盘占用是动态的虚拟磁盘 VHDX 文件默认位于用户目录下用多少扩多少卸载发行版时还能干净回收。相比之下 VMware 的 vmdk 文件想要瘦身还得折腾工具麻烦太多。更关键的其实是集成度。WSL2 是 Windows 的“第一方公民”文件资源管理器里直接输入\\wsl$就能浏览 Linux 目录VSCode 装了 Remote-WSL 插件后一键就能把 Windows 里的项目在 WSL 环境里打开PowerShell 里可以直接执行wsl ls -al反过来 Linux 里也能执行 Windows 的 exe。这种感觉跟两个系统之间隔着一层虚拟化界面的 VMware 完全不一样。1.3 先说清楚WSL2不是让VMware退休的唯一答案写这篇文章不是要劝你把 VMware 彻底扔了。说实话WSL2 在某些场景下还真的替代不了 VMware。比如你要给 Linux 内核打补丁、写内核模块、自己编译内核WSL2 默认内核是微软定制的虽然允许加载自定义内核但折腾成本明显高于 VMware。再比如想在一台机器上同时跑三台虚拟机组成一个小集群做实验VMware 的网络拓扑、快照回滚、并发管理要比 WSL2 顺手太多。另外 WSL2 的 GUI 只是“把单个 Linux 窗口放到 Windows 桌面上”不是完整的桌面环境你要是想在 Linux 里调桌面主题、跑完整 GNOME 会话WSLg 目前还是差着意思。所以实际姿态应该是日常开发优先 WSL2特殊场景保留 VMware。这篇文章讲的“替代”主要针对的是 Web 开发、服务端开发、脚本编写、Docker 容器、AI 训练前的小规模验证这类高频需求。在这些场景里WSL2 不光够用而且比 VMware 舒服很多。2. WSL2的底层原理搞懂它才好排坑2.1 WSL1和WSL2相差一个大版本很多人只知道 WSL 是“Windows 上跑 Linux”不知道它内部经历过一次彻底的重构。WSL1 和 WSL2 虽然名字差不多但实现方案完全不同WSL1 是“系统调用翻译层”翻译层把 Linux 的系统调用翻译成 Windows 的系统调用开销低但兼容性差很多程序尤其依赖内核特性的跑不了。WSL2 则是一个“轻量级虚拟机”运行在真实的 Linux 内核之上兼容性一下子提升到了“几乎就是真 Linux”的程度。你可以把 WSL1 理解为找一个翻译在旁边传话翻译水平再高遇到方言还是可能漏信息WSL2 则直接给你一套 Linux 的一室一厅Windows 是房东这套小居室就是虚拟机。虽然本质上还是虚拟化但这套机制比 VMware 轻太多了原因是它复用了 Hyper-V 的底层平台没有完整的硬件模拟没有 BIOS 自检没有传统虚拟机那一堆外设模拟所以启动快、资源省。查看当前发行版是 WSL1 还是 WSL2用这条命令wsl -l -v输出里有个 VERSION 列显示 1 或 2。如果你还跑在 WSL1 上而系统支持 WSL2建议尽早转过去。2.2 vmmem进程为什么会吃内存第一次看到 vmmem 进程的人普遍会慌怎么一个叫“VM 内存”的进程吃了我五六个 GB是不是中毒了其实 vmmem 就是 WSL2 虚拟机的统称。WSL2 的所有内存、CPU、IO 开销都会归在 vmmem 这个进程下面你打开任务管理器看到的 vmmem 内存占用不等于“WSL 实际占用的内存”里面很大一部分是 Linux 的 page cache——也就是 Linux 拿来缓存文件页的“早鸟区”。Linux 的内存哲学是“闲着也是闲着不如多缓存点”所以系统会把空闲内存拿去缓存文件、目录项提升 IO 速度。问题是 WSL2 经常不主动把这些内存还给 Windows导致你在任务管理器里看 vmmem 一路涨Windows 这边越来越紧。想从根源上管住它可以用.wslconfig文件来限制 WSL2 的内存上限这个放在后面的配置章节详细说。紧急情况下想立刻释放内存直接执行wsl --shutdown这条命令会关掉 WSL2 的所有发行版vmmem 内存会掉下来。代价是下次打开 WSL 需要重新初始化几秒钟代价不大但别在手头有正在跑的进程时这么干。2.3 WSLg和systemd两个容易被忽略的“新能力”以前大家嘲笑 WSL 只能命令行现在 WSLg 加入后Linux 的 GUI 程序可以直接显示在 Windows 桌面上。WSLg 的实现方式是微软在 WSL2 里加了一套 GUI 支持组件Linux GUI 应用通过 Wayland/X Server 渲染再通过 RDP 协议回传给 Windows 显示。你不需要装任何第三方 X Server也不用配置 DISPLAY 环境变量直接运行gedit、xterm、nautilus这类带窗口的程序窗口会自己弹出来。这个能力在 Windows 10 较新的版本和 Windows 11 上默认就启用了老版本可能需要手动更新 WSL。另一个容易被忽视的点是 systemd。WSL2 的老版本默认没有 systemd导致systemctl start docker这种命令没法用安装软件还得手动启服务。现在只要你用的是较新版本的 WSL可以通过配置打开 systemd 支持在/etc/wsl.conf里加上[boot] systemdtrue然后在 PowerShell 里执行wsl --shutdown重启 WSL进到 Linux 里跑systemctl --version就能看到 systemd 已经接管进程 1。这一步对想在 WSL 里跑 Docker 守护进程、snap 服务或其他依赖 systemd 的服务的人来说太关键了。3. WSL2完整安装与配置记录3.1 安装前检查三个条件WSL2 安装前我个人建议先确认三件事第一系统版本。Windows 10 2004 及以上、Windows 11 都行。太老的系统虽然可能装得上去但后续 WSLg、systemd 这些功能大概率缺失体验会差很多。检查方式WinR输入winver看版本号。第二虚拟化开关。WSL2 依赖硬件虚拟化需要在 BIOS 里打开 Intel VT-x 或 AMD-V。绝大多数品牌的电脑默认就是开启的但有些办公电脑、老电脑在 BIOS 里被关掉了不开的话安装完成进入 WSL 时会直接报0x80370102错误。检查方式是打开任务管理器性能选项卡看“虚拟化”是否为“已启用”。第三可选功能开关。WSL2 需要“虚拟机平台”这个 Windows 功能。可以直接用管理员 PowerShell 执行dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart如果没有提前开启这个功能后面安装发行版时很容易遇到0x80070003的报错。提醒一句改完系统功能大概率要重启一次。3.2 从零安装并切换WSL2环境确认没问题后最省事的安装方式就是在管理员 PowerShell 里执行wsl --install这条命令会自动完成这几件事启用 WSL 功能、启用虚拟机平台、下载并安装最新版 WSL 内核、安装默认的 Ubuntu 发行版。装完后按提示重启电脑然后跟着向导设置 Linux 用户名和密码即可。如果你当时不是用wsl --install装的而是老方法手动装的 WSL1想切换到 WSL2 版本分两步走第一步把默认版本设为 2wsl --set-default-version 2第二步手动转换已经存在的发行版wsl --set-version 发行版名 2转换过程实质上是把发行版从 WSL1 的文件系统迁移到 WSL2 的虚拟磁盘里根据数据量大小可能要几分钟。转换前建议先备份重要数据因为一旦转到 WSL2 再想转回 WSL1没有回头路。检查转换是否成功还是用wsl -l -v。如果某台机器的默认发行版名是Ubuntu那么以下内容就直接复制用wsl --set-version Ubuntu 2另外多发行版的场景下wsl --set-default Ubuntu可以设置默认发行版打开 WSL 时直接进入这个发行版。3.3 用.wslconfig把资源管起来.wslconfig文件是用来限制 WSL2 全局资源占用的关键配置文件位置在 Windows 用户目录下也就是C:\Users\你的用户名\.wslconfig。如果文件不存在就自己新建一个格式为 INI 风格。我最常用的配置如下[wsl2] memory4GB processors4 swap2GB localhostForwardingtrue解释一下参数memory控制 WSL2 虚拟机能用的最大内存4GB很适合 16GB 内存的日常开发机processors限制虚拟机使用几个 CPU 核心不设的话默认是宿主机全部逻辑核心有时反而会导致 Windows 这边卡顿swap是虚拟机的交换分区大小localhostForwarding保持默认 true 即可它允许你在 Windows 浏览器里通过localhost直接访问 WSL2 里运行的服务。这个配置文件不是改完就立即生效需要先wsl --shutdown再重新进入 WSL。执行完wsl --shutdown之后vmmem 的内存占用会掉下来新配置才会对下次启动生效。有人可能想问那内存上限设多少合适我的经验是宿主机 16GB给 WSL2 分 4~6GB宿主机 32GB分 8GB 左右。留足 Windows 侧浏览器和 IDE 的空间比一味把内存全给 WSL 体验更好。3.4 把VMware里的Ubuntu迁移过来如果你原来在 VMware 里有一套配置好的 Ubuntu 环境现在想迁移到 WSL2我的建议是别想着“把 VMware 磁盘直接转成 WSL2 的 VHD”虽然理论上可行但兼容性问题太多。最稳妥的方式是旧环境新环境并行分模块搬。具体操作分三步第一步在 WSL2 里把基础工具链装齐包括 build-essential、git、curl、vim、python3、nodejs 等按你自己项目需要来装。第二步把配置目录迁移过去比如~/.bashrc、~/.config、~/.ssh直接把 VMware 里的文件复制到 WSL2 对应路径。第三步数据库、Docker 这些服务重新初始化数据用 SQL dump 或 Docker volume 导出再导入。我还有一个小技巧在 VMware 里导出自己常用软件包的清单然后在 WSL2 里批量装。比如 Ubuntu/Debian 系可以这样导出# 在 VMware 里导出已安装软件列表 apt list --installed package-list.txt # 在 WSL2 里批量安装 awk -F/ /^[^#]/{print $1} package-list.txt | xargs sudo apt install -y这个办法虽然不能做到 100% 还原环境但能帮你快速补齐常用工具比手动逐个回想装了什么要高效得多。4. 在WSL2里干这些事和VMware有什么不同4.1 文件放哪里直接决定你跑得快不快刚切换到 WSL2 的人十有八九会踩同一个坑把 Linux 项目放在了/mnt/c/Users/xxx/Projects这种跨文件系统路径下然后发现npm install、git status、composer这些操作慢得离谱。原因在于 WSL2 访问 Windows 分区挂载点/mnt/c时走的是 9P 协议网络文件系统每读取一个文件、每做一次文件状态检查都伴随着跨内核的协议转换。小文件一多速度就直线下降。相比之下Linux 原生 ext4 文件系统走的是高速路径同样操作速度快很多倍。所以我的核心建议只有一句项目文件放 Linux 侧不要放在/mnt/c下面。默认情况下WSL2 会把发行版的文件系统挂载在C:\Users\用户名\AppData\Local\Packages\...这个不显眼的位置而你可以在 Windows 文件资源管理器里通过\\wsl$\Ubuntu\home\用户名直接访问不影响 Windows 工具链配合使用。如果你习惯用 VSCode 打开项目在 WSL2 的终端里进入项目目录然后执行code .VSCode 会自动通过 Remote-WSL 模式把整个窗口项目环境切换到 WSL 侧编辑用的还是 Windows 的图形界面但文件读取、插件运行、终端命令全在 Linux 环境里体验无缝。4.2 Docker和开发容器集成Docker 场景是我换到 WSL2 的最大原因之一。以前在 VMware 里装 Docker 还折腾过现在 WSL2 里跑 Docker 有两条路第一条路是用 Docker Desktop。Docker Desktop 的 WSL2 backend 模式下Docker daemon 直接在 WSL2 里运行不用虚拟机模拟容器网络的映射也简化到“宿主机 localhost 直接可以访问容器端口”。你在 Windows 上执行docker ps和 Linux 上执行的结果一致。适合不想深入了解 Docker 守护进程细节、把精力放在应用本身的人。第二条路是直接在 WSL2 里安装 docker-ce不装 Docker Desktop。WSL2 开启 systemd 之后可以按 Linux 常规方式安装 Docker下载官方安装脚本然后systemctl enable --now docker做完启动服务。这种方式没有额外一层 Docker Desktop 进程资源开销更小也更贴近 Linux 服务器上的真实运行环境。我个人的选择日常快速调试用 Docker Desktop需要复现服务器部署时用 WSL2 里的 docker-ce。两种模式可以共存注意别让两边的 Docker 同时监听同一端口就行。4.3 网络模式从Linux访问Windows、从Windows访问LinuxWSL2 的网络架构默认是 NAT 模式。什么意思就好比 WSL2 藏在路由器后面路由器给 Windows 分配了一个地址给 WSL2 分配了另一个地址。WSL2 能通过这个“路由器”访问互联网Windows 也能通过转发规则访问 WSL2 里的服务。实际使用中两个方向的访问规则不一样。从 WSL2 内访问 Windows 宿主机直接用默认网关 IP 即可在 WSL2 里执行ip route show default能看到那个地址。很多场景下比如 WSL2 里的程序要连 Windows 上开的 MySQL、Redis用的就是这个 IP。从 Windows 访问 WSL2 里的服务默认情况下localhostForwardingtrue开启后Windows 浏览器访问localhost:8080就能到达 WSL2 里监听 8080 端口的服务。这个机制很省心大多数人日常开发不需要额外操作。但如果要让局域网里的其他设备也访问 WSL2 里的服务就得用端口转发。管理员 PowerShell 执行netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress127.0.0.1然后再放行 Windows 防火墙对 8080 端口的入站规则。这个方案把流量从宿主机 8080 转发到 WSL2 的 8080局域网设备只要访问这台 Windows 机器的 IP 就能访问到 WSL2 服务。如果你用的是较新的 Windows 11 版本还可以在.wslconfig里开启 mirrored 网络模式[wsl2] networkingModemirrored这种模式下 WSL2 和 Windows 共享 IP网络行为更像一个本地进程端口访问也更简单。不过它对宿主机的系统版本要求较高老版本 Windows 不支持新手还是优先用 localhost 转发方案更稳。4.4 GUI程序的取舍WSL2 的 GUI 支持分两个层次命令行工具的“界面”和窗口应用的“界面”。如果你只跑终端这个不用操心但如果你需要在 Linux 环境里跑一个图形工具比如某个 Linux 专属的 IDE 或 Qt 程序WSLg 会把窗口送到 Windows 桌面上。实际体验如何单个小窗口程序表现还行跑起来基本流畅缩放、剪切板都能用。但你要是想跑一个完整桌面环境比如 xfce4 或 GNOME 桌面出来的是画面操作感受却不太好窗口闪烁、字体渲染差异、键盘焦点问题都可能出现。所以我的建议很明确WSLg 适合“需要一个小界面”的场景不适合“想要一个 Linux 桌面”的场景。你如果真的很依赖完整 Linux 桌面VMware 或者干脆物理机装 Linux 双系统可能更适合。反过来如果只是看着界面图个方便WSLg 够用了。一个我常用的操作在 WSL 里执行apt install nautilus后直接打开文件管理器以 Linux 的方式操作 WSL 内部的文件系统比在 Windows 资源管理器里走\\wsl$更顺手。5. 常见问题排查与避坑实录5.1 vmmem吃内存怎么压下来症状任务管理器里vmmem进程占了好几个 GBWindows 越来越卡。原因在前文说过大部分是 page cache 没归还但很多人不知道的是WSL2 里跑 Docker 也会让 vmmem 内存快速增长因为容器缓存、镜像层缓存都算在 vmmem 头上。处理优先级如下第一先看 WSL2 里有没有大进程霸占内存htop或free -h看一眼。如果只是缓存先试sudo sysctl -w vm.drop_caches3强制清理 page cache注意在生产环境不要乱用开发机无所谓。第二没效果就用.wslconfig设memory4GB限制上限。这个限制是硬性的WSL 内看到的物理内存就会变成 4GBvmmem 最多也长不到哪去。第三养成用完多个发行版就wsl --shutdown的习惯。我每天下班前会跑一次第二天开机会清爽很多。5.2 项目放在 /mnt/c 之后慢得想砸键盘症状在/mnt/c/Users/...下面执行git status要好几秒node_modules安装要几分钟但在~/code下同样操作快到起飞。原因已经不重复了。解决办法分几档一档是把项目整个复制到 WSL2 的 Linux 文件系统里然后通过 VSCode Remote 打开这是最推荐的。另一档是如果你实在想保留 Windows 侧文件路径可以用 Windows 侧的编译缓存目录迁移把 npm cache 或 composer cache 指到 Linux 侧能缓解但效果有限。第三档是干脆在 Windows 上用\\wsl$路径反向访问 Linux 侧项目让 Windows 工具来处理这些文件不过这更适合“偶尔碰 Linux 文件”的场景。我现在的铁律就一条凡是 git 仓库一律放 Linux 侧。Windows 侧只放文档、图片、下载这些与代码无关的内容。5.3 网络访问连不上、端口不通怎么查症状一Windows 浏览器访问localhost:8080但 WSL2 里明明有服务在监听 8080。常见原因是服务只监听了 WSL 内部的 IPv6 地址检查时优先确认监听地址是否为0.0.0.0或::而不是只有127.0.0.1。然后再确认.wslconfig没有被改成localhostForwardingfalse。症状二WSL2 里访问外网超时但 Windows 正常。常见原因是公司网、校园网的 DNS 设置冲突WSL2 默认会用自动生成的/etc/resolv.conf指向虚拟网卡的 DNS。如果这个 DNS 解析不了可以在 WSL2 里调整编辑/etc/wsl.conf写入以下内容然后重启 WSL[network] generateResolvConf false再手动编辑/etc/resolv.conf写入能用的 DNS 地址比如软件源所在的公共 DNS。注意手动配置后如果 WSL 重置这个文件可能会被重新生成需要在 wsl.conf 里保持generateResolvConffalse才会持久生效。症状三局域网设备访问不到 WSL2 服务。先确认 Windows 防火墙是否放行了对应端口再用前文提过的netsh interface portproxy做转发。另外要记得WSL2 的 IP 地址每次启动都可能变化所以固定 IP 的意义不大反而用端口转发更稳定。5.4 常见报错速查下面这个表是我见过比较多的报错以及对应的处理思路。错误码或现象常见原因解决动作0x80370102BIOS 虚拟化未开启进 BIOS 开启 Intel VT-x/AMD-V0x80070003虚拟机平台功能未启用管理员 PowerShell 执行 dism 开启 VirtualMachinePlatformWslRegisterDistribution failed安装的发行版和服务不匹配执行wsl --update后重装发行版systemctl不存在WSL2 版本过旧更新 WSL 并在/etc/wsl.conf中开启systemdtruevmmem 内存只涨不降page cache/Docker 缓存用.wslconfig限内存或wsl --shutdown释放WSL2 里localhost访问不到 Windows 服务NAT 模式下网关地址变化用ip route show default获取宿主机 IP排查思路上记住一句话大多数 WSL2 问题逃不开三个关键词——系统版本、系统功能开关、发行版版本。先更新到最新 WSL、确保 Windows 功能开关正常、用wsl --update更新内核很多稀奇古怪的问题就自己消失了。6. 到底怎么选给你一个简单的判断标准6.1 WSL2和VMware能力对比把这两个方案放在一起看优势互补其实很明显。我用一张表帮大家直观感受它们的能力边界。对比项WSL2VMware Workstation启动速度1~2 秒20~60 秒内存占用按需增长可设上限固定分配占用明显磁盘占用VHD 动态扩展vmdk 动态扩展但回收麻烦Linux 兼容性内置内核兼容性好完整系统模拟兼容性最好桌面环境WSLg 窗口模式无完整桌面完整图形桌面快照回滚不支持通过导出 VHD 实现快照和克隆非常成熟系统服务新版支持 systemd完整 systemd 启动流程Docker原生级体验虚拟机内 Docker资源开销大文件共享\\wsl$与/mnt/c原生互通需要配置共享文件夹GPU 加速支持 CUDA 等计算加速需要额外配置直通网络拓扑NAT/mirrored 为主桥接、NAT、仅主机灵活可控从表里能看出来WSL2 赢在轻量、集成、日常开发效率VMware 赢在完整虚拟化能力、桌面体验和实验灵活性。6.2 我的选型建议先并行跑两个月如果你还没决定我给你一个保守且稳妥的建议不要一次性删掉 VMware先用两三个月并行。把日常开发迁到 WSL2遇到 WSL2 明显搞不定的场景再回 VMware。这样既不会让自己陷入“想用某个功能但 WSL2 没有”的尴尬又能逐渐积累对比经验。我在并行期结束时日常 90% 的工作都留在 WSL2 了。VMware 仅保留了一个内核实验用的 Ubuntu Server平时几乎不开。这台机器既保留了快照做内核编译测试的循环备份也隔着 Windows 隔离了踩坏系统的风险。最后再分享一个判断小技巧如果你想让 Linux 来做“主操作系统”比如在里头跑大量服务、做内核开发、搭多节点集群那无论 WSL2 多方便都不如一套真正的虚拟机灵活。如果你只是“在 Windows 上顺便用 Linux 写代码、跑脚本、开容器”追求的是流畅和无缝集成那 WSL2 大概率就是最适合你的方案。别再纠结“够不够专业”这类问题了——工具适手才是硬道理。
阅读完成 · 觉得有帮助?
咨询建站