商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 怎样通过dmesg优化启动速度

怎样通过dmesg优化启动速度

  发布于2026-07-03 阅读(0)

扫一扫,手机访问

要说排查Linux系统启动慢的问题,dmesg绝对是第一把交椅。它的输出里藏着硬件初始化、驱动加载、文件系统挂载、内核模块初始化等所有关键阶段的细节,堪称优化启动速度的“问题探测器”。想动手优化启动时间?先学会用它定位瓶颈。

怎样通过dmesg优化启动速度

具体怎么用?下面几个抓重点的方法值得先收下:

  • 过滤错误与警告——跑一条dmesg | grep -i "error|failed|warning",就能把硬件检测失败(比如磁盘坏道)、驱动加载异常(比如显卡驱动不兼容)这些阻塞启动流程的元凶筛出来。
  • 分析硬件初始化耗时——找找CPU、内存、硬盘、网卡的初始化日志(像[1.234567] sd 0:0:0:0: [sda] Attached SCSI disk这样的),如果某个硬件初始化时间过长(机械硬盘寻道慢尤其典型),那换块SSD或优化硬件配置就是优先选项。
  • 跟踪内核模块加载——用dmesg | grep -i "module"查看模块加载日志,那些不必要的模块(比如虚拟化模块、未使用的硬件驱动)如果也在启动时排队加载,内核初始化时间就这么被拖长的。
  • 查看文件系统挂载延迟——检查/dev/sda1 / ext4 rw这类日志,挂载时间超过1秒就需要警惕了,可能是磁盘I/O性能太差或者文件系统有错误(试试用fsck修复)。
  • 关注内核消息时间戳——如果内核开启了CONFIG_PRINTK_TIME,dmesg输出里就有精确的时间戳(比如从[0.000000] Linux version 5.15.0[2.345678] EXT4-fs (sda1): mounted filesystem的时间差),哪个阶段耗时最长一目了然。

一、基于dmesg结果的优化措施

1. 精简内核模块加载

  • 禁用不必要的内核模块——先跑lsmod看当前加载了哪些模块,再对照dmesg里的模块加载日志,把蓝牙、无线网卡驱动这类用不上的直接从内核配置里移除(编译时设CONFIG_MODULE_UNLOAD=y,方便以后动态加载)。
  • 非必需模块改成动态加载——比如打印机驱动这种不常用但偶尔有用的,先用modprobe -r 卸载,然后通过/etc/modprobe.d/blacklist.conf加入黑名单,真正需要时手动sudo modprobe 加载就行。启动时的模块初始化负担一下子就减轻了。

2. 优化内核启动参数

  • 调整root文件系统等待时间——如果dmesg里看到Waiting for root device /dev/sda1...这种提示,说明系统在傻等root设备就绪。在GRUB配置里改rootwait=5(从默认30秒缩短到5秒),只要设备能在5秒内准备好,启动就能快不少。
  • 开启quiet模式——在GRUB内核启动参数里加上quiet(比如linux /boot/vmlinuz-5.15.0 root=/dev/sda1 quiet),内核启动时的日志输出(尤其是调试信息)会大幅减少,省下的日志写入时间虽然不多,但聊胜于无。
  • 优化内核压缩算法——如果dmesg显示内核解压时间偏长(比如Uncompressing Linux... done, booting the kernel这行前后时间差大),可以试试换个压缩算法。测试表明,lz4的解压速度比gzip快约30%,配合SSD效果更明显(当然需要重新编译内核)。

3. 缩短硬件检测时间

  • 禁用不必要的硬件探测——dmesg里可能包含USB设备、串口等未使用硬件的探测记录。包括BIOS里关掉“Legacy USB Support”这类选项,或者在内核配置里禁用相关驱动(比如CONFIG_USB_LEGACY=y改成n),硬件探测时间就能省下来。
  • 优化磁盘I/O性能——如果磁盘初始化慢(比如看到sd 0:0:0:0: [sda] Assuming drive cache: write through),可以试试把磁盘缓存模式改成write back(用hdparm -W1 /dev/sda设置,前提是磁盘支持)。要是机械硬盘,升级到SSD是最立竿见影的办法——随机读写速度能提升5-10倍。

4. 延迟非关键服务启动

  • 区分关键与非关键服务——先跑systemctl list-unit-files --state=enabled看看哪些服务是开机自启的,再结合dmesg里的服务启动日志(比如[3.456789] systemd: Starting Network Manager...),把蓝牙、打印服务这类非关键的设成延迟启动(systemctl enable --now --no-block)或者手动启动,避免它们阻塞SSH、数据库等核心服务。
  • 并行启动服务——现代Linux默认用systemd,它的并行启动策略已经很成熟了。跑一下systemd-analyze plot > boot.svg生成启动时间线图,能直观看到各服务是否并行执行——如果发现有串行阻塞的点,调整依赖关系就能进一步提速。

二、进阶优化技巧:生成启动时间线图

如果觉得上面的方法还不够直观,可以祭出initcall_debug内核参数,生成一张启动时间线图:

  1. 开启initcall_debug——在GRUB配置里加上initcall_debug(比如linux /boot/vmlinuz-5.15.0 root=/dev/sda1 initcall_debug),重启系统。
  2. 收集dmesg日志——用dmesg > boot.log把带各初始化函数耗时的日志保存下来。
  3. 生成启动图——把boot.log复制到Linux源码目录,执行scripts/bootgraph.pl boot.log > boot.svg,然后用Inkscape等工具打开生成的SVG文件。图上每个初始化阶段(比如“early console init”“filesystem setup”)的耗时一目了然——优先优化那些占用5秒以上的大头就行。

照着这些步骤走,dmesg就成了你手里的精准定位仪,启动速度优化也就有了明确的方向。实际操作中,往往改几个参数、去掉几个模块就能看到明显改善。不妨从今天开始试一试。

本文转载于:https://www.yisu.com/ask/48109331.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注