视频加载失败

WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃

3335 字
17 分钟
WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃
  1. 1Windows 如何装 WSL 教程指南
  2. 2WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃本文

一次装 WSL,踩了六个坑、绕了五条弯路。真正的原因只有一个,但前面五个”疑似凶手”每一个都看起来很像。

本文记录完整的排查链路、每个阶段的判断依据,以及最后那条一击致命的命令。

Note

如果你只是想装 WSL 还没开始,先看安装教程。这篇是装不上 / 网络不通时的救命文档。

一、环境与目标#

项目值
系统Windows 11 Build 26200(25H2)
CPU13th 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,未装任何发行版

先做体检,确认硬件层面没问题:

PowerShell
(Get-ComputerInfo).HyperVisorPresent # True
Get-Service AppXSVC # Running
Get-AppxPackage MicrosoftCorporationII.WindowsSubsystemForLinux

虚拟化开着、AppX 部署服务正常、WSL 内核包已存在 —— 只差一个发行版。看起来是顺手的事。

二、坑 1:Wsl/CallMsi/REGDB_E_CLASSNOTREG#

现象#

PowerShell(管理员)
wsl --install
wsl: 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 环节。

Warning

别按任意键。 它的自动修复基本不会成功,只会让你多等 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)。

Note

国内直连 GitHub Release 经常中断(curl: (56) schannel: server closed abruptly)。用浏览器或下载工具通常更稳,下载完校验一下大小,351 MB 才完整。

管理员 PowerShell 里执行这套组合拳:

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 /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

msiexec 返回 0 或 3010 都算成功(3010 表示需要重启)。

三、坑 2:localhost 代理未镜像#

重启后装发行版,这次很顺利:

PowerShell
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:

.wslconfig
[wsl2]
networkingMode=mirrored
autoProxy=true

然后就是长达一个小时的噩梦开始。

四、坑 3:0x8007054f,WSL 直接退化成无网卡#

PowerShell
wsl ~
wsl: 出现了内部错误。
错误代码: CreateInstance/CreateVm/ConfigureNetworking/0x8007054f
wsl: 无法配置网络 (networkingMode Mirrored),回退到 networkingMode None。
Caution

注意最后那句:回退到 networkingMode None —— 这不是降级,是这台虚拟机连网卡都没有了。后面所有的”网络不通”都源于此。

误判一:以为是 VMware 的锅#

本机装了 VMware,有两张虚拟网卡 VMnet1 / VMnet8:

PowerShell
Get-NetAdapter | Where-Object { $_.InterfaceDescription -match 'TUN|TAP|VMware|Hyper-V' }

VMware 的虚拟交换机确实会跟 Hyper-V 抢网络配置,是 mirrored 失败的常见原因。先禁用网卡试:

PowerShell(管理员)
Get-NetAdapter -Name "VMware Network Adapter VMnet1","VMware Network Adapter VMnet8" | Disable-NetAdapter -Confirm:$false

仍然报 0x8007054f。

再把 VMware 整个卸载、重启:

PowerShell
Get-Service | Where-Object { $_.Name -match 'VMnet|VMWARE|VMAuthd' } # 空,确认清干净
Get-NetAdapter -IncludeHidden # VMnet 已消失

还是报 0x8007054f。

Important

到这里可以确认:VMware 是无辜的。但它背了最久的锅,因为它”看起来最像”。

五、坑 4:NAT 模式下的 IPv6 陷阱#

先回退到 NAT 保命:

.wslconfig
[wsl2]
networkingMode=nat
dnsTunneling=true

网络起来了:

WSL
$ ip -4 addr show eth0 | grep inet
inet 172.30.7.40/20 brd 172.30.15.255 scope global eth0
$ cat /etc/resolv.conf | grep nameserver
nameserver 10.255.255.254 # dnsTunneling 的隧道地址,正常

换清华源后 apt update,索引文件全部下载成功,但 deb 包集体失败:

WSL
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 即可:

WSL
echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

同理,curl 在 WSL 里没输出也是这个原因,加 -4 验证:

WSL
curl -4 -sI https://mirrors.tuna.tsinghua.edu.cn --max-time 10 | head -1

