如何查找 Linux 重启原因?

探究 Linux 系统意外重启的根源

我们经常遇到 Linux 系统在未计划的情况下或因不明原因而重新启动的情况。 找出并解决根本原因对于防止此类问题再次发生并避免计划外停机至关重要。

有多种方法可以帮助我们确定触发重启的原因。 本文将深入探讨这些方法,并阐述如何利用 Linux 系统中可用的工具和日志来解决此类问题。

检查系统重启时间

您可以使用 wholast 命令来检查系统的重启时间,从而为调查提供初步线索。

$ who -b
system boot 2021-02-13 20:51
$ last -x | head | tac
abhishek pts/0 192.168.1.16 Sat Feb 13 19:53 - 19:55 (00:02)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:54 (00:58)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:04 (00:08)
abhishek pts/0 192.168.1.16 Sat Feb 13 19:56 - 20:04 (00:07)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:54 (00:49)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:51 (00:46)
abhishek pts/0 192.168.1.16 Sat Feb 13 20:04 - 20:50 (00:46)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:03)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:02)
abhishek pts/0 192.168.1.16 Sat Feb 13 20:51 still logged in

深入系统消息日志

您可以进一步将要诊断的重启事件与系统消息关联起来。系统日志中往往包含着关于系统行为的关键信息。

对于 CentOS/RHEL 系统,您可以在 /var/log/messages 中找到相关日志,而对于 Ubuntu/Debian 系统,日志通常记录在 /var/log/syslog 中。 您可以使用 tail 命令或您最喜欢的文本编辑器来过滤和查找特定的数据。

以下日志片段显示了由管理员或 root 用户启动的关机/重启事件。 请注意,日志消息的具体格式可能会因操作系统类型和重启/关机的触发方式而有所不同。 尽管系统日志并非总是能直接给出明确的根本原因,但它们仍然是您查找线索的重要资源。

Feb 13 19:56:20 centos7vm chronyd[637]: Source 72.30.35.89 replaced with 142.147.92.5
Feb 13 20:00:40 centos7vm chronyd[637]: Selected source 162.159.200.123
Feb 13 20:01:01 centos7vm systemd: Created slice User Slice of root.
Feb 13 20:01:01 centos7vm systemd: Started Session 2 of user root.
Feb 13 20:04:09 centos7vm systemd-logind: System is powering down.
Feb 13 20:04:09 centos7vm systemd: Closed LVM2 poll daemon socket.
Feb 13 20:04:09 centos7vm systemd: Stopped target Multi-User System.

以下命令可以帮助您过滤系统日志,提取与重启相关的关键信息:

sudo grep -iv ': starting|kernel: .*: Power Button|watching system buttons|Stopped Cleaning Up|Started Crash recovery kernel' 
 /var/log/messages /var/log/syslog /var/log/apcupsd* 
 | grep -iw 'recover[a-z]*|power[a-z]*|shut[a-z ]*down|rsyslogd|ups'

请注意,并非所有捕获的事件都能够直接指出根本原因。 您应该始终关注可能预示系统关机或崩溃的警告和错误信号。

检查 auditd 日志

对于配置了 auditd 的系统,ausearch 工具可以帮助您检查不同的系统事件。 使用以下命令可以查看审计日志中最近的两条启动和关机记录:

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4

该命令将显示最近两次的关机或重启事件。 正常的系统行为应该显示 SYSTEM_SHUTDOWN 之后紧接着 SYSTEM_BOOT。 然而,如果出现连续的 SYSTEM_BOOT 记录,或者仅有一条 SYSTEM_BOOT 记录,则可能表明系统没有正常关机。 正常的输出应类似于以下形式:

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4
----
type=SYSTEM_SHUTDOWN msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'

下面的输出示例显示了两个连续的 SYSTEM_BOOT 消息,尽管需要结合系统日志进行分析,但它可能表明存在非正常关机的情况:

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'

分析 systemd 日志

为了在重启后保留系统日志,您需要配置持久化的 systemd-journal。 默认情况下,日志不会在重启后保留。 您可以通过修改 /etc/systemd/journald.conf 文件或使用以下命令创建日志目录来启用此功能:

$ sudo mkdir /var/log/journal
$ sudo systemd-tmpfiles --create --prefix /var/log/journal 2>/dev/null
$ sudo systemctl -s SIGUSR1 kill systemd-journald

