dmesg是排查硬件驱动加载与报错最直接的内核级工具,需用时间、级别、关键词三重过滤:先执行dmesg -l err,warn剔除90%噪音,再结合grep -i "pci|nvme|ata|usb|net|phy|firmware|timeout|fail|reset"精准定位故障。

dmesg 是查看硬件驱动加载与报错最直接的内核级工具,它不经过日志服务,能捕获驱动 probe 阶段失败、PCIe 初始化异常、固件缺失等底层信号。关键不是看全量日志,而是用时间、级别、关键词三重过滤还原真实上下文。
先筛掉噪音:只看 err/warn 级别 + 硬件关键词
默认输出里大量 info 日志会淹没真正问题。优先执行:
- dmesg -l err,warn —— 剔除 90% 启动杂讯,聚焦错误和警告
- dmesg -l err,warn | grep -i "pci\|nvme\|ata\|usb\|net\|phy\|firmware\|timeout\|fail\|reset" —— 加硬件前缀和故障词,覆盖主流设备类型
- 避免只搜 “error”:像 “link down”、“no carrier”、“PHY status changed: link=0” 这类物理层信号不带 error 字,但就是驱动已加载、链路不通的明确证据
按驱动名查上下文,别断章取义
单行报错容易误判,驱动加载失败往往跨多行。例如 e1000e 初始化失败时,错误可能在第三行,但驱动名在第一行:
- dmesg | grep -A2 -B2 -i "e1000e\|igb\|ixgbe\|i40e\|mlx5_core\|r8169" —— 前后各两行,保留完整调用栈和返回码
- 看到 err=-110 就是 ETIMEDOUT,常见于 PHY 通信失败;err=-5 多为 I/O 错误;err=-16 通常是设备忙或资源冲突
- 报错中含 PCI 地址(如 0000:02:00.0)时,立刻执行 lspci -vv -s 0000:02:00.0 查设备状态、能力及 BIOS 设置是否屏蔽(如 SR-IOV、PXE)
用稳定时间戳定位问题发生时刻
-T 参数换算时间易失准(NTP 校正、虚拟机、手动改时间都会导致偏差),推荐更可靠方式:
- dmesg --time-format=iso | tail -30 —— 输出类似 2026-07-29T16:22:03.456789,精准对应你刚插网线/重启模块的动作
- dmesg --time-format=iso | grep -i "link.*up\|link.*down\|carrier lost" —— 快速定位链路震荡起止时间,结合交换机日志交叉验证
- 老内核不支持 --time-format?改用 dmesg -H(Linux 5.7+),自带倒序、颜色和稳定格式
配合其他命令交叉验证,确认是驱动还是硬件问题
dmesg 告诉你“哪里坏了”,但需进一步判断“为什么坏”:
- ifconfig 或 ip link 显示 UP,但 ethtool eno1 显示 Link detected: no → dmesg 里大概率有 PHY status changed: link=0,优先查物理连通性
- 报错含 “Failed to load firmware” → 安装对应固件包(如 firmware-e1000e),再 modprobe -r e1000e && modprobe e1000e
- 报错含 “no IRQ or wrong IRQ”(尤其 r8169)→ 换 r8168 驱动,或检查 BIOS 中中断分配是否冲突
- 连续出现 “reset controller” + I/O timeout → 不是硬盘坏,很可能是 NVMe PCIe 链路不稳定,用 lspci -vv 看 AER 错误计数



















