问题现象
WSL 启动时出现以下错误,镜像网络模式(Mirrored networking)回退为 None,但 WSL 本身并未退出:
1 | wsl: 出现了内部错误。 |
英文环境下:
1 | wsl: An internal error occurred. |
重启几次可能恢复正常,也可能持续出现。
根因
这个问题在 GitHub microsoft/WSL#12351 中有讨论。根因是 wslservice.exe 访问 %TEMP%\<GUID>\swap.vhdx 时遇到共享冲突(STATUS_SHARING_VIOLATION),导致虚拟机管理器无法正确配置网络。
解决方案
方法一:重启 winnat(适用于偶发场景)
1 | wsl --shutdown |
winnat(Windows NAT 驱动)偶尔会锁住 WSL 的资源文件,重启即可释放。
方法二:手动删除 swap.vhdx(方法一无效时)
如果重启 winnat 不管用,说明 swap.vhdx 被其他进程持久持有,需要手动清理:
- 保持 WSL 处于启动状态(不要 shutdown)
- 用 Everything(或其他搜索工具)定位
swap.vhdx - 尝试删除
swap.vhdx所在的父级 GUID 文件夹——此时会弹出占用提示,先不要点 “重试” - 运行
wsl --shutdown - 回到提示窗口,点击 “重试”——此时 WSL 服务已停止,文件可被删除
- 重新启动 WSL
删除后 WSL 会在下次启动时自动重建 swap.vhdx,无需手动干预。
这个问题在 WSL 长时间不活动后复现概率更高,推测是 Windows 某些后台操作持有了 swap 文件的句柄。目前微软尚未给出永久修复,以上两种方法为实测有效的临时方案。