完成上述配置后,您可以选择重启系统以便在日志中捕获多个重启条目。不过,这不是必须的步骤。

使用以下命令可以列出日志中记录的启动记录:

$ journalctl --list-boots

以下是一个服务器上的输出示例:

$ journalctl --list-boots
-15 8a7c8034da804ebb9cb063a7553ed0bf Wed 2020-11-18 23:09:05 IST—Wed 2020-11-18 23:17:10 IST
-14 7bbb9542778a4057a91b9d22fcf91735 Wed 2020-11-18 23:17:22 IST—Wed 2020-11-18 23:20:08 IST
-13 f2ee8a61bf4c4f67a12e012855d8b1c3 Wed 2020-11-18 23:20:17 IST—Wed 2020-11-18 23:23:01 IST
-12 1277d19a959f4c33ba944a68c5874d2a Fri 2020-12-11 10:32:44 IST—Fri 2020-12-11 10:43:39 IST
-11 eb4ff97f112445888a5946d1155de1b8 Fri 2020-12-11 10:43:55 IST—Fri 2020-12-11 10:48:18 IST
-10 bf46eff3f9a344d2b28a03ffbf7fff32 Fri 2020-12-11 19:04:30 IST—Fri 2020-12-11 19:31:01 IST
 -9 2acf08368667423c89086579f98efd82 Tue 2020-12-15 17:36:52 IST—Tue 2020-12-15 19:13:10 IST
 -8 b826f223a67d454b94d4413678870f08 Sat 2020-12-19 00:31:54 IST—Sat 2020-12-19 00:44:52 IST
 -7 011e1b29339041b0ae48bbb93fce792f Wed 2020-12-23 23:01:15 IST—Wed 2020-12-23 23:02:44 IST
 -6 f41f5880572e4394938c6dcb4a8b683c Mon 2020-12-28 16:54:11 IST—Mon 2020-12-28 22:54:22 IST
 -5 a2e638dc292a4db2b0a50dd442129c28 Tue 2020-12-29 17:02:16 IST—Tue 2020-12-29 19:39:38 IST
 -4 f6c738df872a48d48daee1962727cca5 Wed 2020-12-30 19:09:30 IST—Wed 2020-12-30 19:20:23 IST
 -3 c876e60ea371460b94e247b40270b18f Thu 2020-12-31 14:36:07 IST—Thu 2020-12-31 15:45:36 IST
 -2 a23c70804ec243f7868c18737f4b7e55 Sat 2021-02-13 20:09:30 IST—Sat 2021-02-13 20:10:44 IST
 -1 94b604a6bf75462dac8c4a4576fdc863 Sat 2021-02-13 20:10:59 IST—Sat 2021-02-13 20:23:18 IST
  0 3ff7e29fa0a34878b7574b7d4d3ccfb5 Sat 2021-02-13 20:24:57 IST—Sat 2021-02-13 21:13:15 IST

如您所见,输出信息列出了系统的多个启动记录。 要进一步分析特定的重启事件,请使用以下命令:

$ journalctl -b {num} -n

其中 {num}journalctl --list-boots 命令输出的第一列中的索引值。

$ journalctl -b -1 -n
-- Logs begin at Wed 2020-11-18 23:09:05 IST, end at Sat 2021-02-13 21:13:39 IST. --
Feb 13 20:23:18 ubuntumate20vm systemd[1]: lvm2-monitor.service: Succeeded.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Stopped Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Shutdown.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Final Step.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: systemd-poweroff.service: Succeeded.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Finished Power-Off.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Power-Off.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Shutting down.
Feb 13 20:23:18 ubuntumate20vm systemd-shutdown[1]: Syncing filesystems and block devices.
Feb 13 20:23:18 ubuntumate20vm systemd-journald[304]: Journal stopped

您可以仔细阅读上述日志输出中的消息,并尝试识别任何异常情况。

结论

仅通过一个命令或一个日志文件通常无法直接找出 Linux 系统重启的根本原因。 因此,掌握用于捕获系统相关事件的命令和日志的知识总是很有益处的,它可以大大缩短您查找问题根源的时间。

以上方法提供了一个故障排除的起点。 将这些工具和日志结合使用,您就可以更有把握地了解系统发生了什么以及系统是如何重启的。

接下来,我们将探讨一些轻量级的 Linux 监控软件。