Linux内核日志分析教程_dmesg与内核异常排查

2次阅读

dmesg 是查看 Linux 内核环形缓冲区日志的核心工具,用于快速定位硬件、驱动、内存、IO 等底层问题;需结合时间戳、子系统标识、日志级别(ERR/WARN/INFO/ALERT)及过滤参数(-l, -T, -w, -c)高效分析,并联动 lspci、modinfo、iostat 等工具闭环排查。

Linux 内核日志分析教程_dmesg 与内核异常排查

Linux 内核日志是排查系统底层问题最直接的线索,dmesg 命令是查看和分析这些日志的核心 工具。它输出的是内核环形缓冲区(ring buffer)中的消息,涵盖硬件检测、驱动加载、内存分配、设备热插拔、Oops/panic 等关键事件。掌握 dmesg 的用法和解读逻辑,能快速定位卡顿、设备失联、启动失败、IO 异常等典型问题。

理解 dmesg 输出的关键字段与级别

运行 dmesg 默认输出类似:

[1.234567] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[2.890123] EXT4-fs (sda1): mounted filesystem with ordered data mode
[34.567890] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[123.456789] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000

每行开头的 [X.XXXXXX] 是内核启动后的时间戳(单位:秒),用于判断事件发生的相对顺序;中括号后的字符串(如 usb 1-1:EXT4-fs (sda1):)标识子系统或设备;冒号后是具体信息。日志级别隐含在内核源码中,常见有:

  • KERN_ERR(红色,常带“error”、“failed”、“timeout”)→ 驱动初始化失败、IO 超时、设备拒绝响应
  • KERN_WARNING(黄色,含“warning”、“deprecated”、“overrun”)→ 潜在风险,如 DMA 缓冲区溢出、固件版本不匹配
  • KERN_INFO(白色,默认级别)→ 正常事件,如模块加载、设备识别,需结合上下文判断是否异常
  • KERN_ALERT / KERN_EMERG → 内核已无法继续运行,通常伴随 panic 或 oops,需立即关注

高效过滤与实时监控 dmesg 日志

原始输出信息量大,需配合参数聚焦重点:

  • dmesg -l err,warn:只显示错误和警告,排除干扰
  • dmesg -T | grep -i "nvme|ata|raid":加人类可读时间戳(-T),再按关键词过滤存储相关报错
  • dmesg -w:持续监听新日志,适合复现问题时观察(如插拔 U 盘、触发磁盘 IO)
  • dmesg -c:清空缓冲区并输出当前内容,常用于故障复位后重新捕获新异常
  • dmesg --level=err --source=kernel:精确限定为内核自身产生的错误(排除 systemd-journald 注入的日志)

注意:dmesg 默认不记录到磁盘,重启后丢失。如需持久化,应确保 rsyslogjournald 已配置捕获 kernel facility(如 rsyslog 中 /etc/rsyslog.d/50-default.confkern.* /var/log/kern.log)。

识别典型内核异常模式

以下日志片段代表高频真实问题,需结合硬件环境与操作上下文交叉验证:

  • ataX.YY: failed command: READ FPDMA QUEUED + status: {DRDY ERR} → SATA/NVMe 链路不稳定,检查线缆、供电、固件或更换 端口
  • Memory failure on page + 物理地址 → 内存条存在坏块,用 memtest86+ 彻底检测,或通过 edac-util 查看 ECC 纠错计数
  • nf_conntrack: table full, dropping packet → 连接跟踪表溢出,调高 net.netfilter.nf_conntrack_max 或优化 防火墙 规则
  • INFO: task XXX blocked for more than 120 seconds → 进程长时间不可中断休眠(D 状态),常见于 IO 卡死、NFS 挂载点无响应、驱动死锁
  • BUG: soft lockup - CPU#X stuck for XXs! → 某 CPU 核心长时间未调度,可能由驱动忙循环、中断风暴或散热降频导致

关联其他工具完成闭环排查

dmesg 提供“发生了什么”,但需联动其他命令确认“为什么 发生”和“影响范围”:

  • 查设备状态:lspci -vv -s 0000:01:00.0(对应 dmesg 中 PCI 地址)→ 看链路宽度、错误计数、电源管理状态
  • 查驱动细节:modinfo ixgbe + cat /sys/module/ixgbe/parameters/* → 验证驱动版本与启用参数是否匹配硬件需求
  • 查内存映射:cat /proc/meminfo | grep -i "hardware|corrupt" → 辅助判断内存类错误是否被硬件层上报
  • 查 IO 延迟:iostat -x 1 + iotop → 若 dmesg 显示 IO timeout,需确认是上层应用压力过大,还是底层磁盘响应异常
  • 抓取完整 Oops:dmesg -T | grep -A20 -B5 "Oops:" → 获取寄存器值、栈回溯,用 addr2line -e vmlinux …… 定位代码行(需调试符号)
星耀云
版权声明:本站原创文章,由 星耀云 2026-01-08发表,共计2165字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。