Loading... # 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 系统提供多层次日志和诊断工具,从内核到应用层面全覆盖。 ```mermaid 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[依赖关系] ```  # 三、诊断工具详解 ## 1. 内核层面诊断 ### A. dmesg 命令 dmesg 用于显示和控制内核环形缓冲区的消息,包含内核启动过程中的所有输出信息。 基本用法: ```bash # 查看完整内核日志 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 日志系统的查询工具,可以查看系统和服务日志。 基本用法: ```bash # 查看上次启动的日志 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 的控制命令,用于管理系统和服务。 基本用法: ```bash # 查看启动失败的服务 systemctl --failed # 查看服务状态 systemctl status <service-name> # 查看所有服务状态 systemctl list-units --type=service --all # 查看服务依赖关系 systemctl list-dependencies ``` ## 3. 启动时间分析 ### A. systemd-analyze 命令 systemd-analyze 是专门用于分析系统启动时间的工具。 基本用法: ```bash # 查看总启动时间 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. 标准诊断流程 ```mermaid 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: 定位问题服务 ```  ## 2. 分步诊断步骤 ### A. 第一步:内核日志检查 ```bash dmesg | less dmesg | grep -i error dmesg | grep -i fail ``` ### B. 第二步:systemd 日志检查 ```bash journalctl -xb journalctl -b | grep -i failed journalctl -b | grep -i error ``` ### C. 第三步:失败服务检查 ```bash systemctl --failed ``` ### D. 第四步:启动时间分析 ```bash systemd-analyze blame systemd-analyze critical-chain ``` ## 3. 问题定位策略 ### A. 自顶向下 从总启动时间开始,逐步深入到具体服务,定位最耗时的服务。 ### B. 自底向上 从内核日志开始,检查硬件初始化、驱动加载、文件系统挂载等底层问题。 ### C. 混合策略 结合两种方法,先检查明显的错误和失败,再进行时间分析定位瓶颈。 # 五、常见问题与解决方案 ## 1. 网络服务等待 ### A. 现象 NetworkManager-wait-online.service 耗时过长 ### B. 原因 系统等待网络连接成功后再继续启动 ### C. 解决方案 ```bash # 禁用等待在线服务 sudo systemctl disable NetworkManager-wait-online.service # 或修改服务配置 sudo systemctl edit NetworkManager-wait-online.service ``` ## 2. 磁盘检查耗时 ### A. 现象 systemd-fsck-root.service 或 fsck 服务耗时过长 ### B. 原因 系统启动时自动进行文件系统检查 ### C. 解决方案 ```bash # 检查磁盘健康 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. 解决方案 ```bash # 调整刷新计时器 sudo snap set system refresh.timer=mon,03:00 # 或禁用自动刷新 sudo systemctl disable snapd.auto-import.service ``` ## 4. 交换空间激活 ### A. 现象 swap 或 zram 相关服务耗时 ### B. 原因 系统启动时初始化交换空间 ### C. 解决方案 ```bash # 检查 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启动慢,谁在做妖?](https://mp.weixin.qq.com/s/lSMDc2uM7Y8eQsIs6Z_rkg) 最后修改:2026 年 01 月 15 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