六、坑 5:IPv6 修好了还是连不上#

加了 ForceIPv4 之后,错误里的 IPv6 地址确实消失了,但换成了:

WSL
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 照样失败。代理软件无辜。

Note

顺带一个易忽略的点:只退出梯子软件、但 Windows 的”系统代理”开关还开着(ProxyEnable=1 指向 127.0.0.1:7897),会让 Windows 处于半断网状态,WSL 的 dnsTunneling 也会跟着遭殃。关梯子要连开关一起关。

七、阶段性突破:重置 Windows 网络栈#

查 0x8007054f 时确认了两件事:

  1. 该错误由 Hyper-V 虚拟交换机与主机物理网卡驱动初始化冲突 触发
  2. 社区验证有效的解法是重置 Windows 网络栈

有个低成本试法:先断网(关 Wi-Fi / 拔网线)→ wsl --shutdown → 启动 WSL → 再连网。断网状态下没有物理网卡可绑定,交换机能干净建起来。

但更彻底、一步到位的是这个(管理员 PowerShell,需重启):

PowerShell(管理员)
wsl --shutdown
net stop hns
net start hns
netsh winsock reset
netsh int ip reset
shutdown /r /t 0

重启后再进 WSL —— 报错消失了。

WSL
$ hostname -I
192.168.1.112 fd8e:133f:b5f7:0:bd12:a5a:7ee2:e51d ... # 与 Windows 同网段 + IPv6 都回来了
$ sudo apt update
Fetched 3227 kB in 1s (4548 kB/s) # 一次成功

镜像模式正常,代理自动同步,IPv6 可用,apt 跑满速。

当时以为故事到此结束。并没有 —— 第二天它又崩了,而且崩得一模一样。

八、反转:真凶其实是代理软件#

复现规律是用户自己发现的:

使用途中如果开了代理再关掉,就会弹窗提示重启 WSL,重启之后还是报 0x8007054f。

这条线索一下子把前面所有矛盾都解释了 —— 那天 winsock reset 之后之所以成功,是因为那次启动代理还没打开。

证据#

查进程确认本机跑的是 Clash Verge:

PowerShell
Get-Process | Where-Object { $_.ProcessName -match 'clash|mihomo|verge|sing|v2ray' }
3532 clash-verge D:\Program Files\Clash Verge\clash-verge.exe
27320 verge-mihomo D:\Program Files\Clash Verge\verge-mihomo.exe

再看网卡,WSL 的那张 vEthernet (WSL (Hyper-V firewall)) 不见了,多出来一对陌生组件:

PowerShell
Get-NetAdapter -IncludeHidden | Where-Object { $_.InterfaceDescription -match 'Hyper-V|WSL' }
Name InterfaceDescription Status
---- -------------------- ------
vEthernet (FSE HostVnic) Hyper-V Virtual Ethernet Container Adapter Up
vSwitch (FSE Switch) Hyper-V Virtual Switch Extension Adapter Up

代理软件运行时会改 Windows 代理状态、并往 Hyper-V 网络栈里插入自己的组件。 而镜像模式的网络初始化恰恰依赖这份状态 —— 开关一次,状态就不一致了,下次 WSL 起不来。

Warning

结论:只要 Windows 上装了本地代理客户端,镜像模式就不稳定。 这不是配置问题,是架构冲突。查资料时其实早就看到这句话 (“只要你在 Windows 开了本地代理,WSL Mirrored 网络就极易报这个错”),当时没当回事。

最终架构:NAT + 自动探测代理#

既然会频繁开关梯子,那就彻底不用镜像模式。NAT 不读 Windows 代理状态,开关梯子对它毫无影响。

代价是 NAT 下 127.0.0.1 够不到 Windows 的代理,得绕一下:

  1. Clash Verge 里打开「允许局域网连接 / Allow LAN」,让它监听 0.0.0.0:7897 而不只是 127.0.0.1
  2. WSL 里放一段自动探测脚本,梯子开着才走代理,关了自动降级:
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_proxy
EOF
source ~/.bashrc

脚本用 /dev/tcp 探测网关的 7897 是否可达:开着就 export,关着就 unset。 这样就不会出现”关了梯子导致 WSL 半瘫”的情况 —— 国内源本来也不需要代理。

