抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

WSL2 Crashed

前一阵子我的 ArchLinux on WSL2 在更新 systemd 的时候挂掉了,报错:

灾难性故障 错误代码: Wsl/Service/E_UNEXPECTED [已退出进程,代码为 4294967295

(0xffffffff)] 现在可以使用 Ctrl+D 关闭此终端,或按 Enter 重新启动。

当时没找到解决办法,好在 Windows 的文件管理器还能正常打开 WSL 的目录,可以把个人数据都拷贝出来。虽然文件权限全都乱套了,至少数据没丢。刚才我又找到一篇博客遇到了同样的错误代码(0xffffffff)。

Edit: 似乎更新 WSL 就可以解决 issue

于是我又在 wsl 上安装了 Fedora,启动一切正常,就是有点慢。

Check Boot Process

The WSL2 boot process

Fedora 启动过程

WSL2 - Failed to (auto)start systemd units on boot | /sbin/init failed

通过 dmesg --color=always | less -Rjournalctl --dmesg 查看启动时的内核消息。下面是当时的一部分输出:

1
2
3
4
5
[ 9.538666] WSL (288) ERROR: CheckConnection: getaddrinfo() failed: -5
[ 9.822671] WSL (288) ERROR: CheckConnection: getaddrinfo() failed: -5
[ 9.832201] WSL (288) ERROR: CheckConnection: connect() failed: 101
[ 17.121411] WSL (2 - init-systemd(Fedora)) ERROR: WaitForBootProcess:3470: /sbin/init failed to start within 10000ms
[ 49.478608] hv_balloon: Max. dynamic memory size: 16252 MB

可以看到 /sbin/init 启动超时。Fedora 的 init 并非传统的 init 程序,而是一个指向 lib/systemd/systemd 的软链接。我们可以通过 systemd-analyze 看看哪些 service 启动时间最长:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ systemd-analyze
Startup finished in 1min 1.197s (userspace)
graphical.target reached after 1.176s in userspace.

$ systemd-analyze blame
1min 38ms NetworkManager-wait-online.service
306ms dev-sdd.device
289ms NetworkManager.service
246ms systemd-resolved.service
219ms user@1000.service
...

$ systemd-analyze plot > boot.svg
# 浏览器打开可以看到 gantt 图

NetworkManager-wait-online.service 竟然花了大概 1 分半来启动!触发 10 秒的超时后 user 相关的服务才开始启动。我在 %UserProfile%\.wslconfig 里设置了网络模式为 mirrored,所以不需要 NetworkManager 来管理网络。

禁用 NetworkManager

1
2
3
4
$ sudo systemctl disable NetworkManager
Removed '/etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service'.
Removed '/etc/systemd/system/multi-user.target.wants/NetworkManager.service'.
Removed '/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service'.

wsl --shutdown 重启后再次查看启动情况:

1
2
3
4
5
6
7
8
9
10
11
$ systemd-analyze
Startup finished in 1.033s (userspace)
graphical.target reached after 989ms in userspace.

$ systemd-analyze blame
348ms dev-sdd.device
273ms systemd-logind.service
265ms systemd-resolved.service
227ms user@1000.service

$ systemd-analyze plot > plot.svg

可以看到启动时间大大减少,舒服了~

评论