1、启动日志概述:系统启动的“黑匣子”

各位好,我是老周。今天咱们聊聊系统启动日志。说白了,它就是系统从按下电源键到登录界面出现这段时间里,内核、驱动、服务挨个“打卡”的记录本。

你想想看,一台服务器每天要处理多少请求?如果它突然起不来了,或者启动后行为异常,你第一个想到的是什么?我个人习惯,永远是先翻启动日志。它就像飞机的黑匣子,记录了系统“出生”那一刻的所有关键事件。

1.1 什么是系统启动日志

启动日志,就是系统在引导阶段产生的全部内核消息和系统服务状态记录。它包含:

  • 内核初始化:CPU、内存、中断控制器等硬件探测
  • 驱动加载:哪些驱动成功加载,哪些失败了
  • 文件系统挂载:根分区、/boot、/var 等是否正常
  • 服务启动:sshd、crond、network 等服务的启停状态
  • 硬件错误:磁盘坏道、内存ECC错误、PCIe链路异常

嗯,这里要注意:启动日志不是普通的应用日志。它发生在用户空间还没完全就绪的时候,所以它的格式和查看方式都跟 /var/log/messages 不太一样。

1.2 为什么它对安全至关重要

我在项目中遇到过好几次这样的情况:客户说服务器被黑了,但查了半天应用日志,什么都没发现。最后我翻了启动日志,才发现内核模块被替换了,系统启动时加载了一个恶意的 .ko 文件。

启动日志对安全的价值,主要体现在这几个方面:

安全场景 启动日志能告诉你什么
Rootkit 检测 是否有未授权的内核模块被加载
启动项篡改 grub.cfg 或 initramfs 是否被修改
硬件级后门 PCIe设备、ACPI表是否有异常
文件系统破坏 关键分区是否只读挂载或挂载失败
服务劫持 是否有未知服务在启动阶段自动运行

核心观点:攻击者如果修改了系统启动链中的任何一环,启动日志就是第一个留下痕迹的地方。你错过了它,就等于放过了入侵者的第一串脚印。

1.3 日志的存储位置

不同发行版、不同 init 系统,启动日志的存放位置略有差异。我整理了一张表,方便你对照:

系统/工具 存储位置 说明
systemd (主流) /var/log/journal/ 二进制格式,用 journalctl 读取
传统 syslog /var/log/messages 纯文本,包含启动信息
内核环形缓冲区 内存中的 dmesg 缓冲区 重启后丢失,但可配置持久化
早期启动日志 /var/log/boot.log 部分发行版保留的文本日志

我的习惯:我会在每台新部署的服务器上,把 dmesg 持久化到文件。这样即使系统崩溃重启,之前的启动日志也不会丢。具体做法是修改 /etc/sysctl.conf,设置 kernel.dmesg_restrict=0,然后用 cron 定期保存。

1.4 查看方法

查看启动日志,最常用的就是 journalctl 和 dmesg。我分别说说。

1.4.1 使用 journalctl

如果你的系统用的是 systemd(现在绝大多数 Linux 发行版都是),那 journalctl 就是首选:

# 查看本次启动的日志
journalctl -b

# 查看上一次启动的日志(系统崩溃后排查用)
journalctl -b -1

# 只看内核消息
journalctl -k

# 按优先级过滤(0=emerg, 1=alert, 2=crit, 3=err)
journalctl -p err -b

我曾经帮一个客户排查服务器频繁重启的问题。他们看了半天应用日志,什么都没找到。我上去就敲了 journalctl -b -1 -p err,结果发现是内存 ECC 错误导致内核 panic。嗯,有时候问题就这么简单,只是你没找对地方。

1.4.2 使用 dmesg

dmesg 查看的是内核环形缓冲区的内容,主要包含硬件探测和驱动加载信息:

# 查看所有内核日志
dmesg

# 实时监控(类似 tail -f)
dmesg -w

# 只看错误和警告
dmesg --level=err,warn

# 清空缓冲区(谨慎使用)
dmesg -c

注意:dmesg -c 会清空缓冲区,清掉之后你就看不到之前的启动信息了。除非你明确知道自己在做什么,否则别用这个参数。

1.4.3 查看传统日志文件

有些老系统或者嵌入式环境没有 systemd,那就得用传统方式:

# 查看系统日志
tail -100 /var/log/messages

# 查看启动日志(如果存在)
cat /var/log/boot.log

# 结合 grep 过滤关键词
grep -i "error\|fail\|panic" /var/log/messages

1.5 启动日志的知识体系

下面这张图,是我自己总结的启动日志知识框架。你可以把它当作本章的思维导图:

启动日志知识体系 系统启动日志 什么是启动日志 为什么对安全重要 存储位置 查看方法 内核初始化 驱动加载 文件系统挂载 服务启动 硬件错误 Rootkit检测 启动项篡改 硬件后门 文件系统破坏 服务劫持 /var/log/journal/ /var/log/messages dmesg缓冲区 /var/log/boot.log journalctl dmesg 传统日志文件 启动日志是系统安全的第一道防线,别忽视它

1.6 一个真实案例

最后,我分享一个亲身经历。去年有个客户的数据库服务器,每天凌晨3点准时重启。运维团队查了应用日志、数据库日志、系统日志,什么都没发现。

我登录上去,先看了 journalctl --list-boots,发现最近7天有6次重启记录。然后我对比了每次重启前的最后几条日志:

# 查看每次重启前的最后10条日志
for boot in $(journalctl --list-boots | awk '{print $1}'); do
  echo "=== Boot $boot ==="
  journalctl -b $boot --no-pager | tail -10
done

结果发现,每次重启前都有一条 kernel: watchdog: BUG: soft lockup 的日志。进一步排查,是某个网卡驱动的软锁死导致 watchdog 触发重启。换了驱动版本后,问题彻底解决。

经验总结:很多看似诡异的问题,其实启动日志里早就给出了线索。关键是你得知道怎么看、看什么。后面的章节,我会带你一步步深入分析启动日志中的安全信号。