journalctl可精准定位系统启动慢的根因:通过journalctl -b --no-pager -o short-iso查服务起止时间差,用-u 服务名分析失败与等待线索,结合.mount日志和-p err抓系统级错误,快速识别卡点服务、依赖超时或挂载故障。

系统启动慢,别急着重装或调参数——先让 journalctl 把“谁拖了后腿”说清楚。它不直接算总耗时,但能告诉你每个服务从开始到结束的精确时间点、卡在哪一步、报了什么错、等了谁。
看时间线:定位哪个服务真慢
运行这条命令,得到带毫秒级时间戳的本次启动日志:
journalctl -b --no-pager -o short-iso
你会看到类似:
2026-07-07 02:15:44.123456 hostname systemd[1]: Starting docker.service
2026-07-07 02:15:52.678901 hostname systemd[1]: Started docker.service.
→ 两行之间差约 8.5 秒,和 systemd-analyze blame 里 docker.service 的耗时基本一致。重点不是看单条,而是比对同一服务的 Starting 和 Started 时间差。
查失败与等待:找卡点根源
如果某个服务在 blame 里排前几,但不知道为什么慢,就单独查它:
journalctl -b -u docker.service --no-pager
重点关注这几类线索:
- 出现 Waiting for network-online.target → 实际被 NetworkManager-wait-online.service 拖住
- 出现 failed to mount /var/lib/docker 或 device not found → 挂载配置错误、磁盘未就绪或 UUID 失效
- 出现 level=error msg="failed to start daemon" → 配置语法错误、端口冲突、依赖路径不存在
再加一句交叉验证:
journalctl -b | grep -E "(docker|network-online.target|NetworkManager-wait-online)" --no-pager
能看出依赖链是否断裂、超时是否发生。
盯挂载单元:.mount 卡住很常见
很多“启动慢”其实源于 /etc/fstab 里一个失效的 NFS、写错的 UUID 或离线的 USB 盘。它们不会直接报错,而是卡在 activating 状态:
journalctl -b | grep "\.mount" --no-pager | grep -E "(activating|failed|timeout)"
例如看到:
Jul 07 02:14:22 hostname systemd[1]: dev-disk-by-uuid-xxxxx.device: Job dev-disk-by-uuid-xxxxx.device/start timed out
→ 就说明这个设备根本没响应,得去检查 fstab 或注释掉该行再测试。
抓系统级错误:别只盯着目标服务
有时服务本身没问题,但上游失败了。比如网络没通,导致所有需要 DNS 的服务集体超时;时间没同步,TLS 握手失败;根文件系统挂载失败,直接进 emergency mode。
这时用:
journalctl -b -p err
或更聚焦一点:
journalctl -b -p err --since "2 minutes ago"
把启动初期(尤其是前 30 秒)的 error 级别日志拎出来,往往第一处报错就是根因。











