dmesg 需配合 -t、-l err,warn 和 grep 筛选才能准确定位错误;-w 实时监控硬件事件,-c 清空前导出日志;容器中若为空需检查 config_printk 或改用 journalctl -k。

dmesg 不是“查报错”的万能开关,它默认输出全量日志,错误信息被淹没在启动杂讯里——必须加筛选才有效。
用 -T 和 -l err,warn 快速定位真实错误
默认 dmesg 输出的是开机后秒数(如 [ 1.234567]),系统重启或休眠后这个数字就失去意义。直接看绝对时间才能对齐故障时刻。
- 加
-T显示本地时间:dmesg -T | tail -n 30查最近半分钟发生了什么 - 只抓关键级别:
dmesg -l err,warn过滤掉 info/debug 级别噪音,90% 的硬件异常、驱动加载失败、IO 超时都落在这个范围 - 注意:
-l只匹配日志级别字段,有些错误藏在消息正文里(比如 “timeout”, “reset”, “link down”),得配合grep -i "timeout\|fail\|reset"
实时监控硬件事件必须用 -w,-f 已过时
USB 插拔、NVMe 链路中断、网卡重置这类事件转瞬即逝,翻历史日志基本找不到。靠 -w 才能真正盯住。
-
dmesg -w是内核原生支持的实时流式监听,缓冲区翻转时自动续读,不会丢消息 -
dmesg -f是旧接口,某些内核版本下会卡住或中断,已被官方标记为弃用 - 实战组合:
dmesg -w | grep -i "usb\|nvme\|xhci\|ata",插设备或复现问题时终端立刻有响应
清空缓冲区前务必先存档,-c 和 -C 别混用
内核环形缓冲区大小有限(通常 128KB–256KB),旧消息会被覆盖。排查中途清空,可能把关键线索刷没了。
- 操作前先备份:
dmesg > /tmp/dmesg-before.log - 要用
-c(read-and-clear):它会输出当前全部内容再清空,相当于“导出+清空”一步到位 - 别用
-C(clear-only):它只清不输出,清完就啥都没了,无法回溯 - 某些容器或嵌入式环境返回空,先检查是否启用
CONFIG_PRINTK,或改用journalctl -k替代
真正难的不是命令本身,而是判断哪条日志算“错误”——比如 buffer I/O error 看似普通,但连续出现三次,往往意味着磁盘开始掉块;而 ACPI: EC: GPE storm detected 这类警告,多数时候只是 BIOS bug,不用干预。经验来自反复对照现象和日志,不是参数堆出来的。











