我正在将运行 Yocto 的设备从内核为 4.19 的 Pyro 更新为内核为 5.10 的 Gatesgarth;这迫使我将旧的 SysVinit 脚本重写为 SystemD 单元文件。
为了弄清楚哪个服务在何时启动,我去了dmesg | grep ...
,但遇到了这个问题:dmesg
没有显示启动期间可以看到的所有消息,例如,所有包含的字符串[ OK ]
都丢失了(图中是我所指的示例)。
在以前的版本中,没有这种语法,命令会逐行重新打印自内核初始化以来发生的所有事情。
这些行的名称是什么?我在哪里可以找到它们?我怀疑它们是 SystemD 的一些输出,这就是我在检查内核消息时它们没有显示的原因,但由于我以前从未使用过 SystemD,所以我的 google-fu 在这方面相当欠缺,man systemd 似乎也没什么用(我试着四处寻找。
任何提示都将不胜感激 :)
dmesg
它们只是自由格式的“控制台消息”,没有任何其他更具体的术语。init 系统通常在处理其 /etc/rc 脚本时将它们打印到 /dev/console,或者脚本本身写入那里。
不,这不是 dmesg 命令曾经做过的事情。它只打印内核日志缓冲区消息。
在您的屏幕截图中,一些消息被发送到内核日志缓冲区,内核将它们转发到控制台,而另一半则直接写入控制台。
写入控制台的消息永远不会进入内核日志,无论是 systemd、openrc、sysvinit 还是其他什么东西打印它们。
事实上,据我所记得,早期的 init 系统只会写入控制台 - systemd 也开始记录到 dmesg(并为此目的引入了 /dev/kmsg),而不是相反。
控制台消息实际上不会发送到任何日志 - 您找到的消息
journalctl
会再次单独发送到那里(或从 dmesg 复制),并且通常比控制台消息包含更多的元数据。添加_PID=1
将仅显示 systemd 发送的消息,而-u foo
将显示有关 foo.service 的所有消息。至于“哪个服务何时启动”,systemd 会跟踪每个服务 - 您已经找到了 journalctl,但每个服务都有大致相同的信息
systemctl status
,并且可以使用生成总体图表systemd-analyze plot > foo.svg
。启动过程不是线性的,因此不要试图根据时间猜测。默认情况下,Systemd 不保证除“在 basic.target 之后”之外的任何特定顺序,因此通常必须在 Wants=/After= 中明确指定依赖项。使用
systemctl list-dependencies [--after]
并查看 中的图表man bootup
。经过更多谷歌搜索后,我遇到了这个问题,它解决了我的问题:我只需要
dmesg | grep ...
改变journalctl -b | grep ...
。但是,我仍然无法找到这些消息是如何调用的,而且显然链接问题的评论者之一也找不到。