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 启动日志的知识体系
下面这张图,是我自己总结的启动日志知识框架。你可以把它当作本章的思维导图:
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 触发重启。换了驱动版本后,问题彻底解决。
经验总结:很多看似诡异的问题,其实启动日志里早就给出了线索。关键是你得知道怎么看、看什么。后面的章节,我会带你一步步深入分析启动日志中的安全信号。