初始化、系统日志和标准输出/标准错误

初始化、系统日志和标准输出/标准错误

我正在尝试用linux构建一个嵌入式系统。 (意味着资源非常少,除了 busybox 之外没有太多其他资源。)我想确保一切都会记录到系统日志中。我正在使用最新版本的 busybox (v.1.21.1),带有内置 init 和 syslogd。

但还是有一些问题。首先是初始化选项卡:

....
null::sysinit:/bin/sh /etc/rc
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -S -s 12 -b 8
null::respawn:/sbin/klogd -n
....

rc 脚本在 syslog 之前运行,这意味着 rc 中的所有有用信息都会丢失。 (顺便说一句,我不确定 touch 命令是什么。)我可以在 rc (null::sysinit:/sbin/syslogd...) 之前启动 syslog,但这会删除非常重要的“重生”。

此外,当第 3 方守护进程启动时,它可能如下所示:

...
null::respawn:/bin/modbus
...

如果守护进程不支持 syslog 或者如果出现某些错误(例如打印到 stderr),则会丢失。我似乎无法将输出重定向到系统日志。例如。

...
console::respawn:/bin/modbus|logger 2>1
...

我尝试了多种不同的组合。似乎没有什么效果很好。 Ofc,我可以编辑所有守护进程并使它们支持系统日志。 (但是如果有什么东西滑倒了怎么办?)如果我可以写这样的东西就可以解决:

log::respawn:/bin/modbus

实际上,有一个/dev/log。但它是一个套接字,正常的重定向不起作用。 ...所以我可以让它通过自定义内核模块工作。例如。我可以创建一个模块来创建 /dev/syslog_link 将所有内容写入 printk。问题是系统日志会将来自该日志的所有消息标记为“内核”。非常错误。

所以现在我想我可以创建一个写入 /dev/log 的内核模块: https://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a-linux-kernel-module https://www.cs.drexel.edu/~jjohnson/2012-13/fall/cs543/project/reading/kernel_fileio.pdf

我不知道这是否可能,并且从内核空间写入文件会伤害我脆弱的是非意识。

有什么想法吗?

答案1

rc 脚本在 syslog 之前运行

这可能有一个很好的理由,例如,因为这是包含/var/logrw 的文件系统重新安装的地方。如果没有,那么您可以先启动 syslog。

我尝试了多种不同的组合。似乎没有什么效果很好。

我已经好几年没怎么玩过 inittab 了。您是否尝试过将例如/bin/modbus|logger 2>1放入一个简短的脚本中,然后使用它来respawn代替?

Ofc,我可以编辑所有守护进程并使它们支持系统日志。

如果可以的话,你可能应该这样做。或者您可以让它们直接写入文件。

有一个/dev/log。但它是一个套接字,正常的重定向不起作用。 ...所以我可以让它通过自定义内核模块工作。

这似乎太过分了。使用用户空间守护进程并首先启动它会更容易;它可以从 fifo 读取并写入任何内容。当然,考虑到已经有 syslog ,这可能有点多余:/ fifo 读取器的技巧是在read()返回 0 时重新打开管道。但同样,我会尝试先让 syslog 工作。保持东西标准似乎更简单。

答案2

您可以考虑 /dev/kmsg,用于早期启动消息。这些将保存在内核中的循环缓冲区中,直到用户空间(几乎所有发行版)在文件系统可写并且运行磁盘检查后将其转储到系统日志中。只要您的内核缓冲区大于记录器启动之前发生的消息的大小,这就会起作用。内核日志缓冲区的大小可以在编译时配置。您应该能够使用典型的 shell 脚本将内容重定向到 /dev/kmsg。

至于将任意程序的 stdout 重定向到 syslog,有一些实用程序可以读取 STDIN 并重定向到 syslog,然后您只需将守护程序的输出通过管道传输到该实用程序即可。这是我发现有用的一个:http://b0llix.net/perp/site.cgi?page=sissylog.8

话虽如此,有很多人用日志记录做了很多聪明的事情。由于您似乎对该主题感兴趣,因此您可能有兴趣阅读“系统日志设计从一开始就有缺陷”部分http://www.skarnet.org/software/s6/s6-log.html

相关内容