我在这个问题的意思是:有没有办法转储有序的列表(如pstree进程),看看systemd是如何执行提供的单位,即树的依赖关系解决和作业排队执行? 我知道你可以通过分析系统状态数据来做到这一点,但有没有一种快速的方法来看到这样一棵树? 这对失败调查将有很大的帮助(例如,如果你看到启动过程被困在某个单元上,那么你将能够find更深入调查的大概位置。
systemd-analyze
是你的朋友。 例如systemd-analyze critical-chain
守护进程的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
systemd-analyze dot | dot -Tpng -o stuff.png
与点工具,你可以输出为ps和svg文件。
以上所有工具都内置在systemd-analyze工具中,默认情况下systemlinux中至less有这些工具。 我认为也有一些第三方项目也在处理它。
可能还没有完全回答你的问题,但尝试使用--fuzz
选项
systemd-analyze critical-chain --fuzz 1h
请注意,您也可以指定单位来查看他们的关键链 ,所以您不仅限于multi-user.target
systemd-analyze critical-chain network.target local-fs.target
希望这可以帮助
不确定我是否正确地理解了这个问题,但是下面的命令提供了可视化树:
sudo systemctl status
并且 :
sudo systemctl list-dependencies
希望这可以帮助 :)
另外,build立一个systemctl符号链接文件夹的树可能对其他目的很有用:
tree /etc/systemd/system
实际上,找出使我的系统启动变慢的旧的/有问题的单元非常有用,以后使用systemctl disable
命令禁用它们。
编辑
这就是说,我真的同意OP,这个基本function应该通过命令行工具,而不是一个graphics工具…如果你不能启动X? 那你怎么处理你的svg文件呢?
其实有一个办法。 如果您不能使用scp
(ssh工具)在另一台计算机上获取您的文件, fbi
可能实际上帮助您:)
sudo systemd-analyze plot > /home/user/startup.svg fbi /home/user/startup.svg
工作在我的TTYs。 只需用箭头在图片内部导航即可。 有放大选项,列出做fbi -h
。
我再次希望这有助于。 它可以在Archlinux和Ubuntu的仓库中使用。
编辑2:
fbi
不能通过ssh工作。 你可以像这个ssh -Y user@server
一样进行X转发,但是你需要在你的远程服务器上运行一个X服务器。
这里最好的select是使用sshfs
。 它在用户空间中工作得很好,例如用鹦鹉螺。 有一个小configuration要做,请参阅:
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