我的问题的意思是:有没有办法转储有序列表(就像 pstree 对进程所做的那样)来查看 systemd 如何执行提供的单元集,即在解决依赖关系并将作业排队等待执行之后的树?我知道您可以通过分析 systemd 状态数据来做到这一点,但是有没有一种快速的方法可以查看这样的树?它将对故障调查大有帮助(例如,如果您发现启动过程卡在某个单元上,您将能够精确定位大致位置以进行更深入的调查。
答案1
systemd-analyze
是你的朋友。例如systemd-analyze critical-chain
输出守护进程的阻塞树。例如我的:
graphical.target @20.211s
└─multi-user.target @20.211s
└─nginx.service @19.348s +862ms
└─network.target @19.347s
└─NetworkManager.service @10.315s +9.031s
└─basic.target @10.312s
└─timers.target @10.311s
└─systemd-tmpfiles-clean.timer @10.311s
└─sysinit.target @10.295s
└─systemd-update-utmp.service @10.167s +127ms
└─systemd-tmpfiles-setup.service @10.124s +41ms
└─local-fs.target @10.097s
└─home-entd-Downloads.mount @10.093s +2ms
└─home.mount @9.326s +672ms
└─[email protected] @8.472s +696ms
└─dev-sda6.device @8.471s
示例中的 NetworkManager 基本上控制整个启动过程。
如果您想要更详细的视图,您可以在 svg 文件中呈现整个执行链。
systemd-analyze plot > something.svg
将整个链(120 多个模块)作为进度条输出到高分辨率 svg 文件,显示状态、被阻止的情况和其他问题。
最后,您有systemd-analyze dot
一个输出点文件的工具,它可以输出整个层次结构:
systemd-analyze dot | dot -Tpng -o stuff.png
使用点工具,您也可以将其输出为 ps 和 svg 文件。
以上所有工具都内置于 systemd-analyze 工具中,该工具至少在 archlinux 中默认随 systemd 提供。我认为也有一些第三方项目在处理它。
答案2
不确定我是否正确理解了这个问题,但是可以使用以下命令实现树形可视化:
sudo systemctl status
并且 :
sudo systemctl list-dependencies
希望这可以帮助 :)
此外,构建 systemctl 符号链接文件夹树可能还用于其他目的:
tree /etc/systemd/system
找出那些减慢系统启动速度的旧的/有缺陷的单元,然后使用命令禁用它们实际上非常有用systemctl disable
。
编辑
话虽如此,我非常同意 OP 的观点,即这个基本功能应该通过命令行工具而不是图形工具来提供...如果你无法启动 X 怎么办?那么你如何处理你的 svg 文件?
其实,有一种方法。如果你不能使用scp
(ssh 工具)在另一台计算机上获取文件,这种方法fbi
实际上可能会对你有所帮助 :)
sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg
在我的 TTY 中工作。只需使用箭头在图片内导航即可。有缩放选项,列出要执行的操作fbi -h
。
再次希望这会有所帮助。它在 Archlinux 和 Ubuntu 存储库中可用。
编辑2:
fbi
无法通过 ssh 工作。您可以像这样进行 X 转发ssh -Y user@server
,但您需要在远程服务器上运行 X 服务器。
这里最好的选择是使用sshfs
。它在用户空间中效果很好,例如使用 nautilus。需要进行一些配置,请参阅:
sudo vim /etc/fuse.conf #type a, uncomment the user_allow_other line and ESC :wq
sudo mkdir /mnt/yourmountingdir
sudo chown user:user /mnt/yourmountingdir
sshfs [email protected]:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount
答案3
可能仍然不能完全回答你的问题,但尝试--fuzz
选择
systemd-analyze critical-chain --fuzz 1h
注意您还可以指定单位s看到他们的关键链,所以你不仅限于多用户目标
systemd-analyze critical-chain network.target local-fs.target
希望这可以帮助