我刚刚在 Intel Optane p4801x 驱动器上安装了 Ubuntu 24.04。我试图看看它从这个磁盘启动的速度有多快。确实,它启动得非常快。但该NetworkManager
设备经常无法启动。它已启用,但已死机,并且没有任何内容journalctl -b 0 -u NetworkManager.service
。即该设备在启动期间从未运行过。当我在启动后自己启动它时,它会正常运行:
systemctl start NetworkManager
日志显示networkd-dispatcher
已禁用以中断订购周期:
$ journalctl -b 0 | grep network
Oct 20 14:21:15 evergreens kernel: drop_monitor: Initializing network drop monitor service
Oct 20 14:21:15 evergreens systemd[1]: multi-user.target: Found ordering cycle on networkd-dispatcher.service/start
Oct 20 14:21:15 evergreens systemd[1]: multi-user.target: Job networkd-dispatcher.service/start deleted to break ordering cycle starting with multi-user.target/start
Oct 20 14:21:15 evergreens systemd[1]: Reached target network.target - Network.
Oct 20 14:21:15 evergreens systemd[1]: Reached target network-online.target - Network is Online.
...
我怀疑这也导致它NetworkManager
无法运行。
Systemd 在以下方面均未显示任何问题:
$ sudo systemd-analyze verify networkd-dispatcher.service
$ sudo systemd-analyze verify NetworkManager.service
$
但日志实际上显示了更多的订购周期,并且显示在verify multi-user.target
:
$ journalctl -b 0 | grep "break.*cycle"
...
$ sudo systemd-analyze verify multi-user.target
...
例如网络:
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo
multi-user.target: Found dependency on network.target/start
ubuntu-advantage.service: Found ordering cycle on network.target/start
ubuntu-advantage.service: Job network.target/start deleted to break ordering cycle starting with ubuntu-advantage.service/start
multi-user.target: Found ordering cycle on networkd-dispatcher.service/start
multi-user.target: Job networkd-dispatcher.service/start deleted to break ordering cycle starting with multi-user.target/start
multi-user.target: Found ordering cycle on NetworkManager.service/start
multi-user.target: Job NetworkManager.service/start deleted to break ordering cycle starting with multi-user.target/start
但是,sudo systemd-analyze verify multi-user.target
每次运行它时,它似乎都会打印不同的东西?这可能吗?有时它会打印更多,有时只打印 1 个单位。
我尝试绘制Unix Stackexchange 上multi-user.target
以下答案的依赖关系:
$ sudo systemd-analyze verify multi-user.target 2>&1 |\
perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |\
xargs --no-run-if-empty systemd-analyze dot | dot -Tsvg > cycle.svg
我没看到那里有循环。另外,图表很大,难以阅读。我尝试“放大”一些单位,但我也没有看到那里有循环:
$ echo multi-user.target networkd-dispatcher.service basic.target |\
xargs --no-run-if-empty systemd-analyze dot |\
dot -Tsvg > cycle.svg
由于systemd-analyze verify
几乎每次运行时都会打印不同的东西,所以这些图表可能不可信。
查看单个单元,我没有发现问题。NetworkManager
依赖关系似乎很好:
$ cat /usr/lib/systemd/system/NetworkManager.service
[Unit]
Description=Network Manager
Documentation=man:NetworkManager(8)
Wants=network.target
After=network-pre.target dbus.service
Before=network.target
BindsTo=dbus.service
...
[Install]
WantedBy=multi-user.target
Also=NetworkManager-dispatcher.service
从 Corsair 的常规 NVMe 驱动器启动时,我遇到了类似的问题。当 Corsair NVMe 的启动由于某个特定单元而异常缓慢时,我从未遇到过这种情况。(安装 HDD 磁盘/etc/fstab
- 它不再存在fstab
,因此不会减慢启动速度。)
也就是说,我认为这个问题只有在启动顺序很快时才会发生。虽然我不明白为什么会这样。为什么依赖关系图中的问题只会在快速启动时出现?
有人可以建议如何追踪订购周期吗?
每次打印不同的东西是怎么回事systemd-analyze verify multi-user.target
?这是一种真正已知的行为吗?它如何遍历依赖关系图,它是随机的吗?这是否与导致 systemd 在启动期间删除单元但相同单元稍后运行良好的原因有关?
我进一步研究了
systemd-analyze verify
一下。每次运行它时,它确实会打印出随机数量的排序周期!(Unix Exchange 上的相应问题。)结果发现自定义mount
单元以某种方式导致了这种情况。我刚刚注意到这个mount
单元出现在“找到排序周期”的每个块中,如下所示:当
mount
设备被禁用时,systemd-analyze verify
找不到排序周期并且启动运行正常。所以,启动失败一定是由这些随机出现的排序周期引起的,这些排序周期会
systemd
随机删除一些单元,包括NetworkManager
。我不明白为什么该设备会导致循环。特别是为什么它是随机的。它是一个简单的安装座,在类似以下操作后附加一堆备份 HDD 驱动器
multi-user.target
:因此,根据 reddit 的建议,我禁用了这个
mount
单元并添加并启用了一个automount
触发挂载的单元: