ARTICLE DETAIL

资讯详情

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

WSL2从安装到开发环境:403、迁移D盘、内存与工具链

WSL2从安装到开发环境:403、迁移D盘、内存与工具链 我到现在还记得第一次在同事机器上敲下wsl --install之后那个转圈的终端——十分钟过去进度条一动不动最后蹦出来一行ERROR: 0x80072ee2。类似的事后来反复上演有人卡在《正在安装: Ubuntu》那一步有人拿到 403有人装完发现 C 盘少了 30 个 G还有人 Docker Desktop 开着开着弹一句 your version of windows subsystem for linux (wsl) is too old。WSL 本身不难难的是它把 Windows 系统组件、虚拟化平台、微软的内容分发、Linux 发行版包管理这几套完全不同的东西缝在一起任何一环出问题表面上的报错都长得差不多。这篇东西我想把 WSL 从能开起来到能当日常开发环境用这条路走一遍。包含咱们最常见的那些坑wsl --install太慢甚至报 403、想把 Ubuntu 从 C 盘挪走、内存被 Vmmem 吃光、怎么在 VSCode 里用它、Docker Desktop 和 CUDA 的边界在哪、PyCharm 和 MATLAB 为什么认不出里面的解释器、binwalk 装出来怎么是老版本。不管你是完全没碰过的 Windows 用户还是已经装了但总觉得别扭的开发者应该都能从这里挑到能直接抄的部分。1. 从一次卡死的 wsl --install 说起这套东西到底解决什么问题1.1 WSL 不是虚拟机也不是双系统很多人第一次听说 WSL会下意识把它理解成Windows 里装了个虚拟机。这个类比有一半对一半会害了你。WSL2 确实跑在轻量级虚拟化之上Hyper-V 的那套底层但它跟你在 VMware 里装一台 Ubuntu 完全是两回事没有 BIOS 自检没有完整的内核启动流程内存是动态借的而不是开机就划走 8 个 G文件系统通过一层专门设计的协议和 Windows 互通进程可以直接互相看到。关键差异在于边界感。虚拟机是一个黑盒子你在里面干什么外面都不知道得靠共享文件夹和端口转发WSL 是一个和 Windows 高度耦合的子系统你的\\wsl$路径能在资源管理器里直接打开WSL 里的 8080 端口在 Windows 浏览器里直接就能访问甚至能在 WSL 里调用explorer.exe打开 Windows 的窗口。我见过不少人装了 VMware 里一台 Ubuntu然后抱怨文件来回拷太麻烦——那其实是他选错了工具。如果你只是想有个 Linux 命令行跑跑脚本、装装依赖、跑跑容器WSL 的体验会好出一个数量级。1.2 WSL1 和 WSL2 到底该选哪个这是个到现在还有人问的问题。简单说结论除了极少数场景都该用 WSL2。WSL1 走的是系统调用翻译路线把 Linux 的系统调用实时翻译成 Windows 的好处是启动快、和 Windows 文件系统同一份、跨系统访问几乎没损耗。坏处也明显兼容性差Docker 跑不了fork这类调用性能惨不忍睹很多需要内核特性的工具直接挂掉。WSL2 换成了真正的 Linux 内核跑在轻量虚拟机里兼容性问题基本消失Docker、systemd、CUDA 这些都能整。代价是跨文件系统的 IO 变慢。这也是很多人吐槽WSL 里跑 npm install 慢得要死的原因——不是 WSL 慢是你的项目放在了/mnt/c/Users/...下面。Linux 侧的文件在虚拟磁盘ext4里Windows 侧的文件要通过 9p 协议转发元数据操作大量小文件的 stat、open、close走这条协议开销巨大。我做过一个粗略的对比同一个前端项目npm install项目位置耗时同一台机器多次取中位数/mnt/c/projects/appWindows 盘约 4 分 30 秒/home/me/projects/appWSL 盘约 45 秒差别接近六倍。所以从第一天起就养成习惯代码放/home只把需要和 Windows 共享的东西放/mnt/c。1.3 哪些人真的需要它哪些人不需要需要做后端和运维、要用 Docker 但主力机是 Windows、要跑各种 Linux 工具链编译工具、嵌入式、安全分析、要学 Linux 但不想折腾双系统的人。不太需要纯 Windows 桌面应用开发、只写写 Office 脚本、对命令行完全不感冒的人。硬装一个最后只会变成一个占着十几 G 的摆设。还有个中间态也不少有人只是想在 Windows 上跑个 Python 脚本结果被劝去装 WSL。这种情况其实装个 Windows 原生 Python 就完了没必要为了跑个requests引入一整套虚拟化。2. 开启功能这一步从零状态到能敲命令2.1 三条安装路径先想清楚走哪条市面上的教程基本就是三种命令行一把梭wsl --installWindows 10 2004 / Windows 11 默认可用自动开组件、下内核、装默认发行版Ubuntu。图形界面手动开控制面板 → 程序和功能 → 启用或关闭 Windows 功能勾选适用于 Linux 的 Windows 子系统和虚拟机平台重启后去商店装发行版。手动下载分发包导入完全绕开在线下载适合网络受限、或者要装特定版本的情况。选哪条取决于你的网络环境和系统版本。如果你的机器能顺畅访问微软的分发服务第一条最省事如果是企业内网、代理环境复杂、或者你已经被 403 折磨过直接走第三条别在第一条上浪费时间。2.2 图形界面开启的完整操作打开控制面板→程序和功能→左侧启用或关闭 Windows 功能会看到一个列表。你需要勾的通常有两项适用于 Linux 的 Windows 子系统虚拟机平台Virtual Machine Platform如果你打算在 WSL 里跑 Docker、或者用 WSL2 而不是 WSL1虚拟机平台是必须的。有些老版本还需要勾Hyper-V但 Windows 11 家庭版没有 Hyper-V也不影响 WSL2 使用——WSL2 用的是 Hyper-V 的一个子集不依赖完整的 Hyper-V 角色。勾完点确定等系统应用更改然后一定要重启。我见过有人在没重启的情况下就急着敲命令然后对着找不到 wsl 命令发呆。组件注册是在重启阶段完成的提前敲命令没有任何意义。重启之后用管理员权限打开 PowerShell跑一句wsl --status如果能看到默认分发版、内核版本、WSL 版本这些信息说明底层通了。如果提示命令不存在回去检查组件是不是真的勾上了。2.3 命令行开启与版本要求对照wsl --install这个命令不是所有 Windows 版本都支持它在 Windows 10 2004 之前是不存在的。这也是很多人复制粘贴到老系统上没反应的原因。Windows 版本wsl --install 支持需要手动开组件备注Windows 10 1909 及更早不支持是只能手动开组件 商店装Windows 10 2004 / 20H2 / 21H1支持一般自动部分版本仍需手动开虚拟机平台Windows 10 21H2 / 22H2支持自动体验比较完整Windows 11 全系支持自动默认 WSL2支持--location等新参数Windows 10 LTSC / 企业长期版视具体版本可能需手动组件包经常被精简化需要单独确认如果你的公司用的是长期服务版LTSC先别急着照网上的教程操作很可能组件是被裁剪过的。可以在 PowerShell 里跑Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux看状态是 Enabled 还是 DisabledDisabled 的话用Enable-WindowsOptionalFeature打开比图形界面更明确。3. wsl --install 太慢、403、超时的完整排查链路3.1 先分清卡在哪个阶段wsl --install这个命令其实内部干了好几件事每件事失败的表现完全不同。搞清楚卡在哪一步能省掉一大半瞎试的时间。卡在正在安装: Ubuntu且进度条不动这一步是在下载发行版的 Appx 包。Windows 的安装器给不出细粒度进度所以你看到的卡住很可能是在慢慢下。报WslRegisterDistribution failed with error: 0x80072ee2网络超时包根本没下下来。报wsl/installdistro/wininet_e_timeout同样是下载阶段的超时几乎可以确定是分发服务连不通。报wsl --update 已禁止(403)这是更新组件拿到的响应被拒绝跟安装发行版是两码事。分清楚之后对症下药。0x80072ee2 和 wininet_e_timeout 属于同一类问题——下不下来403 属于另一类——下是下去了但被拒。3.2 分发版清单拉取失败的表现与应对WSL 在装发行版之前会先去拉一份有哪些发行版可以装的清单。这份清单在微软的内容分发上如果你的网络对这类跨域请求处理得不好这一步就会静默失败然后你在wsl --list --online里看到的是空列表或者报错。可以先跑一句验证wsl --list --online正常情况下会打印一列发行版名称和友好名。如果这里就报错或者空说明问题在清单拉取阶段跟你后面装哪个发行版无关。处理顺序我是这么走的换一个网络环境比如从公司网切到手机热点排除出口设备的干扰。这一步能解决的问题占比最高。清一次 DNS 缓存ipconfig /flushdns然后重试。检查系统时间。时间偏差超过几分钟会导致 TLS 握手失败表现却像是网络问题。w32tm /resync同步一下。尝试走另一条下载路径wsl --update --web-download wsl --install -d Ubuntu --web-download--web-download会绕开应用商店那条链路直接从微软的 Web 渠道取包。我遇到过好几次商店链路抽风、加了--web-download立刻就好了的情况。3.3 离线分发包导入最稳的一条路如果上面几条都试过还是不行别耗了走离线。思路很简单把发行版的 rootfs 包下下来用wsl --import直接导进去全程不依赖 WSL 自己的下载器。微软会发布各个发行版的独立分发包Ubuntu 官方也会在自己的发布页放 WSL 专用的镜像。你要拿到的是一个.tar.gz或者能从.Appx/.AppxBundle里解出来的install.tar.gz。拿到之后# 建一个目录放这个发行版的虚拟磁盘 mkdir D:\wsl\Ubuntu # 导入注意 --version 2 wsl --import Ubuntu D:\wsl\Ubuntu D:\downloads\ubuntu-rootfs.tar.gz --version 2导入完你会看到一个不太对劲的地方——wsl -d Ubuntu进去之后提示符是#不是$用户是 root。这是正常的--import不会帮你建用户也不会配置默认用户。手动配一下# 先以 root 进去 wsl -d Ubuntu -u root # 建个和你 Windows 账号同名的用户名字随你 adduser yourname usermod -aG sudo yourname # 写 /etc/wsl.conf 指定默认用户 cat /etc/wsl.conf EOF [user] defaultyourname [interop] enabledtrue appendWindowsPathtrue EOF然后在 Windows 侧彻底关掉再进wsl --shutdown wsl -d Ubuntu这次的提示符就正常了。这一步的[interop]块很关键appendWindowsPathtrue让你在 WSL 里能直接敲code、explorer.exe这些 Windows 命令enabledtrue是允许互相调用。默认是开的但--import出来的系统如果 wsl.conf 是空的有时候行为不太一样手动写上更踏实。注意wsl --import出来的发行版在wsl --list --verbose里的名字就是你 import 时指定的名字跟微软商店里的Ubuntu是两个独立条目可以共存。共存的时候注意别搞混wsl -d 名字要写全。3.4 wsl --update 报错的几种形态wsl --update报错一般有这几种已禁止(403)请求被拒绝。多数是链路中间有东西在拦或者本地缓存了错误的响应。先试wsl --update --web-download不行就去微软的官方文档页找 WSL2 内核更新包一个.msi手动下载安装。无法解析服务器名称DNS 问题别在 WSL 里折腾这是 Windows 侧的解析问题检查网络适配器的 DNS 设置。更新完之后wsl --version显示还是老版本说明更新装到了另一个位置。商店版 WSL 和 inbox 版 WSL 会打架用wsl --version看版本号再检查应用和功能里是不是装了两个 WSL 条目。如果是 Docker Desktop 报 your version of windows subsystem for linux (wsl) is too old这句的意思很明确——Docker 需要较新的 WSL 内核。它通常还会附带一句 run the command: wsl --update。老老实实去更新就行更新完wsl --shutdown再启动 Docker。4. 把 Ubuntu 挪到 D 盘改安装路径的三种做法与代价4.1 为什么默认装在 C 盘是个隐患默认情况下通过商店或者wsl --install装的发行版虚拟磁盘ext4.vhdx放在%LOCALAPPDATA%\Packages\下面也就是 C 盘。这个文件会随着你装依赖、下代码不断长大。一个重度使用的 Ubuntu50G 到 100G 都很常见。C 盘被吃掉一半之后Windows 更新会失败、临时文件写不进去、各种奇怪的报错开始冒出来。所以装之前就把路径规划好比装完了再迁要省事得多。4.2 export/import 迁移法完整命令这是兼容性最好的方法任何版本的 WSL 都能用。核心是导出一个 tar、注销原发行版、再导入到新位置。# 1. 先关掉所有 WSL 实例避免导出时文件在变 wsl --shutdown # 2. 导出成一个 tar 文件路径自己定注意留够空间 wsl --export Ubuntu D:\wsl-backup\ubuntu.tar # 3. 确认导出文件的大小合理通常几个 G这一步很重要 dir D:\wsl-backup\ubuntu.tar # 4. 注销原来的发行版这一步会删掉 C 盘上的 vhdx wsl --unregister Ubuntu # 5. 导入到新位置 mkdir D:\wsl\Ubuntu wsl --import Ubuntu D:\wsl\Ubuntu D:\wsl-backup\ubuntu.tar --version 2 # 6. 恢复默认用户否则进去是 root ubuntu.exe config --default-user yourname第 6 步是新手最容易漏的。--import不会保留原来在/etc/wsl.conf里配的默认用户信息吗会的wsl.conf 在 tar 里面所以其实[user] default那一行如果之前配过是会被保留的。但如果你从来没配过 wsl.conf、只是靠ubuntu.exe config --default-user设的那这个设置在 import 之后就丢了。稳妥做法是迁移前先确认/etc/wsl.conf里写了[user] default你的用户名这样迁移完就不用额外操心。如果没写进去补上wsl -d Ubuntu -u root echo -e [user]\ndefaultyourname /etc/wsl.conf然后wsl --shutdown重进。ubuntu.exe config --default-user这个命令在不同发行版上名字不一样Ubuntu 是ubuntu.exeUbuntu-22.04 可能是ubuntu2204.exeDebian 是debian.exe。用--import自定义名字导进来的发行版就没有对应的 exe 了只能靠 wsl.conf。4.3 --location 参数与新版本的差异较新的 WSL2.0 以后支持直接在安装时指定位置wsl --install -d Ubuntu --location D:\wsl\Ubuntu这条路干净、省事不用先装再迁。但有两个前提你的 WSL 版本够新以及该发行版支持这个参数。我试过几次在 Windows 11 较新 WSL 上很顺在老一点的环境里会直接报未知参数。所以我的建议是先跑wsl --version看版本。如果输出里有 WSL 版本号不只是内核版本说明是新版的可以试--location如果只输出内核版本那就是老的 inbox 版老老实实走 export/import。4.4 迁移之后容易冒出来的几个问题迁移不是终点后面常见的坑有这么几个权限问题。从 tar 恢复出来的文件权限一般是对的但如果你迁移后把项目从/mnt/d/...拷进/home权限可能会变成 777。用chmod和chown修一下。磁盘空间没释放。wsl --unregister之后C 盘上的ext4.vhdx会被删掉但如果你之前手动调过虚拟磁盘大小可能会留下一个孤立的.vhdx。去%LOCALAPPDATA%\Packages\下面翻一翻看到体积异常大的孤儿文件可以删。名字冲突。如果你没有--unregister就直接--import成同名会失败。要么换个名字要么先注销。启动变慢。放在机械硬盘上的 WSL 虚拟磁盘启动会明显变慢载入内核和文件系统索引的 IO 都是随机读写。如果 D 盘是机械盘而 C 盘是固态迁移前掂量一下——空间换性能值不值看你自己。5. .wslconfig 与内存配置别让 Vmmem 吃掉你的内存5.1 Vmmem 占用高的真实原因打开任务管理器你经常会看到一个叫Vmmem的进程占着好几个 G 的内存不撒手明明 WSL 里什么都没干。这玩意儿就是 WSL2 的虚拟机进程。原因在于 Linux 的内存管理策略。Linux 会尽可能把空闲内存用作文件缓存page cache提升 IO 性能。这些缓存在 Linux 看来是随时可以回收的但虚拟机管理程序不知道它只看到客户机用了这么多就向 Windows 报这么多。于是Vmmem的数字就居高不下。WSL 2.0 之后引入了自动内存回收机制情况好多了但仍然不是实时的。最直接的手动办法wsl --shutdown关掉之后 Vmmem 会消失下次启动重新分配。但这会中断你所有正在跑的东西不适合频繁使用。真正该做的是给它设个上限。5.2 .wslconfig 参数逐条说明这个文件放在 Windows 用户目录下C:\Users\你的用户名\.wslconfig。注意它管的是所有 WSL2 发行版的全局配置跟发行版内部的/etc/wsl.conf不是一回事。一个我常用的配置[wsl2] # 内存上限按机器总内存的 50% 左右给 memory8GB # CPU 核心数上限 processors4 # 交换分区大小 swap4GB # 交换文件位置默认在 C 盘建议挪走 swapFileD:\\wsl\\swap.vhdx # Windows 访问 WSL 服务的端口转发 localhostForwardingtrue # 网络模式mirrored 需要 Windows 11 22H2 和较新 WSL networkingModemirrored # DNS 隧道配合 mirrored 用能解决不少域名解析问题 dnsTunnelingtrue逐条说下我的取值逻辑memory不要给太大。给到机器总内存的 60% 以上Windows 自己会开始换页整体反而更卡。16G 的机器给 8G32G 的给 12-16G是比较舒服的区间。processors同理别把核心数拉满留一两个核心给 Windows。四个物理核心的机器给 2-3八核的给 4-6。swap按 memory 的一半给。太大了没用太小了编译大项目会 OOM。swapFile一定要挪默认在 C 盘。写成D:\\wsl\\swap.vhdx注意是双反斜杠这是该配置文件里的转义要求单反斜杠会被当成转义字符处理路径就错了。这个细节文档里不太显眼我踩过一次。networkingModemirrored是个好东西它让 WSL 的网络和 Windows 处于同一个地址空间localhost 转发、IPv6、DNS 的行为都更符合直觉。但它有版本要求且某些企业网络环境下会引入新问题不确定的时候先不开。5.3 DNS 解析慢、域名不通的处理WSL 里最常见的网络症状是ping 8.8.8.8通但ping baidu.com不通。这说明网络层没问题是 DNS 解析出了问题。WSL 默认会在/etc/resolv.conf里自动生成一个指向虚拟网关的 nameserver。这个自动生成的文件经常在切换网络比如从公司网切到家里之后就失效了。手工办法两种一是在/etc/wsl.conf里关掉自动生成[network] generateResolvConffalse然后手动写/etc/resolv.confnameserver 223.5.5.5 nameserver 119.29.29.29二是配上dnsTunnelingtrue让 DNS 请求走 Windows 侧的解析通道。这条路更省事尤其是当你 Windows 侧本来就配置了公司内网的 DNS 时隧道模式能直接复用。改完/etc/wsl.conf要wsl --shutdown才生效改.wslconfig也一样。这一点特别容易被忽略——很多人改完配置文件发现没效果就是忘了这一步。5.4 配置生效与验证改完.wslconfig之后的标准流程wsl --shutdown wsl -d Ubuntu进去验证几件事# 看内存 free -h # 看 CPU 核心数 nproc # 看 swap swapon --show # 看 DNS cat /etc/resolv.conffree -h里的 total 应该接近你设的 memory 值内核本身会占一点点。如果还是显示宿主机全部的物理内存说明配置没生效检查文件路径、文件名.wslconfig前面有个点别写成wslconfig、以及是不是在 Windows 用户目录下而不是 WSL 里。提示.wslconfig在 Windows 侧写/etc/wsl.conf在 WSL 侧写两者名字相似但职责完全不同。前者管全局资源后者管单个发行版的用户、挂载、网络行为。搞混了是新手最常见的坑之一。6. 和宿主工具链打通VSCode、Docker、CUDA、MATLAB6.1 VSCode 里用 WSL 的正确打开方式VSCode 是目前和 WSL 配合得最顺的编辑器但用法有讲究。第一步在 Windows 侧的 VSCode 里装扩展Remote - WSL现在合并进了 WSL 扩展里。装完之后在 WSL 终端里进到项目目录敲code .VSCode 会以一个远程窗口的形式打开左下角显示WSL: Ubuntu。这时候编辑器的进程一部分在 Windows、一部分在 Linux扩展也分两边装。关键经验扩展必须在 WSL 侧再装一遍。VSCode 会在扩展栏提示 Install in WSL尤其是 Python、Pylance、C/C 这类需要调用解释器或编译器的扩展装在 Windows 侧完全没法用。我见过有人抱怨Python 找不到就是扩展装错地方了。另一个常见问题有人图方便直接在 Windows 侧用\\wsl$\Ubuntu\home\me\project这样的 UNC 路径打开项目。能用但不建议。文件监视file watcher在这种路径下经常出毛病热重载失灵而且性能很差。老老实实从 WSL 终端里code .。如果想从命令行按路径打开code --remote wslUbuntu /home/me/project这个写法在写脚本、做自动化的时候有用。6.2 Docker Desktop 与 WSL 后端的报错处理Docker Desktop 在 Windows 上默认就用 WSL2 作为后端。它会在 WSL 里创建两个特殊发行版docker-desktop和docker-desktop-data新版合并成了一个。wsl --list --verbose里能看到它们。常见的 there was a problem with wsl 报错八成是这三种情况WSL 版本太老。前面说过wsl --update加--web-download兜底。这两个特殊发行版状态坏了。表现是 Docker 启动不了、wsl --list里它们显示 Stopped 或者干脆消失。修法wsl --shutdown wsl --unregister docker-desktop wsl --unregister docker-desktop-data然后重启 Docker Desktop它会自己重建。注意这会丢掉所有镜像和容器数据因为数据就存在这两个发行版的虚拟磁盘里。有重要数据的话提前docker save备份。虚拟化没开或者被别的软件占了。BIOS 里的虚拟化VT-x / AMD-V没开或者装了什么游戏反作弊、其他虚拟机软件抢了虚拟化资源。这种情况的报错通常在 Docker 的详细日志里能看到不在 WSL 的报错里。还有一个特别容易被忽视的Docker Desktop 的 WSL 集成是按发行版开关的。设置里那个 WSL Integration 列表你得手动把Ubuntu勾上不然你在 Ubuntu 里敲docker会发现命令不存在。6.3 在 WSL 里跑 CUDA 的驱动边界这是个大坑很多人在这里绕很久。规则只有一条驱动装在 Windows 侧CUDA Toolkit 装在 WSL 里。具体说在 Windows 上安装 NVIDIA 显卡驱动。一定要是较新版本的驱动因为 WSL 的 CUDA 支持是通过驱动里的一个特殊组件libcuda.so的 Windows 版本叫nvcuda.dll那套暴露给 WSL 的。老驱动没有这个能力。在 WSL 里不要再装一遍显卡驱动。装了就冲突nvidia-smi反而会报错。在 WSL 里装 CUDA Toolkitsudo apt update sudo apt install -y nvidia-cuda-toolkit或者按官方文档走 apt 源安装特定版本。验证nvidia-smi在 WSL 里能打印出显卡信息、驱动版本、显存占用就说明通路是好的。如果提示command not found是 toolkit 没装如果提示Failed to initialize NVML那是 Windows 侧的驱动问题回去更新驱动。再验证一下运行时nvcc --version注意nvidia-smi显示的 CUDA Version 是驱动支持的最高版本nvcc --version显示的是你实际装的 toolkit 版本两者不一样很正常只要 toolkit 版本不高于驱动支持的版本就行。装 PyTorch 的时候要选 cu 版本不要选 cpu 版本否则它根本不用显卡pip install torch --index-url https://download.pytorch.org/whl/cu121版本号要和你的驱动匹配装之前先看nvidia-smi里的 CUDA Version。6.4 MATLAB 为什么识别不到 WSL 里的解释器这个问题挺典型。MATLAB 的pyenv机制只认 Windows 本地的 Python 安装它没法直接指向一个跑在虚拟机里的解释器。所以你在 WSL 里装好了 Python 和一堆包MATLAB 那边pyenv里翻来翻去也找不到。官方支持的路径其实只有一条MATLAB 用 Windows 侧的 Python。所以如果你的目的只是在 MATLAB 里调用 Python 函数那就在 Windows 装一个 Python配好pyenv。如果你确实想用 WSL 里的环境比如那边的依赖更全、或者有 Linux 特有的库可行的做法是走脚本级调用status system(wsl -d Ubuntu -u yourname python3 /home/yourname/script.py);这种方式能跑通但代价是你和 Python 之间隔了一层命令行传参、拿返回值、传大数组都很别扭。数据交换基本只能靠文件或者标准输出。我的建议是别硬凑。MATLAB 和 WSL 的交集本来就小如果项目里两边都要用把边界划清楚——MATLAB 做数值计算和仿真WSL 做数据处理和模型训练中间用文件mat、csv、parquet交换比互相调用清爽得多。7. WSL 里那些工具的实际踩坑binwalk、Python 环境7.1 binwalk 装出来为什么是老版本sudo apt install binwalk能装上但你跑到一个较新的固件上可能会发现它什么都解不出来。这通常不是你的用法问题而是 Ubuntu 仓库里的 binwalk 版本偏旧。binwalk 在向新版本演进的这段时间里依赖和用法都有变化。老版本对某些新的压缩格式、新的文件系统镜像支持不好。想用新特性就得自己想办法装新版。一条路是从源码构建。这需要先补齐编译环境sudo apt update sudo apt install -y build-essential git python3 python3-pip然后把源码拉下来按它的构建说明走。注意 binwalk 的依赖里有一堆解压工具sasquatch、jefferson、unsquashfs之类这些在 Ubuntu 仓库里有些能直接 apt 装有些得自己编译。装全了解包认得才多。另一条路是看清楚你现在这个版本的能力边界。如果你只是做常规的文件格式识别和提取老版本够用如果你要处理的是新出的芯片固件、OTA 包那大概率得自己构建一套。提示binwalk 这类安全分析工具在 WSL 里跑完全没问题因为它只是普通用户态程序。但如果你的脚本里涉及到原材料解包后要挂载文件系统mount在 WSL 里是受限的需要在 WSL 里以 root 挂载 loop 设备而且得确认你的 WSL 内核支持你要挂的文件系统类型。这一点和纯 Linux 主机不一样踩过就知道。7.2 conda 环境与 PyCharm 的衔接PyCharm 从 2022.3 开始正式支持 WSL 解释器。配置路径是File → Settings → Project → Python Interpreter → Add Interpreter → On WSL选你的发行版然后填解释器路径。坑在这几个地方conda 必须装在 WSL 里不是 Windows 里。这是最容易搞错的。有些人在 Windows 上装了 Anaconda然后想在 PyCharm 里指向 WSL 的解释器结果发现那个路径根本不存在。正确的做法是在 WSL 里装 Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh装完之后环境解释器的路径形如/home/yourname/miniconda3/envs/myenv/bin/python。尽量不要用~/anaconda3而用~/miniconda3。Anaconda 完整版在 WSL 里占空间还不小而且很多包你根本用不上。Miniconda 干净。环境不要建在/mnt/c下面。我见过有人为了让 Windows 侧的 PyCharm 能看到把 conda 环境建在 Windows 盘上。结果是每次激活环境都要花十几秒装包更是慢得离谱。环境建在/home下让 PyCharm 通过 WSL 通道去访问才是对的姿势。如果 PyCharm 里添加 WSL 解释器时列表是空的检查 PyCharm 版本、以及wsl --list --verbose里有没有正常状态为 Running 的发行版。有时候需要先在 WSL 里手动启动一次。7.3 在 WSL 里跑模型推理工具的注意事项现在有不少人把 WSL 当成Windows 上的 Linux 推理机在里跑各种本地模型工具。这条路是通的但有几点必须注意。显存走 Windows 驱动这个前面说过。nvidia-smi里能看到 GPU是前提。内存要配够。模型权重加载到内存里如果你的.wslconfig里memory4GB那稍微大点的模型直接 OOM。根据模型规模调7B 量级的模型加上 KV cache 和框架开销通常要 12G 以上才舒服。模型文件别放在/mnt/c。加载一个几 G 的模型文件从 9p 协议读进来的速度会让你怀疑人生。放到/home/yourname/models下面。注意虚拟磁盘膨胀。下载几个模型之后ext4.vhdx会迅速涨到几十上百 G。WSL 的虚拟磁盘是只涨不缩的删掉文件之后它也不会自动还给你。想回收空间得手动收缩wsl --shutdown # 用 diskpart 收缩或者用 Optimize-VHD需要 Hyper-V 模块这是个慢性问题用久了才感觉到提前规划好磁盘位置能省很多事。8. 卸载、重装与日常故障速查8.1 干净卸载的完整顺序卸载 WSL 不是点一下卸载就完事残留物会占着几十个 G。# 1. 列出所有发行版 wsl --list --verbose # 2. 逐个注销数据会全丢提前备份重要的东西 wsl --unregister Ubuntu wsl --unregister docker-desktop wsl --unregister docker-desktop-data注销之后去启用或关闭 Windows 功能里取消勾选适用于 Linux 的 Windows 子系统和虚拟机平台重启。最后清理残留C:\Users\你的用户名\.wslconfig如果你不再用 WSL可以删%LOCALAPPDATA%\Packages\下面以发行版名字命名的目录你自己指定的那些虚拟磁盘目录比如D:\wsl\想只重置 Ubuntu 而不是整个卸载那wsl --unregister Ubuntu加重新--import就够了Windows 功能不用动。8.2 root 登录与默认用户管理几个常用操作# 以 root 进某个发行版 wsl -d Ubuntu -u root # 忘了用户密码进去改 wsl -d Ubuntu -u root passwd yourname改默认用户最可靠的方式还是写/etc/wsl.conf[user] defaultyourname改完wsl --shutdown重进。比ubuntu.exe config --default-user靠得住也不依赖具体发行版的 exe 名字。还有个细节wsl --import进来的发行版/etc/wsl.conf可能是空的所以刚进去是 root。这不是坏了是设计如此。8.3 常见问题速查表现象大概率原因处理方向wsl --install卡在正在安装分发包下载慢或断加--web-download或走离线 tar 导入0x80072ee2/wininet_e_timeout分发服务连不通换网络、清 DNS 缓存、同步系统时间、离线导入wsl --update报 403更新链路被拒--web-download或手动下载内核更新包Docker 报 WSL 版本太老WSL 内核过旧wsl --update后wsl --shutdownDocker 启动失败docker-desktop 发行版损坏注销这两个发行版重启 Docker 重建Vmmem 占用高Linux 页缓存不回收.wslconfig设 memory 上限必要时wsl --shutdownWSL 里域名解析失败resolv.conf 失效关掉generateResolvConf手写 nameserver 或开 DNS 隧道nvidia-smi报 NVML 错误Windows 侧驱动问题更新 Windows 显卡驱动WSL 里别装驱动PyCharm 找不到 WSL 解释器conda 装在 Windows 侧或环境在/mnt/cconda 重装到 WSL 的/home下项目编译/装包特别慢代码放在/mnt/c挪到/home下重新装依赖C 盘空间莫名减少vhdx 只涨不缩迁移到 D 盘或手动收缩虚拟磁盘wsl -d Ubuntu进去是 rootimport 后没配默认用户写/etc/wsl.conf的[user] default8.4 关于长期维护的一点经验用久了之后我给自己定了几条规矩分享出来可能对你有用。每条 WSL 相关的命令我都记在一个纯文本笔记里包括当时为什么这么改。因为 WSL 的报错信息高度抽象同一个报错可能对应三种原因有个记录能省掉大量重复排查。.wslconfig的每一次修改都配一句注释说明为什么。过半年回来看你绝对想不起来当初为什么把 memory 设成 10GB 而不是 8GB。还有一条升级 Windows 大版本之前先wsl --export一份备份。系统更新偶尔会动 WSL 的组件虽然大多数时候没事但真出事的时候一份 tar 能让你十分钟回到原样而不是重装一整天。9. 几句实际操作中的体会WSL 这东西装的时候觉得麻烦用顺了之后是真的回不去。我现在的工作流基本是Windows 侧开着浏览器和聊天工具WSL 里跑终端、编辑器、容器两边靠code .和 localhost 端口打通需要传文件的时候直接走\\wsl$路径。整套下来比在虚拟机里折腾共享文件夹舒服太多。但我最想说的其实是另一件事WSL 的绝大多数疑难杂症根子都在网络和路径这两件事上。卡下载、403、解析失败全是网络装包慢、编译慢、磁盘爆全是路径。你把这篇文章里代码放 /home虚拟磁盘放非系统盘.wslconfig设资源上限这三条落实了剩下的问题基本都能自己排查出来用不着去搜那些一模一样却互相矛盾的教程。最后一个我踩过的教训别同时装商店版 WSL 和手动下载的内核更新包。这两个东西版本不一致的时候wsl --version给你的信息是混的你会以为自己更新成功了实际上运行时用的是另一个。判断方法很简单——wsl --version输出的第一行如果有 WSL 版本号形如WSL 版本: 2.x.x说明你用的是新版独立组件如果只有内核版本那就是老的 inbox 版。分清楚自己用的是哪个后面所有的更新和排错才有的放矢。
返回列表