dmesg不会直接提示“驱动没装好”,而是暴露probe阶段失败信号,如probe failed、no device found、firmware missing、timeout、invalid pci header等,且错误紧邻驱动名(如e1000e、nvme、r8169)出现。

驱动加载失败时 dmesg 里会显示什么
驱动加载出问题,dmesg 不会直接说“驱动没装好”,而是暴露在 probe 阶段的底层失败信号。常见模式包括:probe failed、no device found、firmware missing、timeout、invalid PCI header。这些错误往往紧挨着驱动名(如 e1000e、nvme、r8169)出现。
典型例子:
nvme 0000:01:00.0: Device not ready; aborting reset r8169 0000:02:00.0: can't disable ASPM; OS doesn't support PCIe ASPM e1000e 0000:00:1f.6: firmware: failed to load intel/phydm.bin
注意:这类报错常发生在系统启动初期或热插拔后,dmesg 是唯一能捕获这个窗口期的工具。
怎么快速定位某类驱动的加载日志
别用 dmesg | grep driver 这种模糊匹配,容易漏掉关键上下文。推荐按设备类型或驱动模块名精准过滤:
-
dmesg | grep -i "e1000e\|igb\|i40e\|mlx5_core"—— 针对 Intel/Mellanox 网卡驱动,加-A2 -B2可看前后两行,避免断章取义 -
dmesg | grep -E "(nvme|ata|usb|pci)" | grep -i "probe|failed|error"—— 覆盖主流总线和失败动词 -
dmesg | grep -i "firmware.*load\|request_firmware"—— 固件缺失是高频原因,尤其在新硬件或内核升级后
如果驱动已加载但行为异常(比如网卡 up 但无 link),还要补查 ethtool eno1 或 lspci -vv -s 00:1f.6,交叉验证物理层状态。
为什么刚插上设备却看不到 dmesg 日志
不是没记录,是被刷掉了或权限拦住了。两个最常踩的坑:
- 内核环形缓冲区默认只有几 MB,新日志进来,旧的就被覆盖。执行
dmesg -c清空后再插设备,能确保捕获完整流程 - RHEL 8+/CentOS 8+ 等发行版默认启用
kernel.dmesg_restrict=1,普通用户看不到敏感字段(如地址、寄存器值)。临时放开需:echo 'kernel.dmesg_restrict = 0' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
另外,dmesg -T 显示可读时间戳需要 root 权限;非 root 用户看到的是相对时间(如 [ 1.234567]),容易误判先后顺序。
从 dmesg 日志里还能顺手拿到哪些硬件信息
驱动加载过程本身就是一次硬件自检,dmesg 里藏着大量未被 lshw 或 lspci 暴露的细节:
- CPU:搜
cpu family、model name、microcode,能看到微码版本是否最新 - 内存:
Memory:.*MB和early_node_map行反映实际识别容量,比free -h更底层 - PCI 设备:每条
pci 0000:00:01.0: [vendor:device] class都对应一个真实插槽,含 vendor ID、class code,可用于查芯片手册 - USB:
usb 1-1.2: new high-speed USB device这类日志带端口号和速度,能帮你确认 Hub 拓扑和供电能力
真正难的是把零散线索串起来——比如看到 nvme 0000:01:00.0: timeout 后,必须立刻查 smartctl -a /dev/nvme0n1 和 lspci -vv -s 01:00.0 | grep -A10 "Capabilities:",否则光看 dmesg 永远不知道是固件 bug 还是 PCIe link width 被协商成 x1。











