日記帳

日記です。

ゼロスピンドル Let's note W2 で Debian 4.0 Etch

http://d.hatena.ne.jp/sa-y/20070627 の続き.

/var/log の tmpfs 化と logsave

問題なさそうに見えた /var/log の tmpfs 化ですがよく見ると問題ありでした.

% ps ax | grep '/var/log'
 1614 ?        Ss     0:00 logsave -s /var/log/fsck/checkroot fsck -C -a -t ext3 /dev/hda1
 1736 ?        Ss     0:00 logsave -s /var/log/fsck/checkfs fsck -C -R -A -a
 2289 tty1     S+     0:00 grep /var/log

普段見なれない logsave というプロセスが動いています.

% man logsave

logsave*1 は引数で指定したプロセスを実行してその出力のコピーを指定したログファイルに保存してくれるコマンドのようです.

上の例の場合は fsck*2ファイルシステムのチェックをした結果を /var/log/fsck/checkroot ファイルに保存するということのようですね….

logsave はどのパッケージに所属するコマンドなのでしょうか?

% which logsave
/sbin/logsave
% dpkg -S `!!`
dpkg -S `which logsave`
e2fsprogs: /sbin/logsave

logsave は e2fsprogs パッケージの一部らしいです.まさに fsck と合せて使うために作られたツールってことでしょうかね?

しかし /var/log を tmpfs 化した影響でログを出力しようとした /var/log/fsck というディレクトリが存在しなくなったのでコマンドが完了しないようです.う〜ん….そういう仕様のコマンドなのでしょうか….だとしたら微妙な仕様な気もしますが….

ちょっとテストしてみましょう.とりあえず普通に使ってみます.

% cd /tmp
% logsave -s /tmp/ls.log ls -la
total 8
drwxrwxrwt  4 root root  100 Jun 30 09:49 .
drwxr-xr-x 22 root root 4096 Jun 18 11:37 ..
drwxrwxrwt  2 root root   40 Jun 30 09:32 .ICE-unix
drwxrwxrwt  2 root root   40 Jun 30 09:32 .X11-unix
-rw-r--r--  1 root root   41 Jun 30 09:49 ls.log
% cat /tmp/ls.log 
Log of ls -la 
Sat Jun 30 09:49:45 2007

total 8
drwxrwxrwt  4 root root  100 Jun 30 09:49 .
drwxr-xr-x 22 root root 4096 Jun 18 11:37 ..
drwxrwxrwt  2 root root   40 Jun 30 09:32 .ICE-unix
drwxrwxrwt  2 root root   40 Jun 30 09:32 .X11-unix
-rw-r--r--  1 root root   41 Jun 30 09:49 ls.log

Sat Jun 30 09:49:45 2007
----------------

指定したファイルのヘッダにコマンドラインと開始時間,フッタとして終了時間が挿入されてログファイルに残るようです.

% cd /tmp
% logsave -s /tmp/no_such_directory/ls.log ls -la
total 8
drwxrwxrwt  4 root root  100 Jun 30 09:49 .
drwxr-xr-x 22 root root 4096 Jun 18 11:37 ..
drwxrwxrwt  2 root root   40 Jun 30 09:32 .ICE-unix
drwxrwxrwt  2 root root   40 Jun 30 09:32 .X11-unix
-rw-r--r--  1 root root   41 Jun 30 09:49 ls.log

存在しないディレクトリにログを出力させようとしても ls コマンドは正常に終了するようです.

% ps ax | grep logsave
 1614 ?        Ss     0:00 logsave -s /var/log/fsck/checkroot fsck -C -a -t ext3 /dev/hda1
 1736 ?        Ss     0:00 logsave -s /var/log/fsck/checkfs fsck -C -R -A -a
 2388 ?        Ss     0:00 logsave -s /tmp/no_such_directory/ls.log ls -la
 2290 tty1     S+     0:00 grep logsave

でも logsave プロセスは終了せずにそのまま残ってしまいました….なんだかなーと思いつつちょっと考えてこの状態でディレクトリを作ってみました.

% mkdir /tmp/no_such_directory
% ps ax | grep logsave
 1614 ?        Ss     0:00 logsave -s /var/log/fsck/checkroot fsck -C -a -t ext3 /dev/hda1
 1736 ?        Ss     0:00 logsave -s /var/log/fsck/checkfs fsck -C -R -A -a
 2320 tty1     S+     0:00 grep logsave
% ls /tmp/no_such_directory
ls.log

logsave プロセスが一個減って /tmp/no_such_directory/ls.log が生成されてる….なるほど,こういう動きをするですかー.

% mkdir /var/log/fsck
% ps ax | grep logsave
 2421 tty1     S+     0:00 grep logsave
% ls /var/log/fsck
checkfs  checkroot

さて,logsave の振る舞いは大体わかったのですがどう対処すればいいでしょうか?

  1. /var/log を tmpfs にするのをやめる
  2. /var/log マウント後,fsck を起動する前に /var/log/fsck を作成する
  3. fsck が起動した後でもいいので /var/log/fsck を作成する
  4. fsck を起動するスクリプトを探して logsave で出力するファイルのパスを /var/log/checkroot とかに変更する

ではここから先は読者への宿題*3ということにしましょう(嘘).