第14章 Sambaシステムコールのトレース

Andrew Tridgell

Samba Team

このファイルは、どのようにSamba上でのシステムコールトレースを行い、何が問題かを 調べる事について説明している。これは気弱な人のためのものではなく、もしもこれを 読んでいるならば、あなたはおそらくせっぱ詰まっているはずだ。

実際、上記で言っているようには、物事はそれほどひどくはなく、ただ出力が汚いだけである :-)

ビジネスの話に戻ろう。UNIXシステムのとても大きな利点の1つは、プログラムが行っている すべてのシステムコールをモニターする事が出来るシステムトレースユーティリティを、ほとんど すべてのシステムがもっていると言うことである。これは特にデバッグのために使われ、また、 なぜ期待していたよりも遅くしか動かないかという問題を調べる手助けにもなる。特に、 何らかの特別なコンパイルオプションなしに、システムトレースを使うことが出来る。

システムトレースユーティリティは異なったシステムでは異なった名前で呼ばれる。Linux システム上では、straceと呼ばれる。SunOS 4では、traceと呼ばれる。SVR4ベースのシステム では(solarisを含む)、trussと呼ばれる。多くのBSDシステムではktraceと呼ばれる。

最初に行うべき事は、使用しているシステム上でのシステムコールトレースユーティリティの マニュアルページを読むことである。以下の議論の中で、straceのみがポータブルなシステム トレースユーティリティ(多くのUNIXマシンで自由に使えるものがある)で、かつ、最も良い ある種の機能をもっているので、これをstraceと呼ぶ。

次に、いくつかの簡単なコマンド上でstraceを使ってみる。例えば、 strace lsstrace echo helloなどである。

これが大量の出力を出すことに注意。これは、プログラムが出すすべてのシステムコールに対する 引数とその結果を表示する。システムコールを出さないプログラムは非常に例外的で、そのため 大量の出力が出る。共有ライブラリなどをロードする事を表示することなどの、大量の"前処理" を生成することにも注意。これは無視すること(それが問題にならない限り!)

例えば、strace echo hello中の、真に重要な行に対する出力は以下の 通りである:

write(1, "hello\n", 6)                  = 6

残りすべてはプログラムを動かすための準備である。

OK,これでstraceになれたはずである。これをSambaに使うためには、動作しているsmbd デーモンに対してstraceする必要がある。それを使うための方法は、まず最初にWindows PC からSambaサーバーにログオンし、次に、そのクライアントが接続しているプロセスIDを、 smbstatusを使って調べ、rootでstrace -p PIDとして、そのプロセスに 接続する。通常後で見るために、このコマンドからのstderr出力をファイルにリダイレクトする。 例えば、もしもcsh風のシェルを使っているならば、

strace -f -p 3872 >& strace.out

かあるいはsh風のシェルを使っているならば:

strace -f -p 3872 > strace.out 2>&1

とする。

"-f"オプションに注意。これは、いくつかのシステムのみで有効であり、現在のプロセス だけではなく、フォークした任意のチャイルドプロセスのトレースも取れるようにする。 これは、"print command"がうまくいかない時に引き起こされる印刷時の問題を見つけるのに とても役に立つ。

一度アタッチすると、問題を引き起こしているクライアント上でのすべての動作を見ることが でき、smbdが発行しているすべてのシステムコールをとらえられる。 Once you are attached you then can do whatever it is on the client that is causing problems and you will capture all the system calls that smbd makes.

次に、どのように結果を解釈したらよいだろうか?。一般的に、問題が発生した時に現れる だろうと思われる、分かっている文字列を、出力全体を通して検索する。例えば、もしも、 ファイルに対するアクセス許可の問題があった場合、straceの出力からそのファイル名を 検索し、その周りの行を眺めてみる。もう一つのテクニックとしては、ファイルディスクリプタの 番号の一致を捜し、それがオープンしてクローズするまでに何があったかを"順に追っていく"。

これを元にして、自分で考えていく必要がある。ここで何を捜すかと言うことのヒントを与える ために、/dev/nullがすべてのユーザーに対して書き込み可能でない場合、 Sambaで印刷が失敗する場合の、strace の結果の一部を提示しよう:

[pid 28268] open("/dev/null", O_RDWR)   = -1 EACCES (Permission denied)
[pid 28268] open("/dev/null", O_WRONLY) = -1 EACCES (Permission denied)

プロセスは最初に/dev/nullを読み書き可能で開こうとし、次に、 リードオンリで開こうとする。両方とも失敗する。これは、/dev/nullが 適切なアクセス許可をもっていないことを意味する。