温馨提示×

为何dmesg有重复日志

小樊
39
2026-10-18 04:55:21
栏目: 编程语言

dmesg 中出现重复日志是比较常见的现象,通常不是 bug,而是由以下几种原因之一或多种叠加导致的。下面按常见程度给你梳理一下。


1. 多个日志源同时记录(最常见)

Linux 内核日志会通过多个通道输出:

  • 内核 ring buffer(dmesg 读的就是它)
  • systemd-journald
  • rsyslog / syslog-ng
  • 内核自身重复 printk

如果你同时看:

dmesg
journalctl -k
cat /var/log/messages

可能会觉得“重复”,其实是同一事件被多个系统记录。


2. printk 级别 + 重复调用

某些驱动或内核模块在初始化或出错时,会:

  • 多次调用 printk
  • 或在循环中打印相同内容

例如:

  • 网卡初始化失败重试
  • USB 设备反复枚举
  • RAID / 存储驱动重试

这类“重复”是真实发生的行为,不是显示问题。


3. 内核 ring buffer 被覆盖后“看起来重复”

dmesg 显示的是 环形缓冲区:

  • 容量有限(如 16KB / 64KB / 1MB)
  • 系统运行久了,旧日志被新日志覆盖
  • 如果某些消息持续产生,就会“反复出现”

你可以用下面命令看 buffer 大小:

dmesg | wc -l
cat /proc/sys/kernel/printk

4. 同一个消息被不同子系统打印

例如一条错误可能来自:

  • 内核核心
  • 驱动
  • SCSI 层
  • block 层

结果你看到:

usb 1-1: device descriptor read/64, error -71
usb 1-1: device descriptor read/64, error -71

其实是不同层级在报同一件事。


5. systemd 或容器环境导致重复

在以下环境中更容易看到重复:

  • 容器 / 虚拟机嵌套
  • systemd 启动阶段早期日志
  • 内核 + initramfs 都打印

比如:

  • initramfs 打印一次
  • 真正根系统再打印一次

6. dmesg 被多次调用或重定向

有时候你看到“重复”,其实是:

  • 脚本里多次执行 dmesg
  • 日志采集工具重复读取
  • dmesg -T 和 dmesg 混看

如何确认是不是“真重复”

你可以试试:

# 看是否完全一模一样
dmesg | sort | uniq -c | sort -nr | head

如果计数 >1,说明是真实重复事件或多次打印。


如何减少重复日志

  • 调整 printk 级别:
    dmesg -n 3
    
  • 修改 /etc/rsyslog.conf 避免重复写
  • 升级有 bug 的驱动 / 内核
  • 禁用某些调试模块

如果你愿意,可以把具体重复的 dmesg 片段贴出来,我可以直接帮你判断是哪一种原因。

0 踩