dmesg 是唯一能实时捕获内核首次识别 USB 设备的工具,比 lsusb 更底层及时;插拔时用 dmesg -w 或 dmesg | grep -i usb | tail -n 10 可快速定位,注意供电问题常被误判为硬件故障。

怎么快速定位刚插上的USB设备是否被识别
dmesg 是唯一能实时看到内核“第一次见到”硬件的工具,比 lsusb 更底层、更及时——lsusb 读的是已枚举完成的设备树,而 dmesg 记录的是从物理信号到驱动绑定的全过程。
- 插上U盘后立刻执行
dmesg -w,等几秒再拔掉,你会看到一连串带时间戳的 usb 相关日志,比如usb 2-1: new high-speed USB device number 5和usb-storage 2-1:1.0: USB Mass Storage device detected - 如果只关心最新几条,用
dmesg | tail -n 20;想过滤关键词,必须加-i(忽略大小写),否则USB和usb会漏掉:dmesg | grep -i usb | tail -n 10 - 常见误判点:看到
device not accepting address或error -71不代表设备坏了,很可能是供电不足或线材接触不良——换端口、换线、不接集线器再试
为什么 dmesg -T 显示的时间有时不准
dmesg -T 把内核内部的“启动后秒数”转成本地时间,但这个转换依赖系统时钟在启动后是否被 NTP 或手动校正过。一旦系统休眠/唤醒、或虚拟机被暂停再恢复,时间戳就会跳变甚至倒退。
- 真正稳定的是相对时间(
dmesg -t)或启动偏移(默认格式,如[12345.678901]),它永远反映“距内核启动过了多少秒” - 排查硬件响应延迟时,应该用默认时间戳算差值:比如从
[12345.678]的“device found”到[12345.830]的“Mass Storage detected”,间隔约 152ms,这比看-T输出的“2026-03-28 05:22:11”更有诊断价值 - 若坚持要用可读时间,且机器不休眠、不虚拟化,可加
sudo提权运行dmesg -T(部分发行版限制非 root 查看精确时间)
如何只看错误和严重警告,避免信息过载
开机日志动辄上万行,全扫一遍效率极低。--level 是最干净的过滤方式,它按内核定义的日志级别筛选,比 grep error 可靠得多——后者会匹配到 “error” 字样,但内核实际可能只是在打印 “error injection enabled” 这种调试提示。
- 只显示真正需要干预的错误:
dmesg --level=err,crit,alert - 想顺带看看警告(比如驱动降级、固件缺失):
dmesg --level=err,warn - 注意:
debug级别默认不输出,除非内核编译时启用了CONFIG_DYNAMIC_DEBUG,所以--level=debug很可能返回空——这不是命令错了,是内核没记
环形缓冲区清空后还能找回旧日志吗
不能。dmesg 的 ring buffer 是内存中的固定大小区域(通常 16KB–64KB),新消息进来就覆盖最老的。执行 dmesg -c 后,被清除的内容彻底丢失,无法回溯。
- 安全做法是先保存再清理:
dmesg > /tmp/dmesg.boot.$(date +%s),尤其在复现问题前 - 系统启动后的完整日志其实还存了一份在磁盘:
/var/log/dmesg(部分发行版叫/var/log/kern.log),但它只记录到上次关机前,不包含运行时新产生的消息 - 真正持久的方案是启用
journald:systemd 系统中,journalctl -k会把内核日志落盘并保留多轮重启记录,比纯 dmesg 更适合长期追踪
环形缓冲区的“易失性”是设计使然,不是缺陷——它优先保障实时性和内存开销。想靠它查三天前的硬盘报错?早被覆盖了。该用 journalctl 的地方,别硬扛 dmesg。

















