« 闇に選ばれし魔女 | メイン | 家具が揃う »

syslog-ngとminilogd

CentOS4.4でsyslog-ngを使った時に、minilogdとの連携ではまりました orz

まず、minilogd は、syslogd や syslog-ng を止めたときや、ブート時でまだ syslogd や syslog-ng が立ち上がっていない時に、代わりに自動的に立ち上がるデーモンです。
メッセージを受信して仮想メモリーにログを保存しておいてくれます。
syslogd や syslog-ng が起動すると、syslogd や syslog-ng は /dev/log を経由して minilogd が仮想メモリーに保存したログメッセージを読み取って HDD 上のログファイルに保存します。
/dev/log は UNIXソケットドメインです。
minilogd は重要なデーモンです。
syslogd は特に気にすることなく minilogd と連携してくれます。

さて、大抵のウェブページを見ていると、syslog-ng の設定に関して、

  source s_sys { 
     pipe ("/proc/kmsg" log_prefix("kernel: "));
     unix-stream ("/dev/log");
     internal();
  };

この様に書かれています。
FC6のsyslo-ngのRPMをインストールした場合も同様です。

で、大抵、Linuxの場合は /dev/log はストリームソケットだから、unix-stream()を使いなさいと書かれています。で、上記はその様に設定されています。
そして、*BSDの場合はデータグラムソケットだから、unix-dgram()を使いなさいと書いてあります。

ところが、ボクのCentOS4.4の環境だと、syslog-ngを止めている間にminilogdが受信したログを、syslog-ngを起動してもsyslog-ngが読み取ってくれません orz
ブート時のブートログはちゃんと出力されているのでそこは /dev/log が読み取って書いているようなのですが、一旦起動したとはなぜか読んでくれません。なぜ~~(?_?)

結果、syslog-ngの設定を以下のように変更したら、syslog-ng 停止中に受信したログもsyslog-ng起動後に出力するようになりました。

  source s_sys { 
     pipe ("/proc/kmsg" log_prefix("kernel: "));
     unix-stream ("/dev/log");
     unix-dgram ("/dev/log");
     internal();
  };

データグラムソケットを使っているということでしょうか。
これが正しい解決策なのかどうか分かりませんが、とりあえず、これで期待した動きになりました。
ブート時のログもきちんと記録されるし、minilogdとの連携も問題ないようです。

netstat -an コマンドで確認したら、/dev/log は確かに DGRAM ってなってますねf(^^;)

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  12     [ ]         DGRAM                    32476784 /dev/log

Linuxは、昔は /dev/log にストリームソケットを使っていたけど、DoSアタックなどのセキュリティ的な事情からデータグラムソケットを使うようになった、というような記事を読みました。(元記事は英語だったので私の訳が正しいのか不安ですが・・・)
こんなこと常識なのかもしれませんが、私はちょとはまりました(苦笑)

/dev/log についてはここが勉強になります。
99syslog - syslog() 及び syslogd の考察

トラックバック

このエントリーのトラックバックURL:
http://hagyroom.sakura.ne.jp/mt/mt-tb.cgi/696

コメント (1)

hagy:

最近知ったんだけれど、CentOS5やFC4にはminilogdがない。
ビックリした。

どうやらinitscripts-8にはminilogdが入ってないらしい。
CentOS4はinitscripts-7.xで、FC4とCentOS5はinitscripts-8.xがバンドルされている。

initscriptsパッケージのchangelogを見てみると、

* Tue Jan 04 2005 Bill Nottingham <notting@redhat.com> 8.02-1
- remove initlog, minilogd

と書いてある。
随分昔に削除されてるなぁ。

minilogdがない場合はどうしたらいいんだろう?
代わりのプログラムがあるのだろうか?
カーネルが肩代わりしてくれるわけでも無いようだし・・・
教えて偉い人

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年05月17日 00:00に投稿されたエントリーのページです。

ひとつ前の投稿は「闇に選ばれし魔女」です。

次の投稿は「家具が揃う」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

アーカイブ

お薦めショップ

  • HagyShop   ボクの大好きな作品だけ、
      お薦めの本と映画をご紹介。