拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

WSL2安装配置与调优:Windows上Linux开发环境实战

WSL2安装配置与调优:Windows上Linux开发环境实战 1. 先把 WSL 这件事想明白再动手装我第一台正经跑 Linux 的机器是台二手台式机装完双系统之后每次要切回 Windows 都得重启一次等 BIOS 自检、等引导菜单、等系统起来一套流程走完三分钟起步。后来换成虚拟机省了重启但吃内存、吃磁盘笔记本风扇转得跟起飞一样。直到我把日常开发环境整体挪进WSLWindows 和Linux才算真正在一台机器上和平共处了——不用重启不用开虚拟机窗口终端里一条命令就能进UbuntuWindows 侧的文件管理器还能直接翻 Linux 的目录。这篇东西写给三类人看一类是手上只有 Windows、但又必须用 Linux 工具链的开发者一类是刚听说 WSL 这个词、想搞清楚它到底算不算真 Linux的新手还有一类是已经装上了、但总觉得哪里不对劲、想调优和排障的老用户。我会把安装、配置、日常使用、踩坑排查这一整条链路讲清楚包括每一步为什么这么做、不这么做会出什么问题。先给个定调WSL 不是在 Windows 上模拟 Linux也不是给 Windows 加个终端皮肤。它是 Windows 官方提供的一套在 Windows 内核之上运行真实 Linux 内核WSL2的机制Linux 侧跑的是货真价实的子系统apt、systemd、cgroup、Docker 这些该有的都有。理解了这一点后面很多为什么它跟虚拟机不一样的问题就自然通了。1.1 双系统、虚拟机、子系统三条路各自适合谁选技术方案之前先看你要解决什么问题而不是看哪个听起来高级。双系统是最纯粹的方案Linux 独占硬件性能满血适合做内核开发、需要精确控制硬件、或者要跑长时间高强度编译任务的人。代价是切换成本极高两边的文件还得靠共享分区或者 U 盘倒腾日常办公和 Linux 开发混着干的人基本受不了。传统虚拟机VirtualBox、VMware 这类解决的是同时用的问题。Linux 跑在虚拟硬件上Windows 和 Linux 两个窗口并排复制粘贴也方便。但它的资源开销是实打实的一套完整的虚拟化硬件模拟、一块固定大小的虚拟磁盘、一个常驻的后台进程。内存给少了 Linux 卡给多了 Windows 卡中间那个平衡点很难找。WSL 走的是第三条路。它不模拟硬件而是让 Linux 直接跑在 Windows 提供的轻量虚拟化层上或者说更准确一点WSL2 是微软用 Hyper-V 的底层能力搭了一个高度精简、启动极快的虚拟机把 Linux 内核塞了进去然后用一套专门的通信机制把 Windows 和 Linux 两边打通。这么说吧启动一个 WSL 发行版大概一两秒启动一个完整虚拟机得几十秒WSL 的 Linux 进程和 Windows 进程可以直接互相调用你在 Linux 里敲explorer.exe .就能弹出 Windows 的资源管理器这在虚拟机里是做不到的。所以结论很清楚如果你的核心诉求是在 Windows 上顺手用 Linux 工具WSL 基本是最优解如果你要做硬件级别的实验、要跑不依赖宿主机的完整系统环境、或者要模拟多台机器组网那还是老老实实上虚拟机。有一点要提醒WSL 和虚拟机并不冲突可以同时装。我自己机器上就两套都有WSL 管日常虚拟机管那些需要干净完整系统的场景。1.2 WSL1 和 WSL2 到底差在哪别选错了很多人装完发现行为跟教程对不上八成是版本没对齐。WSL1 和 WSL2 的架构差别很大不是简单的版本升级关系。WSL1 的做法是系统调用翻译Windows 内核里实现了一层 Linux 系统调用接口Linux 程序发出来的系统调用被实时翻译成 Windows 的对应操作。好处是启动极快、和 Windows 文件系统结合得极紧密/mnt/c下读写跟本地一样快。坏处也很致命系统调用有几千个不可能翻译完全凡是没实现或者实现得不对的程序就跑不起来或者跑得诡异另外它的文件系统行为是模拟的某些依赖精确权限、inotify、epoll 边角行为的程序容易翻车。WSL2 直接换成了一颗真实的 Linux 内核跑在一个极度精简的虚拟化环境里。系统调用不再需要翻译程序看到的就是标准 Linux 行为Docker、systemd、各类内核特性支持都正常。代价是跨系统文件访问变慢了——WSL2 访问/mnt/c/...要经过一层网络文件协议比访问 Linux 自己分区里的文件慢一个数量级不止。选择建议其实很干脆场景推荐版本原因日常开发、跑 Docker、用 systemdWSL2行为标准兼容性最好项目文件需要频繁跨 Windows/Linux 读写WSL1或改用 WSL2 项目放 Linux 侧减少跨文件系统开销需要跑内核模块、eBPF 等底层工具WSL2WSL1 根本没有真内核机器特别老、不支持虚拟化WSL1WSL2 必须要硬件虚拟化现在新装的话默认就是 WSL2除非你有特殊理由否则不用往回退。如果已经装了 WSL1 想升级在 Windows 侧执行wsl --set-version Ubuntu 2把Ubuntu换成你的发行版名就行转换过程会自动迁移数据几分钟到十几分钟不等取决于数据量。1.3 什么活儿适合塞进 WSL什么活儿别硬塞我见过有人把 WSL 当万能盒什么都往里放最后抱怨它不稳定。其实它的定位很清楚用对了很舒服用错了处处别扭。适合放进 WSL 的各种语言运行时和包管理Node、Python、Go、Rust、构建工具链gcc、cmake、make、服务端中间件Redis、MySQL、Elasticsearch、容器相关的一切、命令行工具集git、curl、jq、ripgrep、数据处理脚本、爬虫、以及任何官方文档只写 Linux 安装方式的软件。这些工具在 Linux 下的安装体验通常一句话搞定在 Windows 下则要下 exe、点下一步、配环境变量麻烦得多。不太适合硬塞的需要长时间独占大内存的大规模编译WSL 的内存上限要自己调默认可能不够、对磁盘 IOPS 有极端要求的数据库压测虚拟磁盘层的开销躲不掉、以及需要和 Windows 桌面深度交互的图形程序虽然现在有 WSLg但复杂 GUI 应用还是有概率出问题。还有个容易被忽略的点项目文件放在哪一侧直接影响你的开发体验。放在 Windows 的D:\code\project然后用 WSL 去访问等于每次读写都要跨一层文件系统边界npm install这种要创建几万个小文件的操作能慢到让你怀疑人生。正确做法是把项目放在 Linux 侧的家目录~/project然后用 VS Code 从 WSL 侧打开。这个细节的价值装机第一周可能感觉不到装机第一个月一定会有体会。2. 安装 WSL一条命令背后发生了多少事先说结论现在的安装流程比几年前简单太多了Windows 10 2004内部版本 19041以上、Windows 11 全系都可以用一条命令搞定。但一条命令不等于什么都不用管知道它在背后做了什么出问题的时候才知道从哪儿查。2.1 装之前必须先确认的三件事第一件Windows 版本。按Win R输入winver回车看内部版本号。低于 19041 的老系统用不了新的wsl --install需要走手动启用可选组件的老路或者干脆先升级系统。这一步很多人跳过然后卡在各种莫名其妙的报错上。第二件硬件虚拟化是否开启。WSL2 依赖它。任务管理器 → 性能 → CPU右下角会显示虚拟化已启用 / 已禁用。如果显示禁用要去 BIOS/UEFI 里打开 Intel VT-x 或 AMD-V 之类的选项。名字各家主板不一样通常在 Advanced 或 CPU Configuration 菜单下。第三件磁盘空间。WSL2 的虚拟磁盘是动态增长的但初始就要占几个 G装完 Ubuntu 加上基础工具链十几个 G 是常态。如果你还要装 Docker 和一堆镜像留 50G 以上的余量比较稳妥。系统盘空间紧张的话可以在安装前先规划好把 WSL 的数据目录迁到其他盘。默认位置在C:\Users\你的用户名\AppData\Local\Packages\下面那个名字很长的 Ubuntu 包目录里。2.2 wsl --install 这条命令具体做了五件事以管理员身份打开 PowerShell 或 Windows 终端执行wsl --install看起来就一行实际上它会依次完成启用适用于 Linux 的 Windows 子系统这个可选功能组件启用虚拟机平台组件WSL2 需要的虚拟化支持从微软服务器下载最新版 WSL 内核并安装把 WSL 的默认版本设置为 2下载并安装默认发行版现在是 Ubuntu组件启用之后通常需要重启一次重启后系统会自动继续后面的步骤弹出一个 Ubuntu 窗口让你设置用户名和密码。这个用户名和密码是 Linux 系统内部的账号跟你的 Windows 账号没有任何关系密码输入时屏幕上不会显示任何字符这是正常的输完回车就行。如果想指定别的发行版先看有哪些可选wsl --list --online然后指定安装wsl --install -d Debian支持的发行版包括 Ubuntu 的多个版本、Debian、Kali、openSUSE、AlmaLinux、Oracle Linux 等。想装哪个看你的使用习惯Ubuntu 的社区资料最多遇到问题最好搜新手建议从它开始。2.3 下载慢、安装卡住几个实际能用的办法wsl --install卡在下载环节是高频问题尤其是发行版镜像和内核包体积都不小。我的处理顺序是这样的先试--web-download参数。这个参数会让安装过程绕过应用商店通道直接从网页下载源拉取绕开了商店客户端本身可能出现的各种抽风wsl --install -d Ubuntu --web-download如果还是慢就换离线思路。应用商店里搜 Ubuntu直接点安装商店的下载通道有时候比命令行还稳。再不行就去官网下载发行版的离线安装包.AppxBundle格式双击装上效果一样。内核更新包也可以单独下载安装。WSL2 的 Linux 内核是一个独立的 MSI 安装包如果wsl --install在下载内核那一步卡死可以手动下载wsl_update_x64.msi安装然后再执行发行版安装命令。还有一种情况是卡在正在安装不动了但其实后台已经装完。这时候直接关掉窗口打开终端敲wsl -l -v如果发行版已经列出来了说明实质完成了不用管那个卡住的进度条。说个反直觉的经验进度条卡住时别急着强制结束进程。WSL 安装过程中有个解压和注册环节强制中断可能导致发行版注册不完整出现列表里有但起不来的尴尬状态。真要中断中断后先wsl --list --all看看有没有残留的半个发行版有就wsl --unregister 发行版名清掉重来。2.4 怎么确认真的装好了三个命令分级验证第一层看列表wsl -l -v输出里应该能看到发行版名称、当前状态Running / Stopped、以及版本号1 或 2。版本号那一列如果显示 1说明你装的是老版本需要wsl --set-version Ubuntu 2转过去。第二层看整体状态wsl --status这个会告诉你默认发行版是哪个、默认版本是几、内核版本是多少。内核版本能显示出来说明 WSL2 的运行环境是完整的。第三层真的进去跑一下wsl uname -a cat /etc/os-releaseuname -a会输出 Linux 内核信息/etc/os-release里能看到发行版名称和版本号。这两个命令都正常返回就说明整个链路是通的。顺手再验证一个跨系统互通的点在 Linux 里执行ls /mnt/c如果能看到 C 盘的文件列表说明挂载机制工作正常。这一步很关键后面所有文件互访都依赖它。3. 装完不调用起来一定难受刚装好的 WSL 是能跑的状态不是好用的状态。默认配置里有几个地方一定会让你皱眉内存吃到一半不还、shell 启动慢半拍、中文显示成方块、时间和 Windows 对不上。下面这些配置我基本每台新机器都会重做一遍。3.1 用户、sudo 和包管理源三件先做的事Ubuntu 装完之后第一件事是更新索引并升级已有包sudo apt update sudo apt upgrade -ysudo会要求输入密码就是你安装时设的那个。第一次输可能会觉得没反应Linux 下输入密码不回显是标准行为。如果你的账号不在 sudo 组里某些手动导入的发行版会出现需要切到 root 修一下。WSL 有个便利的地方默认发行版的 root 可以直接进wsl -u root进去之后usermod -aG sudo 你的用户名再检查一下默认登录用户是不是你设的那个。如果不是可以在/etc/wsl.conf里固定[user] default 你的用户名改完wsl --shutdown重进生效。这个小配置在导入别人打包的发行版时特别有用否则每次进去都是 root时间长了权限会乱。3.2 .wslconfig给 WSL2 这台隐形容器划资源WSL2 本质上是一台轻量虚拟机默认会拿走你一半左右的物理内存作为上限处理器核心数默认全给。这在台式机上没感觉在 16G 内存的笔记本上就很要命——Windows 侧和 WSL 侧的进程抢内存两边都卡。配置文件放在 Windows 用户目录下路径是C:\Users\你的用户名\.wslconfig注意文件名前面那个点用记事本新建时容易漏。内容长这样[wsl2] memory8GB processors4 swap4GB localhostForwardingtrue nestedVirtualizationtrue autoMemoryReclaimgradual sparseVhdtrue逐条说下我的取值逻辑。memory我一般设物理内存的一半16G 的机器给 8G32G 给 16G。给太多 Windows 侧会开始用页面文件整体反而更慢给太少 Linux 编译大项目会 OOM。processors设物理核心数的三分之二左右留几个核给 Windows 侧维持交互流畅不然编译一跑起来整个桌面就卡住了。swap是交换分区默认是内存的 25%如果你经常跑内存吃紧的任务可以给到和内存同等大小但要注意它占的是真实磁盘空间。autoMemoryReclaimgradual是个挺有用的实验性选项它让 WSL 定期把 Linux 侧的缓存内存还给 Windows解决关掉所有程序后 WSL 还占着好几个 G的老问题。sparseVhdtrue让虚拟磁盘支持稀疏模式删除文件后空间有机会自动归还。改完必须执行一次wsl --shutdown才会重新加载配置这个命令会关掉所有发行版记得先保存工作。一个常见误解memory设的是上限不是预分配。WSL 启动时不会立刻吃掉 8G是按需增长的。但增长上去之后老版本不会主动还回来这就是为什么很多人看到明明没跑东西内存却被占了。autoMemoryReclaim和定期wsl --shutdown是两种解法。3.3 wsl.conf控制发行版内部的行为.wslconfig管的是 WSL2 虚拟机整体/etc/wsl.conf管的是发行版内部。两者别搞混。我常用的配置[boot] systemdtrue [automount] enabled true root /mnt/ options metadata,umask22,fmask11 [interop] enabled true appendWindowsPath false [network] generateResolvConf truesystemdtrue是重中之重。新版 WSL 已经支持 systemd开了它之后systemctl才能用服务管理、timedatectl校时、很多需要 init 系统的软件才能正常安装运行。不开的话apt 装某些服务会直接失败报systemd not running之类的错。appendWindowsPath false是个提效选项。默认情况下 WSL 会把 Windows 的 PATH 环境变量追加到 Linux 的 PATH 里好处是你在 Linux 里能直接敲code、explorer.exe。坏处是 Windows 那几十上百个路径每次启动 shell 都要遍历一遍shell 启动明显变慢。如果你不怎么需要互调 Windows 命令关掉它终端响应会快一截。metadata挂载选项解决的是/mnt/c下文件权限问题。默认情况下 Linux 侧看到的 Windows 文件权限是一刀切的chmod完全无效跑 git 或者 ssh 时会报权限过宽的错。加上metadata之后权限位会被记录在扩展属性里chmod 600 ~/.ssh/id_rsa这类操作就能正常生效了。改完同样要wsl --shutdown重进。3.4 两个系统之间怎么互相取文件这块是 WSL 最舒服的地方双向通道都是现成的。Linux 访问 Windows/mnt/c、/mnt/d对应各个盘符。路径里的反斜杠要换成正斜杠C:\Users\me\file.txt在 Linux 里写成/mnt/c/Users/me/file.txt。盘符是小写。Windows 访问 Linux在资源管理器地址栏输入\\wsl$或者\\wsl.localhost能直接看到所有发行版的根目录树。也可以映射成网络驱动器用起来跟本地盘一样。想快速打开当前 Linux 目录对应的 Windows 资源管理器在 Linux 里敲explorer.exe .注意.前面有个空格。这个命令在 Windows 11 和新版 Windows 10 上都能用弹窗会直接定位到当前目录。反向的在 Windows 里想用默认程序打开 Linux 侧的文件也可以用wslview需要装wslu包或者直接用上面那个\\wsl$路径。这里要重复强调一次性能问题跨文件系统的 IO 是有额外开销的。你把 git 仓库放在/mnt/d/code下git status可能要等好几秒放在~/code下瞬间返回。我有次把一个前端项目放在 Windows 盘里用 WSL 跑npm install等了二十分钟挪到 Linux 家目录之后四十秒装完。这个差距不是夸张是文件系统协议层决定的。3.5 中文乱码、时区不对、换行符打架这三个是中文用户的经典困扰逐个说解法。中文乱码Ubuntu 默认不一定装了中文 locale。先装语言包sudo apt update sudo apt install -y locales sudo locale-gen en_US.UTF-8 zh_CN.UTF-8然后设置默认 locale。我建议用en_US.UTF-8作为系统语言因为很多命令行工具的英文输出更好搜、错误信息更准确需要中文显示的时候再单独处理。要改的话sudo update-locale LANGen_US.UTF-8解压出来的中文文件名乱码这是 Windows 下打包的 zip 用了 GBK 编码导致的。unzip本身对编码支持有限可以试试unzip -O CP936 文件名.zip如果你的 unzip 版本不支持-O参数挺常见的改用 7zsudo apt install p7zip-full 7z x -mcp936 文件名.zip已经解压出来一堆乱码文件名想补救的话用convmvsudo apt install convmv convmv -f gbk -t utf8 -r --notest 目录名时区不对开了 systemd 之后用timedatectl最省事sudo timedatectl set-timezone Asia/Shanghai如果每次启动时间都漂移尤其是笔记本休眠唤醒后大概率是硬件时钟同步的问题。WSL 内部的时间和 Windows 是联动的正常不需要手动干预实在不对就wsl --shutdown重启一下。换行符Windows 用 CRLF\r\nLinux 用 LF\n。跨系统编辑文件最容易在这里翻车表现是脚本执行报bad interpreter: /bin/bash^M或者 git diff 里每个文件都显示改动。git 层面处理最有效git config --global core.autocrlf input git config --global core.eol lfautocrlfinput的含义是提交时把 CRLF 转成 LF检出时不转换。对于主要在 Linux 侧开发的情况这个设置最合适。已经污染的文件可以用dos2unix批量处理sudo apt install dos2unix find . -type f -name *.sh -exec dos2unix {} \;4. 把开发环境真正搬进去配置调完只是地基真正的价值在于把日常开发工作流整个搬进 WSL。这部分我按使用频率排序讲。4.1 VS Code 连 WSL这是最该先配好的一环VS Code 有个官方扩展叫 WSL装上之后体验会发生质变。它的原理是在 Linux 侧跑一个轻量服务端Windows 侧的 VS Code 只是界面所有文件读写、终端、调试、语言服务全部在 Linux 侧执行。好处是文件访问没有跨系统开销终端直接是 Linux shell插件尤其是那些依赖本地二进制的语言服务器跑在 Linux 环境里不会水土不服。使用方式很简单打开 VS Code装扩展然后在 WSL 终端里进入项目目录执行code .第一次会提示安装服务端装完窗口左下角会显示 WSL: Ubuntu说明你已经在 Linux 环境里了。之后再打开项目也可以用Ctrl Shift P输入 WSL: Open Folder in WSL 从 Windows 侧选 Linux 路径。有个细节值得提醒用这种方式打开的项目VS Code 内置终端默认就是 Linux shell路径也是 Linux 路径。很多人第一次用会觉得怎么跟我本地的 VS Code 不一样其实这正是要的效果。反过来说如果你从 Windows 侧直接打开\\wsl$\Ubuntu\home\...下的文件夹也能编辑但那是走网络文件协议插件和终端行为都会变得奇怪能不用就不用。4.2 Docker 落地的两种方式各有取舍在 WSL 里用 Docker 有两条路我两条都用过说下差别。方案一Docker Desktop WSL2 后端。装 Windows 版 Docker Desktop在设置里勾选 Use the WSL 2 based engine再在 Resources → WSL Integration 里把你要用的发行版打开。之后在这个发行版的终端里敲docker就能直接用了。优点是省心图形界面、镜像管理、Kubernetes 一键开关都有缺点是 Docker Desktop 本身占资源商业使用还有授权问题。方案二在 WSL 里直接装 Docker Engine。本质上就是在 Ubuntu 里 apt 装 docker-ce跟在一台正常 Ubuntu 服务器上装没区别。前提是/etc/wsl.conf里开了 systemd然后sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo usermod -aG docker $USER最后一句是把当前用户加进 docker 组免去每次敲sudo docker。加完之后要退出重进终端才生效。装完sudo systemctl enable --now docker启动服务docker run hello-world验证。方案二的好处是干净、轻量、和标准 Linux 环境完全一致脚本可以直接搬到服务器上用。代价是没有图形界面得习惯命令行。我个人现在偏向方案二因为环境一致性这件事在排查问题时太重要了。4.3 日常最常敲的那些命令整理成一张表WSL 的管理命令其实就那么些用熟了闭着眼都能敲。列一下我实际高频使用的命令作用使用场景wsl -l -v列出所有发行版及状态检查装了什么、当前版本wsl -d Ubuntu进入指定发行版多发行版环境下切换wsl -u root以 root 身份进入忘了密码、修配置wsl --shutdown关闭所有发行版和虚拟机改配置后、释放内存wsl --terminate Ubuntu只关某一个发行版单个发行版卡死wsl --update更新 WSL 内核报版本过旧时wsl --set-version Ubuntu 2版本转换WSL1 升 WSL2wsl --export Ubuntu D:\bak\ubuntu.tar导出为 tar 包备份、迁移wsl --import MyUbuntu D:\wsl\my D:\bak\ubuntu.tar从 tar 导入恢复、克隆环境wsl --unregister Ubuntu注销发行版彻底删除重装wsl --manage Ubuntu --set-sparse true开启稀疏磁盘回收磁盘空间Linux 侧的常用命令就不展开列了那是另一个话题。但有几个是 WSL 场景下特别值得记住的explorer.exe .打开资源管理器、code .打开 VS Code、clip.exe把内容送进 Windows 剪贴板cat file | clip.exe很实用、powershell.exe在 Linux 里调 Windows 的 PowerShell。4.4 图形界面、GPU、还有那些进阶玩法WSLg 是 Windows 11 上的内置能力让 Linux 图形程序可以直接显示在 Windows 桌面上不需要额外配 X Server。装个x11-apps测试一下sudo apt install -y x11-apps xeyes会弹出一个小眼睛窗口跟着鼠标转。这说明 GUI 通道是通的。实际用途上跑一些轻量图形工具、可视化脚本的输出窗口都没问题但对性能要求高的 3D 应用还是别指望。GPU 这块WSL2 支持直通显卡。Windows 侧装好显卡驱动必须是 Windows 版本的驱动不要往 WSL 里装驱动WSL 里就能通过/dev/dxg访问到。跑 CUDA 的话装 CUDA Toolkit 就行nvidia-smi应该能正确输出显卡信息。做深度学习的朋友用这个方式跑训练性能和原生 Linux 差不了太多。还有wsl --mount可以挂载物理磁盘比如你把一块移动硬盘直接挂到 WSL 里做数据恢复或者取证分析比在 Windows 上用工具方便。做固件分析的 binwalk、做二进制逆向的工具链在 WSL 里跑都很顺。5. 踩坑实录那些报错信息背后的真实原因这部分是我这几年攒下来的排障笔记按报错现象组织遇到对应症状直接翻。5.1 版本过旧和可选组件缺失两类报错别搞混报错 your version of Windows Subsystem for Linux (WSL) is too old. run the command wsl --update 说明 WSL 内核包太老了跟当前系统组件不匹配。解法直接wsl --update如果wsl --update也慢或者失败去官网下载最新的 WSL 安装包现在是一个统一的 MSI手动装。装完wsl --version看版本号正常应该能输出内核版本、WSL 版本、Windows 版本三行信息。报错 此应用程序需要适用于 Linux 的 Windows 子系统可选组件。通过运行 wsl.exe --install 来安装 是另一回事说明那两个可选功能组件压根没启用。用管理员权限的 PowerShell 手动开dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启系统然后wsl --set-default-version 2再去装发行版。这套手动流程在老版本 Windows 10 上是标配现在虽然少了但偶尔还能碰上。这两个报错的区别值得记一下一个是内核太旧一个是组件没开。前者补更新后者补功能方向完全不同别看到报错就一通乱试。5.2 网络不通、端口访问不了先分清是哪种不通WSL2 的网络是 NAT 模式Linux 侧有自己的 IP 地址通过 Windows 侧做端口转发。默认开了localhostForwarding所以在 WSL 里启动一个服务Windows 上用localhost:端口就能访问。这是最常用的场景一般不用额外配置。但有两种情况会出问题。一是局域网内其他机器要访问 WSL 里的服务localhost行不通得拿到 WSL 的 IPip addr show eth0里那个inet后面的地址然后在 Windows 侧加端口转发规则netsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress172.x.x.x再放行防火墙。这个 IP 每次重启 WSL 可能变维护起来挺烦所以我现在更推荐新版本提供的镜像网络模式在.wslconfig里加[wsl2] networkingModemirrored这个模式下 WSL 直接共享 Windows 的网络接口IP 就是本机 IP端口直接可用局域网访问不用折腾转发。对 Windows 11 22H2 以后的版本支持比较好老系统可能不支持。二是 DNS 解析出问题表现是ping通 IP 但域名解析失败。WSL 默认会根据 Windows 的 DNS 配置自动生成/etc/resolv.conf如果这里出问题可以先wsl --shutdown重启试试不行就在/etc/wsl.conf里关掉自动生成手动写一个resolv.conf。这类问题在企业网络环境下更容易碰到。还有一个高频场景在 WSL 里跑 Elasticsearch 或者 Redis 这类服务Windows 侧想连却连不上。先确认服务是不是监听在0.0.0.0而不是127.0.0.1很多中间件默认只监听本地回环这种情况下 Windows 侧怎么都连不上改配置文件里的bind才对。5.3 磁盘越用越大性能越来越差WSL2 的虚拟磁盘是个.vhdx文件只会增长不会自动缩小。你在 Linux 里删了 20G 文件Windows 侧的磁盘占用可能一点没变。这是设计如此不是 bug。处理手法有三种从轻到重最轻的是开启稀疏磁盘新版 WSL 支持wsl --manage Ubuntu --set-sparse true其次是手动压缩。先彻底关掉 WSLwsl --shutdown然后用 diskpart 压缩虚拟磁盘diskpartselect vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit那个包名每个发行版不一样可以在AppData\Local\Packages下找带CanonicalGroupLimited或者对应发行版名字的目录。压缩过程可能几分钟取决于文件大小。最彻底的是导出再导入相当于重建磁盘。wsl --export导出成 tarwsl --unregister注销再wsl --import导入到新位置。好处是可以顺便把数据目录迁到其他盘坏处是所有配置要重新弄。我一般一年做一次。性能这块还有两个提升点值得说。一是项目放在 Linux 文件系统内前面讲过这是最大的一块。二是别在 WSL 里跑对 IOPS 敏感的压测虚拟化层和文件系统协议的开销躲不掉硬要跑出来的数据没有参考价值。这一条其实和 Linux 内存管理里 page cache 的行为也有关WSL2 里的缓存内存不会自动归还给 Windows长时间跑重 IO 任务后Windows 侧会觉得内存被偷袭了定期wsl --shutdown或者开autoMemoryReclaim能缓解。5.4 一份速查表遇到问题先来这里对一遍现象大概率原因处理方式提示 WSL 版本过旧内核包未更新wsl --update提示需要可选组件功能组件未启用dism 启用两个组件后重启安装卡在下载网络到微软源不稳加--web-download或走商店/离线包wsl -l -v有发行版但起不来注册不完整wsl --unregister后重装内存被吃光不释放缓存未回收开autoMemoryReclaim或wsl --shutdown磁盘占用只增不减vhdx 不自缩稀疏模式或 diskpart compact跨系统读写项目极慢项目在/mnt/c下迁到~/家目录文件权限改不动未挂载 metadata/etc/wsl.conf加 mount 选项脚本报^M错误CRLF 换行符dos2unix或配置 git autocrlf中文文件名乱码zip 用 GBK 打包7z x -mcp936或convmvWindows 侧连不上 WSL 服务服务只监听回环改 bind 地址或开镜像网络systemctl命令不存在systemd 未开启/etc/wsl.conf设systemdtrueshell 启动明显变慢PATH 里塞了 Windows 路径设appendWindowsPath false时区显示不对未设时区timedatectl set-timezone Asia/Shanghai这张表我建议存下来WSL 的坑大部分都在这十几个条目里。6. 几个用久了才体会的经验最后聊几个不太好归类、但确实影响体验的点。关于发行版的数量。我建议主力只用一个发行版不要装一堆。有人图新鲜把 Ubuntu、Debian、Kali 全装上结果磁盘被占了一大块升级维护也麻烦。需要 Kali 那种专用工具集的时候用 Docker 拉个镜像跑就行比单独装一个发行版灵活得多用完删掉不留痕。关于离线环境。有些内网机器不能直连外网这时候 WSL 的发行版离线包和内核更新包都得提前准备好。我的做法是提前在一台能上网的机器上把wsl --export导出的 tar 包和内核 MSI 都存进 U 盘到了目标机器上手动启用组件、装内核、wsl --import导入。整套流程走下来十分钟以内比现场等下载靠谱。关于备份节奏。WSL 环境用久了会积累很多个人配置shell 的 rc 文件、ssh 密钥、数据库数据、各种项目的虚拟环境。这些东西丢了要重建很痛苦。我的习惯是每个月wsl --export一次tar 包丢到移动硬盘或者云盘。导出的时候 WSL 会自动关闭目标发行版导出完再wsl进去就行。tar 包可以压缩我一般会gzip一下体积能小一半以上。关于和其他技术路线的取舍。市面上还有把 Windows 应用搬到 Linux 上跑的兼容方案方向刚好反过来也有让 Windows 直接运行安卓应用的子系统方案目标也不一样前一阵官方已经停止支持了。这些和 WSL 不是竞争关系各有各的适用面别混为一谈。真正和 WSL 定位接近的是那些传统虚拟机软件选哪个取决于你对轻量和完整这两个词的偏好。关于学习路径。WSL 本身不难难的是后面那套 Linux 使用习惯包管理、权限模型、服务管理、网络配置、shell 脚本。我见过不少人装完 WSL 就卡在那儿了因为不知道下一步该干嘛。我的建议是找个具体的小目标练手比如把某个服务的本地环境搭起来并让它开机自启做完这一件事systemctl、apt、配置文件、日志排查这些都会碰到比看十篇教程都管用。WSL 最好的地方就在于它降低了试错成本——搞坏了wsl --unregister重来一次几分钟的事不像物理机重装那样伤筋动骨。
返回列表