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

Linux内核日志是排查系统底层问题最直接的线索,dmesg 命令是查看和分析这些日志的核心工具。它输出的是内核环形缓冲区(ring buffer)中的消息,涵盖硬件检测、驱动加载、内存分配、设备热插拔、Oops/panic等关键事件。掌握 dmesg 的用法和解读逻辑,能快速定位卡顿、设备失联、启动失败、IO异常等典型问题。
理解 dmesg 输出的关键字段与级别
运行 dmesg 默认输出类似:
[ 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 默认不记录到磁盘,重启后丢失。如需持久化,应确保 rsyslog 或 journald 已配置捕获 kernel facility(如 rsyslog 中 /etc/rsyslog.d/50-default.conf 含 kern.* /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 ...定位代码行(需调试符号)








