次のページ 前のページ 目次へ

6. Syslog

6.1 問題点

syslogはUNIXシステムで共通して使われるシステムログユーティリティです。 (訳注:syslog=カーネル(kernel)のメッセージ・リング・バッファー を読んだり消去(clear)したりする)。 syslogFIFO(First In First Out)と呼ばれるスペシャルファイルを開く デーモンです。FIFOはパイプ(pipe)に似たスペシャルファイルです。 syslogデーモンはリードサイドからのデータを待ち、ライトサイドに書き込むための C関数があります。もしこれらのC関数でプログラムを書けば出力はsyslogに入ります。

chroot 環境を使っていて、FIFO /dev/logは仮想環境 には存在しないことに注意して下さい。これは全ての仮想環境がsyslogへの記録が できないということを意味しています。プログラムは新しく作ったものの代わ りとして/dev/log を使えないので、ファイルを単にコピーすることもで きません。

syslogの特定のバージョンにはudpソケットをFIFOの代わりに使っているものも ありますが、これは一般的なことではありません。

6.2 解決方法

syslogは、コマンドラインで指定すれば、異なるFIFOを探します。 例えば以下のようにします。

syslog -p /virtual/log
そして/dev/logを/virtual/logにリンクをはります(シンボリックリンク)。
ln -sf /virtual/log /dev/log
つぎに以下のようにしてこのファイルに全ての/dev/logをリンクします (これはハードリンクでシンボリックリンクではないことに注意)。
ln /virtual/log /virtual/domain.com/dev/log 
上記のvirtfsスクリプトではすでにこれを行っています。/virtualは一つ の連続したディスクにあり、/dev/logはリンクされているので同じinode 番号かつ同じデータを指すことになります。chrootはこれをストップ できないので全ての仮想/dev/logは機能します。全環境からのメッセージ は一つの場所に記録されます。しかしもしプログラムを書きたくなく、それぞれlog ファイルを分けたいという場合は以下のようにして別々にsyslogを使うこともできま す。
syslog -p /virtual/domain1.com/dev/log 
syslog -p /virtual/domain2.com/dev/log 
もっともこうすることはプロセスIDの浪費なのでお奨めしません。 このバージョンのsyslog.initは、不適切な設定がされている場合には起動する度に 毎回 /dev/log に再リンクしてしまいます。 以下、修正したsyslog.initファイルを挙げておきます。
#!/bin/sh

# Source function library.
. /etc/rc.d/init.d/functions

case "$1" in
  start)
        echo -n "Starting dev log: "
        ln -sf /virtual/log /dev/log
        echo done
        echo -n "Starting system loggers: "
        daemon syslogd -p /virtual/log
        daemon klogd
        echo
        echo -n "Starting virtual dev log: "
        for i in /virtual/*
        do
                if [ ! -d "$i" ]
                then
                        continue
                fi
                if [ "$i" = "/virtual/lost+found" ]
                then
                        continue
                fi
                ln -f /virtual/log $i/dev/log
                echo -n "."
        done
        echo " done"
        touch /var/lock/subsys/syslog
        ;;
  stop)
        echo -n "Shutting down system loggers: "
        killproc syslogd
        killproc klogd
        echo
        rm -f /var/lock/subsys/syslog
        ;;
  *)
        echo "Usage: syslog {start|stop}"
        exit 1
esac

exit 0

一台のディスクに全ての仮想ファイルシステムを置かなくてもよいことに 注意して下さい。もっともディスク上に仮想ファイルシステムを持つ各パーティ ション用のsyslogを実行しなければならないでしょう。


次のページ 前のページ 目次へ