Tip

不想开 Allow LAN 的话,Windows 侧改用端口转发也行(管理员 PowerShell):

Terminal window
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:

.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=8GB
processors=8
swap=4GB
[experimental]
# 空闲时把缓存内存还给 Windows
autoMemoryReclaim=gradual
# 阻止 ext4.vhdx 只增不减
sparseVhd=true

apt 源(/etc/apt/sources.list.d/ubuntu.sources):

/etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

梯子开着时验证(注意这里是网关 IP 而不是 127.0.0.1,NAT 下 WSL 是独立 IP):

WSL
$ ip route show default | awk '{print $3}'
172.30.0.1
$ env | grep -i proxy
http_proxy=http://172.30.0.1:7897
https_proxy=http://172.30.0.1:7897
no_proxy=localhost,127.0.0.1,192.168.*,10.*,...,mirrors.aliyun.com # 内网自动绕过
$ curl -sI https://github.com --max-time 10 | head -1
HTTP/1.1 200 Connection established

梯子关掉后重开一个终端:

WSL
[proxy] off (梯子没开,国内源直连)
$ curl -sI https://mirrors.aliyun.com --max-time 10 | head -1
HTTP/2 200 # 国内源照常能通,只是 GitHub 不通而已

十、速查表:错误码 → 处置#

错误含义处置
Wsl/CallMsi/REGDB_E_CLASSNOTREGStore 版升级时 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 转发
Tip

推荐排查顺序(能省两小时):

  1. 装了本地代理客户端(Clash / v2ray 类)就别用 mirrored,直接改 NAT
  2. netsh winsock reset + netsh int ip reset + 重启
  3. net stop hns / net start hns
  4. 再怀疑 VMware / VPN / 杀毒软件的 NDIS 驱动
  5. 最后才去换源、调 apt 参数

十一、复盘#

怀疑对象处置结论
WSL 安装包损坏独立 MSI 重装✅ 确实是问题,已解决
IPv6 路由缺失ForceIPv4⚠️ 只是表象
清华源 / 并发连接换阿里云源⚠️ 只是表象
VMware 虚拟网卡禁用 → 卸载 → 重启❌ 全部无效
Windows 网络栈损坏winsock reset⚠️ 暂时有效,第二天复发
本地代理客户端(Clash Verge)切 NAT + 自动探测代理✅ 真凶

四条教训:

  1. 表象会骗人。 IPv6、镜像源、并发数 —— 每一个都能自圆其说,但都不是根因。真正有效的判断方式是看哪些成功、哪些失败:索引能下、包不能下,这个组合指向底层网络栈而非应用层配置。

  2. “修好了”不等于”修对了”。 winsock reset 之后一切正常,我当场下了结论。区别在哪?那次启动代理还没开。一个修复恰好绕开了真正的触发条件,看起来就像是修好了 —— 这种假成功最危险。

  3. 复现规律比日志值钱。 最后破案靠的是用户一句话:“开关代理之后就会崩”。这条规律直接指向了因果关系,比任何错误码都准确。所以排查时要多问一句:什么情况下会出现?什么情况下不会?

  4. 分清楚命令在哪边跑。 全程最大的低级失误是把 curl ... | head -1、env | grep 之类的 Linux 命令粘进了 PowerShell。head、env、grep 在 Windows 上不存在 —— 给命令时务必标注「Windows 端」还是「WSL 端」。

附:一键修复脚本#

fix-wsl.ps1(管理员运行),处理坑 1 的 MSI 损坏:

PowerShell(管理员)
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

还没装上?看安装教程从零开始。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
WSL 3.0.3 安装排障实录:从 MSI 损坏到网络崩溃
https://moyuspace.icu/posts/wsl-troubleshooting/
作者
沫雨
发布于
2026-10-17
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
沫雨
在雨与潮汐之间,保持温柔,也保持自己。银灰蓝与淡紫的目光,装着海的安静与不被定义的自由。
公告
欢迎来到沫雨的小窝!希望在这里能找到对你有用的东西。
分类
标签
最新动态
站点统计
文章
4
分类
2
标签
11
总字数
17,132
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录