2014年7月30日水曜日

syslogでカーネルログが見える訳

Linuxを運用していてお世話になるのが動作ログが取れるsyslogです。
一般的にはsyslogdが用いられますが、
実は互換性を持ったパッケージはいろいろあり、
Gentoo Linuxではシステムのインストール時に好きなのを入れます。
私は昔metalogを使ってましたね。

さて、ログをとってもらうには各アプリケーションが
syslog()関数(Cの場合)を呼び出すわけで、
プロセス間通信を担っているのが"/dev/log"です。

ところでkernelのログはどうやってsyslogが受け取っているのか疑問が浮かびます。
実はカーネルではklogdスレッドが動いていて、
カーネル内の各部からはこのklogdにログを残すよう依頼します。
klogdは__LOG_BUF_LENで定義されるサイズのリングバッファを持っていて
これに依頼されたログを格納しておきます。

klogdでは"/proc/kmsg"を外部インターフェイスとして持っていて、
この仮想ファイルからリードすることでカーネルログがユーザ空間に読み出せ、
読み出しているのがsyslogdというわけです。
つまり、syslogdがカーネルログを読み出す頻度と
バッファサイズのバランスが取れていないと、
バッファからあふれてしまったログは消えてなくなります。
なお__LOG_BUF_LENの増量は
カーネルコンフィグレーションCONFIG_LOG_BUF_SHIFTの調整で可能です。
詳しく知りたければ"kernel/printk.c"あたりを見るのがいいでしょう。

0 件のコメント:

コメントを投稿