Linux内核日志打印两次重复的日志

Linux内核日志出现重复打印的问题,通常由以下几个原因导致。以下是详细的排查步骤和解决方法:


1. 检查内核启动参数中的 console 设置

当内核通过多个控制台(如串口和终端)输出日志时,每个控制台都会打印相同的信息,导致重复。

解决方法:

  • 查看当前启动参数

    1
    cat /proc/cmdline

    如果输出类似 console=ttyS0,115200 console=tty0,则表示日志同时输出到串口(ttyS0)和虚拟终端(tty0)。

  • 修改启动参数

    • 编辑 GRUB 配置文件(如 /etc/default/grub),找到 GRUB_CMDLINE_LINUX 行,删除重复的 console 参数,例如:
      1
      GRUB_CMDLINE_LINUX="console=ttyS0,115200"
    • 更新 GRUB 配置:
      1
      2
      sudo update-grub  # Debian/Ubuntu
      sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
    • 重启系统后验证:
      1
      dmesg | grep "Kernel command line"

2. 检查内核配置选项

某些内核编译配置可能导致日志重复输出,例如动态调试开关或冗余的日志机制。

关键配置项:

  • CONFIG_DYNAMIC_DEBUG:动态调试功能可能启用多个日志路径。
  • CONFIG_PRINTK:确保没有嵌套或重复调用。

解决方法:

  • 检查内核编译配置文件(.config):
    1
    grep -E "CONFIG_DYNAMIC_DEBUG|CONFIG_PRINTK" /boot/config-$(uname -r)
  • 如果 CONFIG_DYNAMIC_DEBUG=y,尝试禁用它或调整动态调试过滤器:
    1
    echo "file * -p" > /sys/kernel/debug/dynamic_debug/control  # 临时关闭所有动态调试

3. 检查内核模块或驱动

某些内核模块可能错误注册日志处理函数,导致重复输出。

排查步骤:

  • 观察重复日志出现的时间点:
    1
    dmesg | grep -i "重复日志的关键词"
  • 卸载可疑模块(如 usb_storagei2c-dev):
    1
    sudo modprobe -r module_name
    如果日志不再重复,说明问题出在该模块。

解决方法:

  • 联系模块开发者或在内核代码中修复重复的 printk 调用。

4. 用户空间日志服务冲突

如果重复日志出现在 /var/log/syslog/var/log/messages,可能是多个日志服务同时运行。

检查服务状态:

1
systemctl status rsyslog journald syslog-ng

解决方法:

  • 停用其中一个服务(如停用 syslog-ng 保留 rsyslog):
    1
    2
    sudo systemctl stop syslog-ng
    sudo systemctl disable syslog-ng

5. 调整内核日志级别

降低内核日志级别,减少冗余输出。

临时调整:

1
sudo dmesg -n 3  # 3=KERN_ERR,仅显示错误

永久调整:

  • 在启动参数中添加 loglevel=3quiet
    1
    GRUB_CMDLINE_LINUX="loglevel=3 quiet"
  • 更新 GRUB 并重启。

6. 内核 Bug 或版本问题

某些内核版本可能存在已知的日志重复问题。

解决方法:

  • 升级到最新稳定版内核:
    1
    2
    sudo apt install linux-image-generic  # Ubuntu
    sudo yum update kernel # RHEL/CentOS
  • 搜索内核邮件列表(如 LKML) 或社区报告。

总结

通过以上步骤,逐步排查控制台配置、内核选项、模块冲突和日志服务,通常可以定位问题根源。如果仍无法解决,建议提供具体的重复日志内容和内核版本信息,以便进一步分析。