WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃
- 1Windows 如何装 WSL 教程指南
- 2WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃本文
一次装 WSL,踩了六个坑、绕了五条弯路。真正的原因只有一个,但前面五个”疑似凶手”每一个都看起来很像。
本文记录完整的排查链路、每个阶段的判断依据,以及最后那条一击致命的命令。
如果你只是想装 WSL 还没开始,先看安装教程。这篇是装不上 / 网络不通时的救命文档。
一、环境与目标
| 项目 | 值 |
|---|---|
| 系统 | Windows 11 Build 26200(25H2) |
| CPU | 13th Gen Intel Core i7-13700H |
| 内存 | 16 GB |
| 网卡 | Intel Wi-Fi 6 AX201(无线连接) |
| 目标 | WSL 3.0.3 + Ubuntu 24.04 LTS |
| 初始状态 | 已装 Store 版 WindowsSubsystemForLinux 2.5.9.0,未装任何发行版 |
先做体检,确认硬件层面没问题:
(Get-ComputerInfo).HyperVisorPresent # TrueGet-Service AppXSVC # RunningGet-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux虚拟化开着、AppX 部署服务正常、WSL 内核包已存在 —— 只差一个发行版。看起来是顺手的事。
二、坑 1:Wsl/CallMsi/REGDB_E_CLASSNOTREG
现象
wsl --installwsl: WSL 安装似乎已损坏 (错误代码: Wsl/CallMsi/Install/REGDB_E_CLASSNOTREG)。按任意键修复 WSL,或 CTRL-C 取消。此提示将在 60 秒后超时。正在更新适用于 Linux 的 Windows 子系统: 3.0.3。REGDB_E_CLASSNOTREG 即 COM 类未注册,发生在 Store 版 WSL 从 2.5.9 升级到 3.0.3 的 MSI 环节。
别按任意键。 它的自动修复基本不会成功,只会让你多等 60 秒。直接 CTRL-C 取消。
排查
AppXSVC(AppX Deployment Service)状态正常,msiserver 是 Manual 按需启动也属正常。所以问题不在服务,而在这条升级链路本身。
解决:绕过 Store,用独立 MSI 安装
微软在 GitHub Release 上提供完整的离线安装包 —— microsoft/WSL/releases。最新版是 wsl.3.0.3.0.x64.msi(约 351 MB)。
国内直连 GitHub Release 经常中断(curl: (56) schannel: server closed abruptly)。用浏览器或下载工具通常更稳,下载完校验一下大小,351 MB 才完整。
管理员 PowerShell 里执行这套组合拳:
# 1. 停掉 WSL 进程Get-Process wsl, wslservice -ErrorAction SilentlyContinue | Stop-Process -Force
# 2. 卸载损坏的 Store 包(此时未装任何发行版,删它零风险)Get-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux | Remove-AppxPackage
# 3. 清掉失效的 wsl.exe 别名Remove-Item 'HKCU:\Software\Microsoft\Windows\CurrentVersion\App Paths\wsl.exe' -Recurse -Force
# 4. 用本地 MSI 安装(/passive 显示进度条,/norestart 不自动重启)msiexec /i "C:\Users\w\Downloads\wsl.3.0.3.0.x64.msi" /passive /norestart
# 5. 确保两个 Windows 功能开着dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartmsiexec 返回 0 或 3010 都算成功(3010 表示需要重启)。
三、坑 2:localhost 代理未镜像
重启后装发行版,这次很顺利:
wsl --install -d Ubuntu-24.04已成功安装分发。可以通过"wsl.exe -d Ubuntu-24.04"启动它wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。创建了 UNIX 用户后进入系统。但那行警告埋下伏笔 —— 本机 Windows 开着系统代理 127.0.0.1:7897,而默认的 NAT 模式里 WSL 是独立 IP,够不到 Windows 的 127.0.0.1。
第一反应:切镜像模式
镜像模式(mirrored)让 WSL 直接共用 Windows 的网络栈,127.0.0.1 就是 Windows 的 127.0.0.1:
[wsl2]networkingMode=mirroredautoProxy=true然后就是长达一个小时的噩梦开始。
四、坑 3:0x8007054f,WSL 直接退化成无网卡
wsl ~wsl: 出现了内部错误。错误代码: CreateInstance/CreateVm/ConfigureNetworking/0x8007054fwsl: 无法配置网络 (networkingMode Mirrored),回退到 networkingMode None。注意最后那句:回退到 networkingMode None —— 这不是降级,是这台虚拟机连网卡都没有了。后面所有的”网络不通”都源于此。
误判一:以为是 VMware 的锅
本机装了 VMware,有两张虚拟网卡 VMnet1 / VMnet8:
Get-NetAdapter | Where-Object { $_.InterfaceDescription -match 'TUN|TAP|VMware|Hyper-V' }VMware 的虚拟交换机确实会跟 Hyper-V 抢网络配置,是 mirrored 失败的常见原因。先禁用网卡试:
Get-NetAdapter -Name "VMware Network Adapter VMnet1","VMware Network Adapter VMnet8" | Disable-NetAdapter -Confirm:$false仍然报 0x8007054f。
再把 VMware 整个卸载、重启:
Get-Service | Where-Object { $_.Name -match 'VMnet|VMWARE|VMAuthd' } # 空,确认清干净Get-NetAdapter -IncludeHidden # VMnet 已消失还是报 0x8007054f。
到这里可以确认:VMware 是无辜的。但它背了最久的锅,因为它”看起来最像”。
五、坑 4:NAT 模式下的 IPv6 陷阱
先回退到 NAT 保命:
[wsl2]networkingMode=natdnsTunneling=true网络起来了:
$ ip -4 addr show eth0 | grep inetinet 172.30.7.40/20 brd 172.30.15.255 scope global eth0$ cat /etc/resolv.conf | grep nameservernameserver 10.255.255.254 # dnsTunneling 的隧道地址,正常换清华源后 apt update,索引文件全部下载成功,但 deb 包集体失败:
Get:1 https://mirrors.tuna.tsinghua.edu.cn/ubuntu noble InRelease [256 kB] ← 成功Err:1 ... libgssapi-krb5-2_1.20.1-6ubuntu2.10_amd64.deb Cannot initiate the connection to mirrors.tuna.tsinghua.edu.cn:443 (2402:f000:1:400::2). - connect (101: Network is unreachable)关键线索是那个 IPv6 地址 2402:f000:1:400::2。清华源有 AAAA 记录,apt 优先走 IPv6,而 WSL 的 NAT 网络没有 IPv6 路由 → 直接不可达。
强制 IPv4 即可:
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4同理,curl 在 WSL 里没输出也是这个原因,加 -4 验证:
curl -4 -sI https://mirrors.tuna.tsinghua.edu.cn --max-time 10 | head -1六、坑 5:IPv6 修好了还是连不上
加了 ForceIPv4 之后,错误里的 IPv6 地址确实消失了,但换成了:
E: Failed to fetch ... libcurl3t64-gnutls_8.5.0-2ubuntu10.16_amd64.deb Unable to connect to mirrors.tuna.tsinghua.edu.cn:https:判断依据
这一段值得单独说:
dists/下的 InRelease(126 ~ 256 KB)全部成功pool/下的 deb 包(几百 KB ~ 几十 MB)大量失败- 报错是
Unable to connect(连接建立失败),不是传输中断
如果是 MTU 问题,小文件一样会挂;所以不是 MTU。结合”索引通、包不通”,更像是连接层被掐 —— 后来证实这其实是网络栈损坏的连带症状,而不是源的问题。
又排除了一个:代理软件
把梯子整个关掉重跑,apt update 照样失败。代理软件无辜。
顺带一个易忽略的点:只退出梯子软件、但 Windows 的”系统代理”开关还开着(ProxyEnable=1 指向 127.0.0.1:7897),会让 Windows 处于半断网状态,WSL 的 dnsTunneling 也会跟着遭殃。关梯子要连开关一起关。
七、阶段性突破:重置 Windows 网络栈
查 0x8007054f 时确认了两件事:
- 该错误由 Hyper-V 虚拟交换机与主机物理网卡驱动初始化冲突 触发
- 社区验证有效的解法是重置 Windows 网络栈
有个低成本试法:先断网(关 Wi-Fi / 拔网线)→ wsl --shutdown → 启动 WSL → 再连网。断网状态下没有物理网卡可绑定,交换机能干净建起来。
但更彻底、一步到位的是这个(管理员 PowerShell,需重启):
wsl --shutdownnet stop hnsnet start hnsnetsh winsock resetnetsh int ip resetshutdown /r /t 0重启后再进 WSL —— 报错消失了。
$ hostname -I192.168.1.112 fd8e:133f:b5f7:0:bd12:a5a:7ee2:e51d ... # 与 Windows 同网段 + IPv6 都回来了$ sudo apt updateFetched 3227 kB in 1s (4548 kB/s) # 一次成功镜像模式正常,代理自动同步,IPv6 可用,apt 跑满速。
当时以为故事到此结束。并没有 —— 第二天它又崩了,而且崩得一模一样。
八、反转:真凶其实是代理软件
复现规律是用户自己发现的:
使用途中如果开了代理再关掉,就会弹窗提示重启 WSL,重启之后还是报
0x8007054f。
这条线索一下子把前面所有矛盾都解释了 —— 那天 winsock reset 之后之所以成功,是因为那次启动代理还没打开。
证据
查进程确认本机跑的是 Clash Verge:
Get-Process | Where-Object { $_.ProcessName -match 'clash|mihomo|verge|sing|v2ray' } 3532 clash-verge D:\Program Files\Clash Verge\clash-verge.exe27320 verge-mihomo D:\Program Files\Clash Verge\verge-mihomo.exe再看网卡,WSL 的那张 vEthernet (WSL (Hyper-V firewall)) 不见了,多出来一对陌生组件:
Get-NetAdapter -IncludeHidden | Where-Object { $_.InterfaceDescription -match 'Hyper-V|WSL' }Name InterfaceDescription Status---- -------------------- ------vEthernet (FSE HostVnic) Hyper-V Virtual Ethernet Container Adapter UpvSwitch (FSE Switch) Hyper-V Virtual Switch Extension Adapter Up代理软件运行时会改 Windows 代理状态、并往 Hyper-V 网络栈里插入自己的组件。 而镜像模式的网络初始化恰恰依赖这份状态 —— 开关一次,状态就不一致了,下次 WSL 起不来。
结论:只要 Windows 上装了本地代理客户端,镜像模式就不稳定。 这不是配置问题,是架构冲突。查资料时其实早就看到这句话 (“只要你在 Windows 开了本地代理,WSL Mirrored 网络就极易报这个错”),当时没当回事。
最终架构:NAT + 自动探测代理
既然会频繁开关梯子,那就彻底不用镜像模式。NAT 不读 Windows 代理状态,开关梯子对它毫无影响。
代价是 NAT 下 127.0.0.1 够不到 Windows 的代理,得绕一下:
- Clash Verge 里打开「允许局域网连接 / Allow LAN」,让它监听
0.0.0.0:7897而不只是127.0.0.1 - WSL 里放一段自动探测脚本,梯子开着才走代理,关了自动降级:
cat >> ~/.bashrc <<'EOF'
# ---- WSL proxy (auto-detect) ----wsl_proxy() { GW=$(ip route show default 2>/dev/null | awk '{print $3}') if [ -n "$GW" ] && timeout 1 bash -c "</dev/tcp/$GW/7897" 2>/dev/null; then export http_proxy="http://$GW:7897" export https_proxy="http://$GW:7897" export no_proxy="localhost,127.0.0.1,192.168.*,10.*,172.16.*,172.17.*,172.18.*,\172.19.*,172.20.*,172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,\172.28.*,172.29.*,172.30.*,172.31.*,mirrors.aliyun.com,mirrors.tuna.tsinghua.edu.cn" echo "[proxy] on -> $GW:7897" else unset http_proxy https_proxy no_proxy echo "[proxy] off (梯子没开,国内源直连)" fi}wsl_proxyEOF
source ~/.bashrc脚本用 /dev/tcp 探测网关的 7897 是否可达:开着就 export,关着就 unset。
这样就不会出现”关了梯子导致 WSL 半瘫”的情况 —— 国内源本来也不需要代理。
不想开 Allow LAN 的话,Windows 侧改用端口转发也行(管理员 PowerShell):
netsh interface portproxy add v4tov4 listenaddress=<WSL网关IP> listenport=7897 connectaddress=127.0.0.1 connectport=7897只监听网关地址,比 0.0.0.0 安全,代价是 WSL 网段变了要重配。
九、最终配置
C:\Users\<你>\.wslconfig:
[wsl2]
# --- 为什么不用 mirrored ---# 镜像模式初始化网络时依赖 Windows 代理状态,本机跑 Clash Verge,# 每次开关梯子都会让下一次 WSL 启动报 0x8007054f 并回退 None。# 结论:有本地代理客户端时,镜像模式不可用。networkingMode=nat
# 必须关:NAT 模式下读取 Windows 代理只会每启动一次的无效警告autoProxy=false
# 通过 Windows 解析 DNS,而不是走 NAT 网关dnsTunneling=true
# 资源限制(i7-13700H / 16GB),按需调整# 不设的话 WSL 会吃掉约一半内存和全部核心memory=8GBprocessors=8swap=4GB
[experimental]
# 空闲时把缓存内存还给 WindowsautoMemoryReclaim=gradual
# 阻止 ext4.vhdx 只增不减sparseVhd=trueapt 源(/etc/apt/sources.list.d/ubuntu.sources):
Types: debURIs: https://mirrors.aliyun.com/ubuntuSuites: noble noble-updates noble-backports noble-securityComponents: main restricted universe multiverseSigned-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg梯子开着时验证(注意这里是网关 IP 而不是 127.0.0.1,NAT 下 WSL 是独立 IP):
$ ip route show default | awk '{print $3}'172.30.0.1
$ env | grep -i proxyhttp_proxy=http://172.30.0.1:7897https_proxy=http://172.30.0.1:7897no_proxy=localhost,127.0.0.1,192.168.*,10.*,...,mirrors.aliyun.com # 内网自动绕过
$ curl -sI https://github.com --max-time 10 | head -1HTTP/1.1 200 Connection established梯子关掉后重开一个终端:
[proxy] off (梯子没开,国内源直连)$ curl -sI https://mirrors.aliyun.com --max-time 10 | head -1HTTP/2 200 # 国内源照常能通,只是 GitHub 不通而已十、速查表:错误码 → 处置
| 错误 | 含义 | 处置 |
|---|---|---|
Wsl/CallMsi/REGDB_E_CLASSNOTREG | Store 版升级时 MSI 注册失败 | 下载独立 MSI 手动装;先卸 Appx 包 |
CreateInstance/CreateVm/ConfigureNetworking/0x8007054f | 本机是代理客户端所致;其他机器多为网络栈损坏 | 装了 Clash 类软件就直接切 NAT;否则 netsh winsock reset |
回退到 networkingMode None | 虚拟机无网卡,一切网络问题的根源 | 见上 |
connect (101: Network is unreachable) + IPv6 地址 | NAT 下无 IPv6 路由 | Acquire::ForceIPv4 "true" |
Temporary failure resolving 'xxx' | DNS 不通 | 多为上层问题的表象,别只改 DNS |
检测到 localhost 代理配置,但未镜像 | NAT 下用不了 Windows 代理 | 无害。要代理就开 Allow LAN + 网关 IP,或 portproxy 转发 |
推荐排查顺序(能省两小时):
- 装了本地代理客户端(Clash / v2ray 类)就别用 mirrored,直接改 NAT
netsh winsock reset+netsh int ip reset+ 重启net stop hns/net start hns- 再怀疑 VMware / VPN / 杀毒软件的 NDIS 驱动
- 最后才去换源、调 apt 参数
十一、复盘
| 怀疑对象 | 处置 | 结论 |
|---|---|---|
| WSL 安装包损坏 | 独立 MSI 重装 | ✅ 确实是问题,已解决 |
| IPv6 路由缺失 | ForceIPv4 | ⚠️ 只是表象 |
| 清华源 / 并发连接 | 换阿里云源 | ⚠️ 只是表象 |
| VMware 虚拟网卡 | 禁用 → 卸载 → 重启 | ❌ 全部无效 |
| Windows 网络栈损坏 | winsock reset | ⚠️ 暂时有效,第二天复发 |
| 本地代理客户端(Clash Verge) | 切 NAT + 自动探测代理 | ✅ 真凶 |
四条教训:
-
表象会骗人。 IPv6、镜像源、并发数 —— 每一个都能自圆其说,但都不是根因。真正有效的判断方式是看哪些成功、哪些失败:索引能下、包不能下,这个组合指向底层网络栈而非应用层配置。
-
“修好了”不等于”修对了”。
winsock reset之后一切正常,我当场下了结论。区别在哪?那次启动代理还没开。一个修复恰好绕开了真正的触发条件,看起来就像是修好了 —— 这种假成功最危险。 -
复现规律比日志值钱。 最后破案靠的是用户一句话:“开关代理之后就会崩”。这条规律直接指向了因果关系,比任何错误码都准确。所以排查时要多问一句:什么情况下会出现?什么情况下不会?
-
分清楚命令在哪边跑。 全程最大的低级失误是把
curl ... | head -1、env | grep之类的 Linux 命令粘进了 PowerShell。head、env、grep在 Windows 上不存在 —— 给命令时务必标注「Windows 端」还是「WSL 端」。
附:一键修复脚本
fix-wsl.ps1(管理员运行),处理坑 1 的 MSI 损坏:
Set-ExecutionPolicy -Scope Process Bypass -Force& ".\fix-wsl.ps1" -MsiPath "C:\Users\w\Downloads\wsl.3.0.3.0.x64.msi"脚本依次执行:停进程 → 卸载损坏 Appx → 清 wsl.exe 别名 → 本地 MSI 安装 → 启用 Windows 功能 → 提示重启。
环境:Windows 11 Build 26200 / WSL 3.0.3 / Ubuntu 24.04 LTS
还没装上?看安装教程从零开始。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!














