
私はLinuxで組み込みシステムを構築しようとしています。 (ビジボックス以外にはほとんどリソースがないという意味です。)すべてがsyslogに書き込まれていることを確認したいと思います。私はinitとsyslogdが組み込まれた最新バージョンのbusybox(v.1.21.1)を使用しています。
しかし、まだいくつかの問題があります。最初は初期化タブです。
....
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を起動できますが、これは非常に重要な「再生」を削除します。
また、サードパーティのデーモンが起動すると、次のようになります。
...
null::respawn:/bin/modbus
...
デーモンがsyslogをサポートしていない場合、またはいくつかのエラー(stderrで印刷など)が発生した場合、この情報は失われます。出力をsyslogにリダイレクトできないようです。例えば。
...
console::respawn:/bin/modbus|logger 2>1
...
私は様々な組み合わせを試しました。何もうまくいかないようです。もちろん、すべてのデーモンを編集してsyslogをサポートするようにすることもできます。 (しかし、何かが滑ったらどうでしょうか?)
log::respawn:/bin/modbus
実際には/dev/logがあります。しかし、ソケットなので、一般的なリダイレクトは機能しません。 ...これにより、カスタムカーネルモジュールを介して機能させることができます。例えば。 /dev/syslog_linkを生成し、すべてをprintkに書き込むモジュールを作成できます。問題は、syslogがそのログのすべてのメッセージを「カーネル」としてマークすることです。とても間違っていました。
これで、/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/log
たとえば、これはrwを含むファイルシステムが再マウントされる場所です。そうでない場合は、まずsyslogを起動できます。
私は様々な組み合わせを試しました。何もうまくいかないようです。
私は数年間inittabをあまり使用していません。たとえば/bin/modbus|logger 2>1
、短いスクリプトに入れて代わりに試してみましたかrespawn
?
もちろん、すべてのデーモンを編集してsyslogをサポートするようにすることもできます。
可能であれば、おそらくそうする必要があります。あるいは、ファイルに直接書き込むこともできます。
/dev/logがあります。しかし、ソケットなので、一般的なリダイレクトは機能しません。 ...これにより、カスタムカーネルモジュールを介して機能させることができます。
これは遠すぎるようです。ユーザー空間デーモンを使用して最初に起動する方が簡単です。 FIFOで何でも読み書きできます。もちろん、すでにsyslog:/ fifoがあることを考慮すると、少し重複する可能性があります。リーダーが使用するヒントは、read()
ゼロが返されたときにパイプを再び開くことです。しかし、もう一度申し上げますが、私はsyslogを最初に動作させようとします。標準を維持する方が簡単です。
答え2
初期ブートメッセージの場合は/dev/kmsgを検討できます。これは、ファイルシステムが書き込み可能になり、ディスクチェックが実行された後、ユーザースペース(ほぼすべてのディストリビューション)がシステムログにダンプされるまで、カーネルの循環バッファに保存されます。これは、カーネルバッファがロガーの開始前に発生したメッセージのサイズより大きい限り機能します。カーネルログバッファのサイズはコンパイル時に設定できます。一般的なシェルスクリプトを使用してコンテンツを/ dev / kmsgにリダイレクトできる必要があります。
ランダムプログラムのstdoutをsyslogにリダイレクトする場合は、STDINを読み取り、それをsyslogにリダイレクトしてからデーモンの出力をユーティリティにパイプするユーティリティがあります。私が役に立つと思ったのは次のとおりです。http://b0llix.net/perp/site.cgi?page=sissylog.8
しかし、私はロギングを使って賢明な仕事をしている人がたくさんいます。このトピックに興味があると思われるので、「システムログ設計が最初から欠陥がありました」のセクションを読んでみるのも良いようです。http://www.skarnet.org/software/s6/s6-log.html