Ubuntu 24.04 启动慢故障排查技术分析

一、事件概述

1. 事件背景

Ubuntu 24.04 系统在启动过程中出现异常延迟,从开机到进入用户登录界面耗时长达 3 分钟,远超正常启动时间(通常为 10-30 秒)。

2. 影响范围

A. 影响功能

  • 系统启动延迟
  • 用户登录等待时间过长
  • 用户体验严重下降

B. 影响程度

中等性能问题,不影响系统功能但影响使用效率

3. 严重程度

P2 级性能问题(用户体验受损)

二、问题分析

1. 直接原因

系统启动过程中存在某个或某些服务或组件耗时过长,导致整体启动延迟。

2. 可能原因分类

A. 硬件问题

  • 磁盘 I/O 性能下降
  • 磁盘错误或坏道
  • 硬件初始化超时

B. 软件问题

  • systemd 服务启动超时
  • 网络服务等待连接
  • 内核模块加载失败
  • 文件系统检查耗时

C. 配置问题

  • 服务配置错误
  • 依赖关系配置不当
  • 启动目标级别设置错误

3. 诊断工具分类

Linux 系统提供多层次日志和诊断工具,从内核到应用层面全覆盖。

graph TD
    A[启动故障] --> B[内核层面诊断]
    A --> C[systemd 诊断]
    A --> D[服务分析]

    B --> B1[dmesg]
    B --> B2[内核参数]
    B --> B3[硬件检查]

    C --> C1[journalctl]
    C --> C2[systemctl]
    C --> C3[启动分析]

    D --> D1[systemd-analyze]
    D --> D2[服务日志]
    D --> D3[依赖关系]

mermaid

三、诊断工具详解

1. 内核层面诊断

A. dmesg 命令

dmesg 用于显示和控制内核环形缓冲区的消息,包含内核启动过程中的所有输出信息。

基本用法:

# 查看完整内核日志
dmesg | less

# 搜索错误信息
dmesg | grep -i error

# 搜索失败信息
dmesg | grep -i fail

# 查看特定时间段的日志
dmesg -T | grep -i error

B. 诊断重点

  • 磁盘 I/O 错误:I/O error、ATA、SATA 相关错误
  • 网络初始化:eth0、wlan0 等网络接口初始化耗时
  • 硬件超时:timeout、waiting for 相关信息
  • 文件系统:filesystem、mount、ext4 等文件系统相关问题

2. systemd 诊断

A. journalctl 命令

journalctl 是 systemd 日志系统的查询工具,可以查看系统和服务日志。

基本用法:

# 查看上次启动的日志
journalctl -xb

# 查看当前启动的日志
journalctl -b

# 搜索失败的服务
journalctl -b | grep -i failed

# 搜索错误信息
journalctl -b | grep -i error

# 查看特定服务的日志
journalctl -u nginx.service

# 查看带时间戳的日志
journalctl -b --since "10 min ago"

B. systemctl 命令

systemctl 是 systemd 的控制命令,用于管理系统和服务。

基本用法:

# 查看启动失败的服务
systemctl --failed

# 查看服务状态
systemctl status <service-name>

# 查看所有服务状态
systemctl list-units --type=service --all

# 查看服务依赖关系
systemctl list-dependencies

3. 启动时间分析

A. systemd-analyze 命令

systemd-analyze 是专门用于分析系统启动时间的工具。

基本用法:

# 查看总启动时间
systemd-analyze

# 按启动耗时排序显示所有服务
systemd-analyze blame

# 显示关键启动链
systemd-analyze critical-chain

# 生成启动时间图表
systemd-analyze plot > boot.svg

# 显示关键链及耗时
systemd-analyze critical-chain <service-name>

B. 输出解读

  • systemd-analyze time:显示总的启动时间
  • systemd-analyze blame:列出所有服务及其启动耗时,按耗时从长到短排序
  • systemd-analyze critical-chain:显示启动过程中的关键路径,找出瓶颈服务

四、诊断流程

1. 标准诊断流程

