我正在运行嵌入式 Linux(Angstrom 发行版,适用于 Atmel)。我想在关闭期间读取内核消息日志,与使用 dmesg 获得的内容相同。基本上,我正在通过在内核代码中插入 printk() 来探索一些问题,现在我想查看它们的输出。
我发现系统启动时日志不会自动启动(我该怎么办?)并且我无法使用 klogd 命令获取任何内容。
如果 klogd 启动得太晚或停止得太早,以至于您无法看到消息,也许您可以尝试一下 Netconsole ?
当然,如果您可以通过网络访问嵌入式板。这个模块很容易配置,我过去已经成功使用过几次。 请注意,如果您希望能够在启动过程中很早/很晚看到发出的消息,您必须在内核内部(使用以太网驱动程序)编译它,而不是作为模块。
另外,检查你的默认日志级别是否允许显示 printk()(loglevel= 内核启动参数)
在这种情况下,值得信赖的 RS232 串行控制台可能是您的朋友。
除非您已采取措施禁用它,否则内核日志消息几乎肯定会找到那里。
不同的发行版可能会将 /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,
};
这里有更多信息:
那么你看到的输出是这样的:
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 等文件。