ARTICLE DETAIL

资讯详情

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

WSL升级失败排查指南:三层定位与离线修复全攻略

WSL升级失败排查指南:三层定位与离线修复全攻略 终端里敲下wsl --update结果蹦出来“无法与服务器建立连接”或者跑到一半系统直接给你丢一个wsl/installdis错误码更气人的是升级完之后启动发行版反而卡住甚至提示“不支持镜像网络模式正在回退”。说实话WSL 安装失败的求助我见得多但“升级失败”的坑比安装还要多。原因也很简单很多人根本没搞清楚自己升级的到底是哪一层东西——是系统功能、WSL 2 内核还是商店里的 WSL 应用。这三层各管各的事任何一层出问题最终表现都是“升级 WSL 失败”。这篇就把我实际处理过的几类典型场景拆开讲从报错反推问题层再给出能直接照做的排查路径。1. 先定位你升级的究竟是哪一层 WSL1.1 三层组件三种坏法我一直跟朋友说别把 WSL 当成一个普通软件它其实是三层东西叠在一起系统功能层指 Windows 里的“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个可选功能。老系统上 WSL 1 靠前者就能跑WSL 2 必须两个都开。这一层坏了通常报错就是wsl/installdis或者功能开关根本打不开。内核层WSL 2 背后是一个真实的 Linux 内核微软把这个内核做成了独立组件。早期是单独的wsl_update_x64.msi更新包现在新版 WSL 已经把内核包进商店应用或 MSI 安装包里。内核太旧或没装上会出现“升级失败”或发行版启动不了。工具链/发行版层商店版 WSL 应用提供wsl.exe这套命令行工具以及你装的 Ubuntu、Debian 等发行版。平时敲的wsl --update更新的主要就是这一层。1.2 用报错文本反推是哪一层在闹脾气我在群里看人发求助最头疼的是只说一句“WSL 升级失败”就没下文了。实际上把报错原文贴出来问题基本已经定位了一半。看到的提示涉及的层优先排查方向wsl --update 无法与服务器建立连接商店版 WSL 应用/下载通道更新包下载环节走离线安装wsl needs updating/ “您的 Windows 版本不支持...”系统功能层或内核层检查系统版本、手动安装内核包wsl/installdis错误代码系统功能层/虚拟化启用“虚拟机平台”和“WSL 功能”重启不支持镜像网络模式...正在回退配置 系统版本能力检查.wslconfig配置或系统组件wsl 不是内部或外部命令工具链层说明 WSL 根本没装好你可能注意到最后一种其实不算升级但大量“升级失败”的求助恰恰卡在连wsl.exe都没有的旧系统上所以也放进来了。1.3 升级前先留个“底”wsl --version 和 wsl --status排查之前先确认你现在到底处于什么版本状态。管理员终端里执行wsl --version新版 WSL 会输出类似WSL 版本 2.x.x.x并且列出内核版本和 Windows 版本。如果这条命令提示“未安装”或直接报错说明当前要么是旧版内置 WSL要么工具链层都没装好。再跑一下wsl --status它能告诉你当前默认版本是 WSL 1 还是 WSL 2以及内核是否有更新提示。我自己的习惯是任何升级排查开始前先把这两条命令的输出截图留下来。不然改了一通配置连“改之前是什么样”都不知道后面全是在瞎试。2. “wsl --update 无法与服务器建立连接”别死磕在线更新离线包更靠谱2.1 这个报错到底是什么原因“无法与服务器建立连接”是我收到最多的求助之一典型场景是管理员终端敲下C:\Users\Administratorwsl --update 无法与服务器建立连接先别怀疑系统坏了。wsl --update要去微软的更新端点拉取新的 WSL 组件包这一步纯属网络下载问题。微软的更新 CDN 在国内网络环境下时快时慢企业内网里还经常被安全策略拦一道于是表现就是卡半天后给你一句“无法与服务器建立连接”。这种情况跟你的 WSL 配置本身关系不大反复重试运气好能过但浪费时间。我的建议是重试一两次不行就直接切离线升级。2.2 常规重试流程先把状态归零在切离线方案之前按这个顺序快速试一遍管理员终端执行wsl --shutdown把可能占着文件的发行版全部停掉。执行ipconfig /flushdns清一下 DNS 缓存。确认 Windows Update 服务Wuauserv没被手动停掉可以在服务管理器里看一眼。再执行wsl --update观察是否还报错。这一步能解决一部分偶发问题但不保证。真正稳的是下面这个离线思路。2.3 离线升级官方 MSI 安装包是最后的底牌WSL 的离线升级分两种情况别搞混。老系统、老内核的场景如果你用的是 Win10 2004 之前的系统或者wsl --version显示内核版本很旧通常需要单独装 WSL 2 内核更新包。微软官方文档里给的下载地址一直是aka.ms/wsl2kernel文件名一般是wsl_update_x64.msi。下载后双击安装或者管理员终端执行wsl --shutdown msiexec /i wsl_update_x64.msi /quiet wsl --set-default-version 2 wsl -l -v最后一步wsl -l -v是为了确认发行版已经切到 WSL 2。新版商店版 WSL 的场景如果你用的是商店版 WSLwsl --update拉不下来时可以到微软官方渠道下载对应版本的 MSI 安装包。微软 WSL 的 GitHub 官方仓库 Release 页面会提供 x64 的 MSI 包文件名通常是wsl.版本号.x64.msi这样的格式。下载后同样的方式安装wsl --shutdown msiexec /i wsl.2.x.x.x.x64.msi /quiet wsl --version安装完成后会看到 WSL 版本号变成新版。这里有个很实在的提醒离线包安装也一样要先wsl --shutdown。否则发行版正在运行文件被锁住MSI 装完后可能提示成功但实际没生效重启又变回老版本这才是真的坑。2.4 顺带说下“wsl --install 太慢”怎么办搜索热词里“wsl install太慢了”也是高频问题。这里头有个认识误区wsl --install并不是只下载 WSL 本身它还要下载 Linux 发行版镜像。发行版镜像体积以 GB 计从商店 CDN 下载确实慢卡在某个百分比不动很常见。如果你的目标是“让 WSL 可用”等一会儿是值得的。但如果卡死或一直失败就按上面离线方案先把 WSL 本体和发行版分别用离线包解决。我个人实测下来离线安装比干等在线下载稳定太多至少不会出现下载到 64% 又断掉重来的绝望感。3. 错误码 wsl/installdis基础功能没装好升级当然起不来3.1 先弄懂这个错误码在说什么wsl/installdis这一串不是普通的网络错误它通常出现在wsl --install或升级过程中底层组件安装失败。我见过太多人看到这个码就到处问其实根子往往很简单“虚拟机平台”或“适用于 Linux 的 Windows 子系统”两个功能没启用或者功能已经启用但缺了重启。Windows 在启用新功能后需要在系统层面做一次状态切换不重启的话后续的 WSL 安装/升级进程拿不到有效状态自然就报installdis。3.2 完整排查链路按照下面顺序走基本能把 90% 的wsl/installdis问题解决。第一步查功能状态管理员终端里执行dism.exe /online /get-featureinfo /featurename:Microsoft-Windows-Subsystem-Linux dism.exe /online /get-featureinfo /featurename:VirtualMachinePlatform看输出的State字段。Enabled表示正常Disabled说明没启用PendingReboot说明还欠一次重启。第二步启用功能并重启如果状态不是Enabled执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart shutdown /r /t 0重启后再重跑wsl --update或wsl --install。第三步确认 BIOS 虚拟化已开这一步很多人会漏。即使 Windows 功能都开了BIOS 里虚拟化没开WSL 2 也起不来。打开任务管理器切到“性能”页看 CPU 那栏虚拟化已启用 → 正常虚拟化已禁用 → 进 BIOS 打开 Intel VT-x 或 AMD SVM品牌机的 BIOS 入口不一样但搜“主板型号 开启 VT”一般就有答案。虚拟机里装 WSL 的用户也要注意嵌套虚拟化否则同样会失败。第四步功能组件损坏的额外处理如果执行启用功能时报错0x800f0954这类代码说明系统组件层出了问题不是重启能解决的。先尝试dism.exe /online /cleanup-image /restorehealth跑完再重新启用功能。如果还不行的基本就是系统镜像本身被精简或损坏这种情况下最省事的方案是找与你系统版本匹配的官方镜像修复组件之后再升级 WSL别在精简版系统上死磕。3.3 升级失败后的“残留态”别硬上安装/升级中断后系统里可能出现一个“半成品”发行版wsl -l -v能看到名字但进入就报错或者wsl --update反复失败。我碰到过好几次都是因为中断后没有清理状态。处理办法是先把所有实例停掉然后对损坏的发行版做注销再重新安装/升级wsl --shutdown wsl --unregister 发行版名 wsl --update wsl --install -d Ubuntu注意wsl --unregister会删掉这个发行版的所有数据执行前如果里面有重要文件先用后面的导出命令备份。4. 升级后马上遇到的“回退”与“代理未镜像”配置坑4.1 不支持镜像网络模式正在回退这个提示出现得非常频繁尤其是新版 WSL 出来后很多人想试试镜像网络模式在%UserProfile%\.wslconfig里写了[wsl2] networkingModemirrored结果启动时系统直接告诉你wsl: 不支持镜像网络模式: Windows 版本 26200.9457 没有所需的功能。正在回退先解释下为什么。镜像网络模式是较新 Windows 较新 WSL 才支持的功能它让 WSL 和 Windows 共享同一套网络栈。但它的前提是 Windows 系统本身带有所需的网络组件。你看到的版本号 26200 其实很新了但如果是精简过的系统、或者某些组件被禁用Windows 仍然可能不认这项功能。处理上分两步短期把.wslconfig里的networkingModemirrored删掉或者改成[wsl2] networkingModenat然后执行wsl --shutdown重新进入发行版。系统不再尝试镜像模式自然也不会回退。长期如果确实需要镜像模式先等 Windows 更新补齐组件再把配置改回来。别指望靠反复重启解决版本不支持就是不支持。4.2 “检测到 localhost 代理配置但未镜像到 WSL”要不要管这条提示经常和新版 WSL 一起出现wsl: 检测到 localhost 代理配置但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理简单说WSL 发现 Windows 环境变量里存在HTTP_PROXY或HTTPS_PROXY这类配置但由于当前 NAT 模式这些变量不会自动传给 WSL 里的 Linux 环境所以它提醒你一声。这本身不影响 WSL 启动Linux 里该干嘛干嘛。如果你不需要在 WSL 里访问这些变量指向的服务忽略即可。如果确实需要有两条路开启镜像网络模式前提是系统支持见上一节在 WSL 内部自己配置环境变量比如在/etc/profile.d/下写一个脚本把代理指向 Windows 主机实际可访问的地址再source生效。还有一种更省事的办法如果这些变量是某些办公软件或调试工具临时写入的你可以在 Windows 终端里清掉这两个变量再启动 WSLset HTTP_PROXY set HTTPS_PROXY再执行wsl --shutdown和wsl提示就会消失。这个场景多发生在办公电脑上很多同事第一次见这个提示以为 WSL 坏了其实只是环境变量层面的“提醒”而已。4.3 升级后发行版卡住先冲状态再查日志另一类“升级失败”是升级本身显示成功但wsl -d Ubuntu进入时黑屏卡住。排查顺序我建议这样做wsl --shutdown wsl --update wsl -d Ubuntu如果还是卡住先看任务管理器内存是不是被占满发行版 VHD 所在磁盘空间是否不足。WSL 2 的虚拟磁盘如果所在盘满了启动会无限卡住。再不行就看事件查看器里Windows日志下有没有 WSL 相关的错误记录。一般能看到比较明确的内核或驱动报错。最极端的情况是发行版文件本身已经乱了我的处理是备份数据、注销、重新导入wsl --shutdown wsl --export Ubuntu D:\ubuntu-backup.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\ubuntu-backup.tar --version 2这个操作等于把发行版“重装”一遍但数据还在备份包里。导入后默认用户会变成 root需要改/etc/wsl.conf才能恢复原来的普通用户这点后面第 5 章会细说。5. 相伴“升级失败”的高频求助点没有 wsl 命令、磁盘暴涨、想换盘5.1 “wsl 不是内部或外部命令”先确认你是不是连功能都没装不少搜“升级 WSL 失败”的人其实是老系统上命令行连wsl都没有。Windows 10 的旧版本1803、1809 等默认不带wsl.exe所以你在cmd或 PowerShell 里执行wsl会提示“不是内部或外部命令”。这时候谈不上升级先启用系统功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart重启后如果还要用 WSL 2再安装 WSL 2 内核更新包就是第 2 章那个wsl_update_x64.msi最后执行wsl --set-default-version 2新系统上则简单得多直接wsl --install它会自动装齐所需功能。这一步的本质是从零搭好基础再谈升级。5.2 升级失败后磁盘空间暴涨VHD 不会自己瘦身升级或反复安装失败之后C 盘突然少了几个 GB是很常见的连带问题。罪魁祸首一般是两个一是商店缓存的安装包没清二是 WSL 2 的虚拟磁盘文件ext4.vhdx只会膨胀、不会自动收缩。清理思路分两步第一步进入发行版做 fstrimsudo fstrim -v /这会告诉虚拟磁盘哪些块已经空了。第二步用 diskpart 压缩 vhd先wsl --shutdown然后在管理员终端里执行diskpart select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\...\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit上面路径里的...需要替换成实际发行版对应的包名目录我用命令查找过好几次路径五花八门最快的办法是 PowerShell 里直接搜Get-ChildItem -Path C:\Users\$env:USERNAME\AppData\Local\Packages -Recurse -Filter ext4.vhdx | Select-Object FullName拿到真实路径再执行 diskpart就不会找错文件。5.3 想借“升级”顺便换到 D 盘导出导入比复制文件稳很多人因为 C 盘吃紧想在升级的同时把发行版挪到 D 盘。劝你别直接把ext4.vhdx拷到 D 盘然后改注册表容易把 WSL 搞到无法启动。官方最稳的路径就是导出再导入wsl --shutdown wsl --export Ubuntu D:\ubuntu-backup.tar wsl --unregister Ubuntu wsl --import Ubuntu D:\WSL\Ubuntu D:\ubuntu-backup.tar --version 2如果你本来是用 WSL 1想借这个操作顺便升到 WSL 2--version 2这个参数加上就行导入后发行版直接就是 WSL 2。有个小坑必须讲wsl --import导入的发行版默认以 root 身份登录和你原来日常用的普通用户不一样。恢复方式是在发行版内编辑/etc/wsl.conf[user] default你的用户名改完执行wsl --shutdown再进就回到原来的用户了。这套导出导入流程其实也适用于任何“升级失败后需要重装”的场景。我自己的习惯是在 WSL 一切正常的时候定期用wsl --export打一个备份 tar 包升级前也打一个。真升级搞坏了直接导入回去省掉一整晚的折腾。处理“升级 WSL 失败”这件事最有效的办法不是盯着屏幕重试而是先搞清失败在哪一层再用对路的方案一次解决。
返回列表