调试锁定 - systemd 丢失了我的日志

Lek*_*eyn 8 logs debugging systemd systemd-journald

自从我在 Arch Linux 上“升级”到 systemd 以来,当发生意外锁定时,我不断丢失日志。一个月前我遇到了同样的日志丢失问题,然后又遇到了这个问题。还有其他独立的确认

情况:

  • 在用 Java 和与网络相关的实用程序做一些事情时,我看到 KDE(时钟)被冻结了。CPU风扇变得嘈杂并且热量上升。鼠标指针仍然可以移动。
  • 我试图从另一台机器 ssh (由于“没有到主机的路由”而失败)
  • 我等了几分钟,也许 NMI 看门狗可以杀死有问题的任务。没有骰子。
  • Ctrl+ Alt+F1没有任何工作,即使经过SysRq+R
  • 由于上述步骤不起作用,我决定发出 SysRq 序列 REI。之后E,屏幕变黑,但也没有控制台。甚至在SysRq+K
  • 所以,这个会话似乎丢失了,唯一可以做的就是收集调试信息。查看Wikipedia,我决定按SysRq+ d(显示锁定)等。
  • SysRq+ 后,S我等了一秒钟,然后用SysRq+重新启动B
  • 重新启动并登录控制台后,我没有看到任何崩溃的痕迹。最近记录的条目来自使用 Wireshark,但仍有 45 分钟的间隔。

(顺便说一句,我正在运行 Linux v3.8-rc5-218-ga56e160)

那么,如何确保在由于锁定而异常重启时保留我的日志?

Lek*_*eyn 5

所以我在#systemd IRC 频道上询问,结果表明 journald(systemd 的日志守护进程)根本不会定期将日志刷新到磁盘。这意味着您的日志随时都处于危险之中。

发送SIGUSR2journald导致日志写入磁盘,但如果多次执行此操作,将创建许多文件。(该选项实际上被描述为“日志轮换”)。

最后,我决定采用另一个建议:使用专用的 syslog 守护进程来收集内核日志。由于有人建议使用 rsyslog(而且我已经使用过它),因此我进一步探索了该选项。我在Arch Wiki 中写了一些关于使用 rsyslog 的更多细节。

这个想法是运行 rsyslog,只从内核设施收集数据。由于 rsyslog 读取/proc/kmsg(仅允许单个读取器)和 journald 读取/dev/kmsg(允许多个读取器),守护进程不会丢失日志(对我来说非常重要!)。配置 rsyslog 以将内核消息写入文件并确保该文件被轮换以防止占用您的磁盘空间。

这个解决方案并不完美:

  • 其他日志(例如,来自 NetworkManager)丢失。这可以通过将更多日志从 syslog 转发到 journald 来解决(这意味着重复!)
  • 日志重复。内核消息被写入两个文件。这不是问题,通常日志的数量很少,您宁愿拥有更多的日志副本也不愿没有。您还可以使用快速工具,例如grep单个日志文件或更慢但更高级的journalctl.

有一个TODO 项可以更频繁地刷新日志,但这仍然不够可靠:

日志:不时发送标记消息,然后立即与 fdatasync() 同步,以保证每小时同步。

现在,希望 systemd/journald 可以选择将日志写入磁盘,但同时我们可以结合工具来实现目标。