如何使用journalctl获取内核启动日志?

如何使用journalctl获取内核启动日志?

我的板上有一个systemd/正在运行。journald该系统是通过以下方式构建的yoctosystemd版本是216。

我想要得到的是内核启动日志,可以通过journalctl -k.但据我所知,此选项的长版本是--dmesg,这使我认为这是从内核环形缓冲区中检索的。显然,如果系统运行几天,我可能无法获得此信息。我这里的理解正确吗?

现在的问题是,是否有一个选项可以journald在系统启动后立即转储此信息?如果没有,仅journalctl -k > dmesg.log作为启动过程的最后一步调用是否足够?

答案1

Systemd 将所有内容存储在其日志中。至少在我的笔记本电脑上,适度使用的情况下,它足够大,可以回到一年前的默认设置。

如果这还不够,你可以修改日志配置文件

然后,它只是关于使用journalctl -t kernel(与 类似-k,除了它还允许您查看以前的靴子并使用过滤器)

答案2

显然,如果系统运行几天,我可能无法获得此信息。我这里的理解正确吗?

是的。它取决于生成的日志信息量,但是最终引导信息将从内核环形缓冲区和 systemd 日志的开头滚动。它无法指导其他人的系统需要多长时间,但我的系统正常运行时间长达数百天,其引导日志数据早已从 systemd 日志的顶部滚出。这是拥有一个巨大的组合日志流的缺点之一,所有内容都扇入然后又扇出。

因此,请学习 FreeBSD 和 NetBSD 及其衍生产品。它们都具有在本地文件系统安装后启动时运行一次的服务,只需执行以下操作:

dmesg > /var/run/dmesg.boot

/var/run/dmesg.boot因此,即使内核日志已经滚动到实际日志之外,引导时的内核日志快照也是可用的。

您只需要编写一个具有相同功能的 systemd 服务即可。使用 shell 进行重定向,ExecStart=/bin/sh -c "exec dmesg > /run/dmesg.boot"或者使用类似的东西洛朗·贝尔科特redirfd或者nosh 工具集的fdredir ExecStart=/usr/local/bin/fdredir --write 1 /run/dmesg.boot dmesg

journalctl -k如果您想对 systemd 日志进行快照而不仅仅是内核日志,请进行替换,并将其作为一项Type=oneshot服务。要么让它成为人们想要的multi-user.target,要么让它成为DefaultDependencies=no人们想要的服务basic.target。请注意,不必在本地文件系统挂载后订购它(即local-fs.target)。该顺序对于 FreeBSD 和 OpenBSD 是必要的,因为/var/run它们可能是一个磁盘文件系统。在 systemd 操作系统上,/run有一个“API 文件系统”,它是在引导程序中在任何服务之前创建的。

(我个人更喜欢的方法是首先不要拥有巨大的中央日志流。专用服务提供内核日志源独自的并记录到私有日志目录。这需要更长到达最后一个引导信息从顶部滚动的位置。它还包含先前启动的启动日志。

然而,在 systemd 世界中设置这比编写/run/dmesg.boot.不过,在 daemontools 家庭世界中这很简单。这是使用诸如fifo-listenklog-read, 或者socklog。通过日志守护进程传输输出,该守护进程写入专用的、可靠的大小上限、自动轮换的日志目录,这是标准配置守护进程工具/运行/s6/开胃菜/罪犯托管服务。

答案3

内核日志被复制到 systemd 日志中。您不需要手动执行此操作。

描述

systemd-journald 是一个收集和存储日志数据的系统服务。它根据从各种来源接收的日志信息创建和维护结构化的索引日志:

· 内核日志消息, 通过 kmsg

相关内容