sequenceDiagram
    participant U as 用户
    participant S as 系统
    participant D as 诊断工具
    participant A as 分析结果

    U->>S: 发现启动慢
    U->>D: 运行 dmesg
    D->>A: 内核日志分析
    U->>D: 运行 journalctl
    D->>A: systemd 日志分析
    U->>D: 运行 systemctl
    D->>A: 失败服务检查
    U->>D: 运行 systemd-analyze
    D->>A: 启动时间分析
    A->>U: 定位问题服务

mermaid

2. 分步诊断步骤

A. 第一步:内核日志检查

dmesg | less
dmesg | grep -i error
dmesg | grep -i fail

B. 第二步:systemd 日志检查

journalctl -xb
journalctl -b | grep -i failed
journalctl -b | grep -i error

C. 第三步:失败服务检查

systemctl --failed

D. 第四步:启动时间分析

systemd-analyze blame
systemd-analyze critical-chain

3. 问题定位策略

A. 自顶向下

从总启动时间开始,逐步深入到具体服务,定位最耗时的服务。

B. 自底向上

从内核日志开始,检查硬件初始化、驱动加载、文件系统挂载等底层问题。

C. 混合策略

结合两种方法,先检查明显的错误和失败,再进行时间分析定位瓶颈。

五、常见问题与解决方案

1. 网络服务等待

A. 现象

NetworkManager-wait-online.service 耗时过长

B. 原因

系统等待网络连接成功后再继续启动

C. 解决方案

# 禁用等待在线服务
sudo systemctl disable NetworkManager-wait-online.service

# 或修改服务配置
sudo systemctl edit NetworkManager-wait-online.service

2. 磁盘检查耗时

A. 现象

systemd-fsck-root.service 或 fsck 服务耗时过长

B. 原因

系统启动时自动进行文件系统检查

C. 解决方案

# 检查磁盘健康
sudo fsck -f /dev/sda1

# 调整 fsck 间隔
sudo tune2fs -c 30 /dev/sda1  # 每30次挂载检查一次
sudo tune2fs -i 6m /dev/sda1  # 每6个月检查一次

3. Snap 服务刷新

A. 现象

snapd.seeded.service 或 snap 刷新服务耗时

B. 原因

Snap 包管理系统在后台检查和刷新应用

C. 解决方案

# 调整刷新计时器
sudo snap set system refresh.timer=mon,03:00

# 或禁用自动刷新
sudo systemctl disable snapd.auto-import.service

4. 交换空间激活

A. 现象

swap 或 zram 相关服务耗时

B. 原因

系统启动时初始化交换空间

C. 解决方案

# 检查 swap 配置
sudo swapon --show

# 调整 swappiness 参数
sudo sysctl vm.swappiness=10
echo "vm.swappiness=10" | sudo tee /etc/sysctl.conf

六、预防措施

1. 定期维护

  • 定期检查磁盘健康
  • 清理不必要的启动服务
  • 更新系统和驱动程序

2. 监控设置

  • 设置启动时间监控告警
  • 记录历史启动时间数据
  • 建立启动性能基线

3. 优化策略

  • 禁用不必要的服务
  • 使用 SSD 替代 HDD
  • 配置合理的启动目标

七、最佳实践

1. 诊断工具使用顺序

  1. 先用 systemd-analyze 快速定位耗时服务
  2. 再用 journalctl 和 systemctl 查看详细日志
  3. 最后用 dmesg 检查底层硬件问题

2. 日志分析技巧

  • 关注时间戳:找出耗时最长的阶段
  • 关注错误和警告:优先处理红色错误
  • 对比正常和异常启动:找出差异点

3. 问题解决原则

  • 先软件后硬件
  • 先简单后复杂
  • 先临时后永久

八、总结

Ubuntu 24.04 启动慢问题可能由多种原因导致,系统提供了完整的诊断工具链。通过 dmesg、journalctl、systemctl 和 systemd-analyze 等工具,可以从内核到应用层面全面诊断启动问题。

关键要点:

  • 系统化诊断流程比盲目操作更有效
  • 日志分析是定位问题的核心手段
  • 预防性维护可以避免多数启动问题

参考资料

  1. Ubuntu 24.04启动慢,谁在做妖?
最后修改:2026 年 01 月 15 日
如果觉得我的文章对你有用,请随意赞赏