问题现象

WSL 启动时出现以下错误,镜像网络模式(Mirrored networking)回退为 None,但 WSL 本身并未退出:

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

英文环境下:

1
2
3
wsl: An internal error occurred.
Error code: CreateInstance/CreateVm/ConfigureNetworking/0x8007054f
wsl: Unable to configure networkingMode Mirrored) (network, falling back to networkingMode None.

重启几次可能恢复正常,也可能持续出现。

根因

这个问题在 GitHub microsoft/WSL#12351 中有讨论。根因是 wslservice.exe 访问 %TEMP%\<GUID>\swap.vhdx 时遇到共享冲突(STATUS_SHARING_VIOLATION),导致虚拟机管理器无法正确配置网络。

解决方案

方法一:重启 winnat(适用于偶发场景)

1
2
3
4
wsl --shutdown
net stop winnat
net start winnat
wsl

winnat(Windows NAT 驱动)偶尔会锁住 WSL 的资源文件,重启即可释放。

方法二:手动删除 swap.vhdx(方法一无效时)

如果重启 winnat 不管用,说明 swap.vhdx 被其他进程持久持有,需要手动清理:

  1. 保持 WSL 处于启动状态(不要 shutdown)
  2. 用 Everything(或其他搜索工具)定位 swap.vhdx
  3. 尝试删除 swap.vhdx 所在的父级 GUID 文件夹——此时会弹出占用提示,先不要点 “重试”
  4. 运行 wsl --shutdown
  5. 回到提示窗口,点击 “重试”——此时 WSL 服务已停止,文件可被删除
  6. 重新启动 WSL

删除后 WSL 会在下次启动时自动重建 swap.vhdx,无需手动干预。


这个问题在 WSL 长时间不活动后复现概率更高,推测是 Windows 某些后台操作持有了 swap 文件的句柄。目前微软尚未给出永久修复,以上两种方法为实测有效的临时方案。