journalctl -b 是查本次启动日志的首选命令,适用于 ubuntu 22.04+、centos 7+、debian 11+ 等现代 systemd 系统,可完整记录从内核加载到服务就绪全过程,结构化、时间准、来源清,优于传统文本日志。

journalctl -b 是查本次启动日志的首选命令
绝大多数现代 Linux(Ubuntu 22.04+、CentOS 7+、Debian 11+)用 systemd,journalctl -b 就是查“这次开机从内核加载到服务就绪”的全部记录,不混入其他运行时日志。它结构化、时间准、来源清,比翻 /var/log/ 下文本文件靠谱得多。
-
journalctl -b默认按时间正序输出,最新条目在最后;加--no-pager可避免卡在less里 - 想快速扫错误?用
journalctl -b -p err——只显示err及更严重级别(crit/alert/emerg),跳过大量info级干扰 - 别用
journalctl -b | grep failed:管道进grep会丢失优先级、服务名等元数据,且可能截断长行;journalctl自带过滤,该用-p或-u - 系统刚崩了进不去图形界面、SSH 也连不上?只要还能进单用户模式或 recovery shell,
journalctl -b通常仍可用——journald 默认内存缓存,若启用了持久化,日志已落盘到/var/log/journal/
dmesg 更适合查硬件/驱动类早期问题
dmesg 输出的是内核环形缓冲区原始内容,从 GRUB 把控制权交给 kernel 的第一行开始,包括 CPU 检测、内存映射、PCIe 设备枚举、驱动 probe 成败——这些信息 journalctl -b 会收录,但可能被格式化、截断,甚至因 journald 启动晚而漏掉 early boot 阶段。
-
dmesg -l err,warn比dmesg | grep -i "error"更可靠:前者按内核定义的 log level 过滤,后者可能匹配到正常字符串(比如某模块名含 “error”) -
dmesg -T加人类可读时间戳,但注意:该时间基于系统当前时钟,若 RTC 不准或 NTP 没同步,早期日志时间可能偏移;诊断冷启动失败时,优先用默认无-T的输出 - 如果
dmesg输出为空或极短,说明内核可能根本没跑起来(如 initramfs 解包失败、根文件系统找不到),这时要回头查 GRUB 参数或 initrd 内容,而不是继续翻日志 -
dmesg缓冲区大小有限(通常 64K~1M),老消息会被覆盖;若需长期保留,得靠systemd-journald持久化或手动执行dmesg > /tmp/dmesg.boot抓快照
/var/log/ 下文本日志只作交叉验证
这些文件是传统 SysVinit 遗留机制,现在多数发行版已不主动写入它们——除非你手动启用了 rsyslog 转发或禁用了 journald。它们的价值在于交叉验证:比如 journalctl -b 显示某服务启动超时,而 /var/log/messages 里对应时间点有没有更底层的磁盘 I/O 错误或 OOM 记录。
-
/var/log/boot.log:只含 boot 阶段,不包含运行时事件;可用less /var/log/boot.log查看上次启动快照 -
/var/log/kern.log:内核消息(含硬件、驱动相关),部分发行版会持续写入,但内容不如dmesg实时和完整 -
/var/log/syslog(Debian/Ubuntu)或/var/log/messages(RHEL/CentOS):通用系统日志,但服务可能只向 journald 发送日志而不写磁盘,所以内容常不全 - 直接
tail -n 50 /var/log/syslog或grep "Started" /var/log/messages可辅助确认服务是否真被 systemd 启动成功
查上一次或更早启动日志的注意事项
journalctl --list-boots 能列出所有归档的启动会话,但前提是 journald 启用了持久化存储。部分精简版系统(如某些容器或 WSL)可能默认禁用,此时 journalctl --list-boots 会返回空。
- 查上一次启动:用
journalctl -b -1;-2、-3同理 - 若
journalctl --list-boots无输出,先运行sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald启用持久化 -
journalctl -b -1 -p err是回溯前一次崩溃最常用的组合,比翻/var/log/文件更快、更聚焦 - 注意:
journalctl -b默认只显示当前启动;-b不带数字参数时,等价于-b 0,不是“最近一次”而是“最新一次”
journalctl -b 还是 dmesg ——前者管“服务启动流程”,后者管“内核能不能看见硬盘、网卡、GPU”。这两个命令的输出时间线、粒度、可靠性都不同,混着看才能闭环。











