我正在运行一台生产用的 gentoo Linux 机器,最近出现了一种情况,我的同地办公场所的服务器挂起了,当我到达那里时,我注意到服务器似乎因内核崩溃而挂起了。我用硬重启重启了机器,但很失望地发现,我找不到任何证据来说明机器为什么挂起了。
当我进行硬重启时,消息本身会丢失吗?或者我可以在 syslog-ng 或 sysctl 中设置,至少保留错误日志,这样我就可以防止将来发生此类事故?顺便说一下,我正在运行 2.6.x 内核。
提前致谢。
答案1
要记录内核恐慌,使用 netconsole 比使用串行链接更容易;)
ubuntu wiki 上有一个关于它的有用条目可以用于其他 Linux 版本...例如,它帮助我使用 archlinux。
请注意,netconsole 也可以在启动时设置。
答案2
通常在这种情况下,我会设置一个远程串行控制台然后确保记录控制台上显示的所有内容。您可以通过 rs-232 电缆将机器的串行端口连接到另一台机器来执行此操作。现在这可能变得有点棘手,因为串行端口正在逐渐消失,但我认为大多数服务器仍然有它们。
然后在另一台机器上运行保护者并配置控制台日志记录。这提供了一种很好的方法,既可以记录控制台上的所有内容,又可以为系统提供备用登录路径。
如果您不想设置和管理另一个 Linux 机器,另一种选择是安装串行控制台服务器。Avocent、Cyclades 和 Raritan 等多家公司都生产这些机器,它们为 2-48 个串行端口提供网络接口。不过,这种做法当然比仅仅设置另一个 Linux 机器要昂贵得多。
答案3
您可以尝试将系统日志消息复制到另一台机器。可能不是全部,但只有警报和关键消息,并禁用它们的缓存。
答案4
我认为有三种可能的解决方案:
- 配置 kdump,当内核崩溃时创建转储(使用“magic sysrq c”强制崩溃)。如果您真的遇到内核崩溃,这可能是最好的解决方案。
- 配置串行控制台(现在可能是 netconsole)。很高兴看到著名的“遗言”。
- 配置一个外部系统日志服务器来接收内核消息。但是要注意消息是否立即发送(无延迟)。但是,如果网络堆栈崩溃,重要的消息可能会丢失。