Tiny Core Linuxでのsyslogd出力先の変更 / How to change syslogd output directory in Tiny Core Linux

  • 投稿日:
  • 更新日:2015/02/28
  • by
  • カテゴリ:

(English below)

Tiny Core Linuxでは、syslogdを起動時に実行することができますが、私が知る限りオプションを指定することができません。 syslogdをブート時に実行したい場合は、/mnt/sda1/tce/boot/extlinux/extlinux.confに以下のように記述します。

DEFAULT core
LABEL core
KERNEL /tce/boot/vmlinuz
APPEND initrd=/tce/boot/core.gz quiet \
 waitusb=5:UUID="123456678-1234-1234-1234-123456789012" \
 tce=UUID="123456678-1234-1234-1234-123456789012" syslog

APPENDの行は表示の都合で3行書いていますが、実際には1行です。赤字部分がsyslog出力指定です。 デフォルトの出力先は/var/log/messagesなのですが、これを別の場所に変更したいことがあります。 特に、通常/var/log/ディレクトリはRAM内なので、リブートすると消えてしまうため、永続化できる場所に出力したいためです。 これには以下の3つの問題があります。

  • Tiny Coreで使っているsyslogdはBusyBoxなのでオプションがフルバージョンと異なり、出力先等を/etc/syslog.confで設定できない(起動時の-Oオプションによる指定のみ)
  • extlinux.confでのsyslog指定ではオプションを記述できない
  • 仮にオプション指定できたとしても、出力先がブート後にfstabでマウントされる場所の場合、最初の記録が残らない

そのため、このあたりをブートスクリプトで解決することにしました。

方法は難しくはありません。 例えば、出力先が/usr/local/var/log/messages だったとすると、/opt/bootlocal.shの最後に以下のように記述します。

if [ -e /usr/local/var/log/messages ]; then
cp /usr/local/var/log/messages /usr/local/var/log/messages.`date +%Y%m%d%H%M`
fi
kill `cat /var/run/syslogd.pid`
cp /var/log/messages /usr/local/var/log/messages
syslogd -O /usr/local/var/log/messages -s 1000 -b 99

ここでは、以下のようなことをしています。

  • (1-3行目)これまで/usr/local/var/log/messagesにログが存在すれば(再起動前のもの)、これをリネームする(たとえばmessages.201412261200などとなります)。 これは簡易logrotateなのですが、必要ない場合は1-3行目を消し、5行目のcpを
    cat /var/log/messages >> /usr/local/var/log/messages
    
    としてもいいかと思います。こうするとsyslogdのデフォルトのローテート機能のみが使われる形になります(messages.0などのファイル名になる)。
  • (4行目)現在のsyslogdを落とす
  • (5行目)これまでに/var/log/messagesに出力された内容を/usr/local/var/logにコピーする
  • (6行目)改めて出力先オプションを付けてsyslogdを起動しなおす。
    ついでに-sオプション(ログをローテートするまでのサイズ、kB単位)と-bオプション(ローテートする数)を指定して、長時間駆動に対応しています。

この作業はbootlocal.shの最後で行う、つまり通常はすべてのファイルシステムのマウントが終了してから行うことになるため、/usr/local/var/logがどのディスクに存在していても問題ありません。 実際私は/usr/local/var/を永続化されているファイルシステム(/mnt/sda1など)にシンボリックリンクを張って使っています。 このシンボリックリンクを作る作業ははbootlocal.shの少し前のほうで行えばokです。

(Updated 23 Jan 2015) syslogd再立ち上げ時にlogrotate関連の設定を追加するようにしました。

(最後に飛ぶ)

You can run syslogd at the bootup time in Tiny Core Linux, but you cannot specify any option as far as I know. If you want to start syslogd at bootup, You can specify /mnt/sda1/tce/boot/extlinux/extlinux.conf as follows.

DEFAULT core
LABEL core
KERNEL /tce/boot/vmlinuz
APPEND initrd=/tce/boot/core.gz quiet \
 waitusb=5:UUID="123456678-1234-1234-1234-123456789012" \
 tce=UUID="123456678-1234-1234-1234-123456789012" syslog

The APPEND line is actually just one line but I described three lines just for the display purpose. The default log output directory is /var/log/messages, but you may want to change it to the different (persistent) location, as /var/log is in RAM area as the default frugal install and will be vanished when rebooting. There are three issues for doing this:

  • The default syslogd program in Tiny Core / Microcore is in Busybox tool and has the different options, hence the configuration cannot be set in /etc/syslogd.conf and all you can do is the command line option such as -O to alternate output file.
  • You cannot specify command line options in extlinux.conf at bootup time.
  • Even if you can specify command line option in extlinux.conf such as -O, it is not possible to output the earliest log to the disk that is mounted in fstab.

I've resolved these issues in a boot srcript.

Actually it is not very difficult. Say you want to output the log to /usr/local/var/log/messages, you can describe the following at the end of /opt/bootlocal.sh .

if [ -e /usr/local/var/log/messages ]; then
cp /usr/local/var/log/messages /usr/local/var/log/messages.`date +%Y%m%d%H%M`
fi
kill `cat /var/run/syslogd.pid`
cp /var/log/messages /usr/local/var/log/messages
syslogd -O /usr/local/var/log/messages -s 1000 -b 99

What we do here is:

  • (Line 1-3) If we already have /usr/local/var/log/messages, rename it with date such as messages.201412261200. This is my simple version of logrotate. If you don't prefer this, you omit these lines 1-3 and change cp command in line 5 to:
    cat /var/log/messages >> /usr/local/var/log/messages
    
    then the messages file would be only rotated by syslogd, i.e. the file name would be like "messages.0" when rotated.
  • (Line 4) Kill the current syslogd
  • (Line 5) Copy already existing log in /var/log/messages to /usr/local/var/log .
  • (Line 6) Re-launch syslogd with output file name command line option.
    The command also comes with -s option (maximum log file size before rotation, kB) and -b option (the number of rotated log files to keep) to support long-time operation before rebooting.

This process is executed at the last part of bootlocal.sh, that is, normally after all the file system have been mounted. So /usr/local/var/log can be at any disk. Actually I'm using this mechanism with making a symbolic link (in earlier part of bootlocal.sh) from /usr/local/var/ to a parmanent file system (such as /mnt/sda1/).

(Updated 23 Jan 2015) logrotate-related options have been added to syslogd execution.

こちらもよく読まれています