ゼロスピンドル 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 の振る舞いは大体わかったのですがどう対処すればいいでしょうか?
- /var/log を tmpfs にするのをやめる
- /var/log マウント後,fsck を起動する前に /var/log/fsck を作成する
- fsck が起動した後でもいいので /var/log/fsck を作成する
- fsck を起動するスクリプトを探して logsave で出力するファイルのパスを /var/log/checkroot とかに変更する
ではここから先は読者への宿題*3ということにしましょう(嘘).