journalctl -b 是查看本次启动日志的首选命令,可完整记录从内核加载到服务就绪的全过程,结构化、时间戳准确、来源清晰,优于传统文本日志;配合 -p err、-u、--since 等选项可精准筛选关键信息。

journalctl -b 是查本次启动日志的首选命令
绝大多数现代 Linux(Ubuntu 22.04+、CentOS 7+、Debian 11+)都用 systemd,journalctl -b 就是查“这次开机从内核加载到服务就绪”的全部记录,不混入其他运行时日志。它结构化、时间戳准、来源清晰,比翻 /var/log/messages 可靠得多。
默认按时间正序输出,最新条目在最后;加 --no-pager 可避免卡在 less 里;加 -p err 只显示 err 及更严重级别(crit/alert/emerg),跳过大量 info 级干扰。
-
journalctl -b -p err:快速定位启动失败点,比如Failed to start NetworkManager.service -
journalctl -b -u sshd.service:聚焦某个服务的完整启动过程,含依赖服务状态 -
journalctl -b --since "5 minutes ago":若系统已运行一段时间,可限定时间窗缩小范围 - 别用
journalctl -b | grep failed:管道进grep会丢失优先级、服务名等元数据,且可能截断长行;应直接用journalctl -b -g "failed"(支持正则搜索)
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 没同步,早期日志时间可能偏移。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 若
dmesg输出为空或极短,说明内核可能根本没跑起来(如 initramfs 解包失败、根文件系统找不到),这时要回头查 GRUB 参数或 initrd 内容 -
dmesg缓冲区大小有限(通常 64K~1M),老消息会被覆盖;若需长期保留,得靠systemd-journald持久化或手动执行dmesg > /tmp/dmesg.boot抓快照 -
dmesg -w实时监控新出现的内核消息,适用于复现启动问题(例如插拔 USB 设备)
/var/log/boot.log 和 /var/log/messages 只作交叉验证,不可依赖
这些文本日志是传统 SysVinit 遗留机制,现在多数发行版已不主动写入它们——除非你手动启用了 rsyslog 转发或禁用了 journald。它们的价值在于交叉验证:比如 journalctl -b 显示某服务启动超时,而 /var/log/messages 里同一时间点有 SELinux denied 记录,那问题大概率出在策略限制而非服务本身。
-
cat /var/log/boot.log:仅部分发行版(如旧版 Debian)生成,内容简略,常为空 -
cat /var/log/messages或cat /var/log/syslog:RHEL/CentOS 和 Debian/Ubuntu 分别使用,需确认实际路径;若文件为空,先检查rsyslog是否启用:systemctl status rsyslog -
grep "system boot" /var/log/messages可粗略定位启动起始位置,但时间精度远不如journalctl -b
持久化 journal 日志才能跨重启回溯问题
默认情况下,journald 仅将日志保存在内存或 /run/log/journal/(重启后丢失)。若系统刚崩了进不去图形界面、SSH 也连不上,只有在单用户模式或 recovery shell 下,journalctl -b 才可能仍可用——前提是日志已落盘。
- 启用持久化:创建目录
mkdir -p /var/log/journal,再设置归属chown root:systemd-journal /var/log/journal - 确认配置生效:
cat /etc/systemd/journald.conf | grep "^Storage="应返回Storage=persistent;否则需修改并重启服务:systemctl restart systemd-journald - 检查 initramfs 是否包含 kmsg 支持:
lsinitrd /boot/initramfs-$(uname -r).img | grep -e "(kmsg|journal)";若无结果,RHEL/CentOS 需执行dracut --regenerate
真正麻烦的不是命令怎么敲,而是启动阶段日志天生分散在固件→内核→initramfs→systemd 四个域里,每个域的日志生命周期和存储机制都不同;没启用持久化时,/var/log/journal/ 目录下根本不会有任何东西,这时候再怎么 journalctl 都白搭。

















