【问题标题】:LInux kernel logLLinux内核日志
【发布时间】:2023-03-24 03:28:01
【问题描述】:

我正在运行嵌入式 Linux(Angstrom 发行版,用于 Atmel)。我想在关机期间阅读内核消息日志,这与使用 dmesg 得到的内容相同。基本上我通过在内核代码中插入 printk() 来探索我遇到的一些问题,现在我想看看它们的输出。

我发现系统启动时日志不会自动启动(我该怎么办?)并且我无法使用 klogd 命令获取任何内容。

【问题讨论】:

  • 嗨@stef,您可以试试cat /var/log/messagescat /var/log/kern.log吗?
  • 我没有这些文件,但正是我想要创建的。
  • 显然埃不将日志存储在通常的地方,而且我也很难找到任何信息。能够 tail -f 或旋转日志会很好......

标签: logging linux-kernel embedded-linux kernel


【解决方案1】:

如果 klogd 启动太晚或停止太早让你看不到你的消息,也许你可以试试Netconsole

当然,如果您可以通过网络访问您的嵌入式开发板。该模块易于配置,过去我已经成功使用过几次。 请注意,如果您希望能够在启动过程的早期/晚期看到发出的消息,则必须在内核中编译它(使用您的以太网驱动程序),而不是作为一个模块。

另外,检查您的默认日志级别是否允许显示您的 printk()(loglevel= 内核启动参数)

【讨论】:

    【解决方案2】:

    在这种情况下,可靠的 RS232 串行控制台可能是您的朋友。

    除非您已采取措施禁用它,否则内核日志消息几乎肯定会在那里找到。

    【讨论】:

      【解决方案3】:

      不同的发行版可能会将 /proc/kmsg 的输出重定向到他们喜欢的任何物理日志文件或虚拟设备 (/dev/xxx)。但是“/proc/kmsg”是内核日志的原始最终来源,因为内核实际上在 fs/proc/kmsg.c 中实现了它的环形缓冲区操作:

      static const struct file_operations proc_kmsg_operations = {
              .read           = kmsg_read,
              .poll           = kmsg_poll,
              .open           = kmsg_open,
              .release        = kmsg_release,
              .llseek         = generic_file_llseek,
      };
      

      这里有更多信息:

      How to read ring buffer within linux kernel space?

      所以你看到的输出是这样的:

      sudo tail -f /proc/kmsg

      而且您只能看到发出此命令后生成的所有消息 - 环形缓冲区中的所有先前消息都不会被打印出来。所以要查看物理文件输出,可以搜索“/proc/kmsg”的用户:

      sudo lsof |grep proc.kmsg

      我的机器表明了这一点:

      rsyslogd  1743               syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
      in:imuxso 1743 1755          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
      in:imklog 1743 1756          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
      rs:main   1743 1757          syslog    3r      REG                0,3          0 4026532041 /proc/kmsg
      

      所以现在是pid 1743,让我们看看1743打开的文件fd:

      sudo ls -al /proc/1743/fd
      
      lrwx------ 1 root   root   64 Dec 11 08:36 0 -> socket:[14472]
      l-wx------ 1 root   root   64 Dec 11 08:36 1 -> /var/log/syslog
      l-wx------ 1 root   root   64 Dec 11 08:36 2 -> /var/log/kern.log
      lr-x------ 1 root   root   64 Dec 11 08:36 3 -> /proc/kmsg
      l-wx------ 1 root   root   64 Dec 11 08:36 4 -> /var/log/auth.log
      

      这样,pid 1743 是 rsyslogd,它将 /proc/kmsg 的输出重定向到 /var/log/syslog 和 /var/log/kern.log 等文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        相关资源
        最近更新 更多