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 -R 或
journalctl --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
|
可以看到启动时间大大减少,舒服了~