我journald
在使用 Yocto 构建的定制嵌入式 Linux 系统上遇到了奇怪的问题。
在新准备并启动的系统上,日志工作正常:
- 使用
--list-boots
仅显示一个 (0) 条目 journalctl -n 5 -b
显示最后 5 条日志
但是,发出reboot
并重新登录后,当前启动变得不知何故变得不可见:
--list-boots
仍然只显示一个条目journalctl -b
结果是-- No entries --
- 检查
system.journal
文件journalctl --file
显示它包含的最后条目来自上次关机(即重启后没有任何内容),调用 justjournalctl
without时会显示相同的日志-b
调用后,上述所有问题都得到了解决--rotate
- 在目录中创建了新文件journal/
,-b
开始显示当前启动的日志,列出启动项按预期显示了另一个条目。在我看来,重启后文件似乎system.journal
无法journald
写入,而 roatating 以某种方式解决了这个问题。
有趣的是,这只发生在reboot
命令(“软”重启)中。关闭设备电源然后再打开(poweroff
先调用或不调用,甚至reboot
在系统再次启动后切断电源),系统再次启动后journald
工作正常,新启动被正确识别。
一些附加信息:
- 日志存储在 SD 卡上的单独分区中,该分区已安装
fstab
并具有/var/log
符号链接:
lrwxrwxrwx 1 root root 6 Mar 9 2018 /var/log -> /log
- 在重启/关机过程中卸载所述分区失败:(
[FAILED] Failed unmounting /log
我猜这对于解决问题至关重要,但不确定如何解决) - Yocto 版本是
scarthgap
,systemd255.4
- 系统完全在 SD 卡上运行,根分区位于已安装的 RW 中,并且不使用 initramfs
我将非常感激关于如何解决或进一步调试这个问题的建议,此外(即使与主要问题无关)关于如何解决提到的日志分区卸载失败的建议(也许有一种方法可以延迟卸载直到journald
停止之后?)。
谢谢
我来回答我自己的问题:
唯一需要修复的是将日志卷挂载点附加到服务的单元文件
RequiresMountsFor
中systemd-journal-flush
:在 yocto 中,需要修补
systemd
配方才能进行更改units/systemd-journal-flush.service
。经过此更改后,每次都能正确识别新启动,并且关机时不会再出现卸载失败。