dmesg是Linux下查看内核启动信息的核心工具,其输出的时间戳、硬件检测、驱动加载、文件系统挂载等信息,能直接定位启动缓慢的根源。以下是具体优化步骤:
要分析启动速度,首先需要获取内核事件的精确时间戳。通过以下两种方式开启:
printk.time=1(如GRUB配置中修改GRUB_CMDLINE_LINUX_DEFAULT),重启后dmesg输出会显示每条消息的时间戳(如[ 0.000000]格式)。CONFIG_PRINTK_TIME=y,使时间戳默认输出。内核启动的前期阶段(如CPU、内存、设备控制器初始化)的耗时可通过dmesg的时间戳计算。例如:
dmesg | grep -E '^\[\s*0\.' | awk '{print $1}' | sed 's/\[//;s/\]//' > timestamps.txt
通过计算相邻时间戳的差值,找出耗时较长的步骤(如某设备控制器初始化用了5秒),针对性优化(如更新固件、调整硬件配置)。
驱动加载是启动慢的常见原因。通过dmesg过滤驱动相关日志:
dmesg | grep -i 'driver\|module\|failed'
重点关注:
usbcore: failed to register driver xxx,需更新或重新安装驱动。[ 2.123456] e1000e: eth0: link up前的长时间等待),需检查驱动是否适配硬件或内核版本。文件系统挂载(尤其是根分区)的延迟会显著拖慢启动。通过dmesg查看挂载日志:
dmesg | grep -i 'mount\|filesystem\|fsck'
常见问题及解决:
/dev/sda1: recovering journal(fsck修复耗时),需定期检查文件系统(fsck /dev/sda1)。mount: unknown filesystem type 'ext4',需确认/etc/fstab中的文件系统类型正确。硬件故障或兼容性问题会导致启动缓慢。通过dmesg查看硬件相关日志:
dmesg | grep -i 'error\|warning\|fail'
常见硬件问题:
ata1: softreset failed (device not ready),需检查硬盘健康状态(smartctl -a /dev/sda)。SLUB: Unable to allocate memory,需测试内存(memtest86+)。不必要的模块加载会增加启动时间。通过dmesg查看加载的模块:
dmesg | grep -i 'module loaded'
优化方法:
/etc/modprobe.d/blacklist.conf,添加blacklist xxx(如blacklist floppy)。systemd的udev-rules),减少启动时的资源占用。根据dmesg输出的硬件信息,调整内核参数提升启动速度:
/etc/sysctl.conf,添加kernel.printk = 3 4 1 7,降低日志级别。vm.swappiness(如vm.swappiness=10),减少交换分区使用。vm.vfs_cache_pressure(如vm.vfs_cache_pressure=50),加快缓存回收。通过以上步骤,可系统性地利用dmesg定位启动速度瓶颈,并采取针对性措施优化。需注意,优化前需备份重要数据,避免误操作导致系统故障。