KLOGD(8) Linux System Administration KLOGD(8) 名前 klogd - カーネルログデーモン 書式 klogd [ -c n ] [ -d ] [ -f fname ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ] [ -k fname ] [ -v ] [ -x ] [ -2 ] 説明 klogd は Linux のカーネルメッセージを捕え記録するシステムデーモンである 。 オプション -c n コンソールに出力するログのレベルの既定値を n にする。 -d デバッグモード。これは大量に stderr に出力する。 -f file syslog の facility ではなくて指定した名前のファイルにメッセージ を記録する。 -i -I 現在実行されている klogd デーモンにシグナルを送る。どちらのオ プ シ ョンもシンボル情報を(再)読み込みするように指示する。 -iオプシ ョンはカーネルモジュールシンボルを再読み込みさせる。 -Iオプシ ョ ンは静的カーネルシンボルとカーネルモジュールシンボルの両方を再読 み込みさせる。 -n 自動的なバックグラウンドへの移行を抑止する。こ れ は klogd が init(8) により起動および制御される場合にのみ必要である。 -o ‘ワンショット’モードで実行する。klogd はカーネルメッセージバッフ ァに存在する全てのメッセージを読み出し記録する。一回の読み出しと 記録ののちデーモンは終了する。 -p パラノイアモード。klog がいつカーネルモジュールシンボルを読み込 むかを指定する。このオプションを設定すると、カーネルメッセージス トリームに "Oops" の文字列が流れる毎にカーネルモジュールシンボル の情報を読み込む。 -s klogd はカーネルメッセージバッファとのインターフェイスにシステム コールの使用を強行する。 -k file カーネルシンボル情報を指定した名前のファイルから取得する。 -v バージョンを出力し、終了する。 -x EIP 変換を抑制し、 System.map を読み込まない。 -2 シンボルが展開された時、アドレスをシンボルに変換したものと生テキ ストの 2 回表示する。これにより、ksymoops のような外部プログラム が変換される前のデータを使って処理を行えるようになる。 概説 klogd の機能はよく他の版の syslogd に編入されてしまいがちであるが、それ はあまり良い方法とは思われない。最近の Linux カーネルにおいては、情報源 の 特定、順位付け、カーネルアドレスの解決など多くのメッセージに関する問 題を扱わなければならない。カーネルロギングを個別のプロセスとすること は 、各種サービスの分割を明確なものにする。 Linux ではカーネルログ情報の情報源として二つの可能性がある。 /proc ファ イルシステムと syscall (sys_syslog) インターフェースであるが、突き詰 め ていけばこれらは同じ一つのものである。 klogd は最もふさわしい情報として どちらかを選択するように設計されている。最初に、実際にマウントされて い る /proc ファイルシステムを確認する。もしそこに /proc/kmsg ファイルがあ れば、それをカーネルログ情報の情報源として利用する。もし proc ファイ ル システムがマウントされていなければ、 klogd はカーネルメッセージの取得に システムコールを利用する。コマンドラインスイッチの (-s) は klogd にその 情報源としてシステムコールの利用を強行させる。 も し カ ー ネルメッセージが syslogd デーモンに振り向けられたとしても、 version 1.1 の klogd デーモンはその優先順位を適切に判定することが可能で あ る。カーネルメッセージの優先順位付けは version 0.99pl13 あたりのカー ネルで実装された。生のカーネルメッセージの形式は次の通り: <[0-7]>カーネルからの出力 カーネルメッセージの優先順位は <> 括弧に閉じられた一桁の数字に変換さ れ る。この数値はカーネルの include ファイル kernel.h で定義されている。カ ーネルからメッセージを受けると klogd デーモンはこの優先順位を読み取り、 適 切な syslog のメッセージレベルに割り付ける。 (-f) によってファイルへ の出力が指示されている場合には、カーネルメッセージに優先順位番号が残 さ れる。 klogd デーモンはカーネルメッセージの出力先をシステムコンソールへ変更す ることもできる。カーネルによって優先順位が付けられる結果として、メッ セ ー ジはそれぞれデフォルトの既定のカーネルへのメッセージレベルが割り当て られている。手を加えていないカーネルのデフォルトのコンソールへのメッ セ ージレベルは 7 に設定されている。7 よりも小さい(つまり高い)優先順位レベ ルを持つメッセージはコンソールに出力される。 レベル 7 の優先順位を持つメッセージは ‘debug’ メッセージとみなされ、 コ ン ソールには出力されない。特にマルチユーザ環境における、多くのシステム 管理者は全てのカーネルメッセージを klogd により管理させ、フ ァ イ ル か syslogd デーモンに渡したいと思うだろう。そうすれば、プリンタの用紙切れ とかディスクの交換検出のような‘わずらわしい’メッセージのコンソールへ の 出力を避けることができる。 -c オプションが指定されると、 klogd デーモンはコンソールに表示される全 てのカーネルメッセージを抑制するシステムコールを実行する。以前のバー ジ ョンでは常にこのシステムコールが実行され、そのデフォルトは panic を除く すべてのカーネルメッセージであった。最近のバージョンでは少し違う扱い を し ており、もはやこのオプション値を設定する必要はない。 -c オプションの 引数にはコンソールへ出力すべきメッセージの優先順位レベルを指定する。 指 示 される数字「よりも小さい」優先順位値を持つメッセージがコンソールへ出 力される、という点に注意すること。 たとえば、優先順位値が 3 (KERN_ERR) かそれよりも重要なすべてのメ ッセージをコンソールに出力するためには、次のコマンドを実行する: klogd -c 4 カ ーネルメッセージの(優先順位の)数値は、カーネルのソースコードがインス トールされているのであれば、 /usr/include/linux にある kernel.h ファ イ ル で定義されている。これらの数値は /usr/include/sys サブディレクトリに ある syslog.h ファイルでの優先順位値の定義に対応している。 klogd デーモンはカーネルメッセージを読み出す ’ワンショット’ モードも 利 用 可能である。ワンショットモードはコマンドラインの -o オプションで指示 される。その出力は syslogd デーモンに渡されるか -f スイッチが指定されて いれば代りのファイルに書き出される。 たとえば、システムがブートした際のカーネルメッセージを全て読み出 して、それを krnl.msg という名前のファイルに記録するには次のコマ ンドを実行する。 klogd -o -f ./krnl.msg カーネルアドレスの解決 カ ーネルが内部エラー状態を検出すると、一般保護違反 (General Protection Fault) が発生する。 GPF 処理手続きの一部として、カーネルは違反が発生 し た 時点でのプロセッサの状態を示すステータス報告を表示する。この表示には プロセッサのレジスタの内容、カーネルスタックの内容、違反が発生した時 に どの関数が実行されていたかのトレースが含まれる。 この情報は内部エラー状態が発生した原因を特定するために 極めて重要である 。カーネル開発者がこの情報を分析しようとすると、困難が生じる。なぜな ら カ ーネルは全て同じなわけではなく、変数の位置や関数のアドレスはカーネル ごとに異なるからである。エラーの原因を診断するためには、カーネル開発 者 は 特定のカーネルの、どの関数や変数位置がエラーに関係したかを知る必要が ある。 カーネルコンパイル処理の一部として、コンパイルされたカーネルにおける 重 要な変数と関数のアドレスを記した一覧が作成される。この一覧は カーネルデ ィレクトリソースツリーのトップに System.map という名前で作成される。 こ の 一覧を使って、カーネル開発者はエラー状態が発生した時にカーネルが何を していたかを正確に知ることができる。 保護違反の表示から数値表現のアドレスを解決する処理は、手動かまたはカ ー ネルソースに含まれる ksymoops プログラムを使って行なわれる。 利便性のために、 klogd はカーネルの数値表現のアドレスを、それらのシンボ ル表現に変換しようとする。ただし実行時にカーネルのシンボルテーブルが 必 要 である。もしシンボルの元のアドレスも必要な場合は、 -2 を使うと数値ア ドレスも保存される。シンボルテーブルはコマンドラインの -k オプション を 用 いて指定する。シンボルファイルが明示されない場合は、次の順番でファイ ルを探す: /boot/System.map /System.map /usr/src/linux/System.map カーネル 1.3.43 のシステムマップから、バージョン情報も提供されるよう に な っている。バージョン情報はシンボルテーブルのリストを解析検索する際に 利用される。この機能は(カーネルの)安定版と先進版の両方で提供されてい る ので (その判別に)役に立つ。 た とえば、安定版のカーネルはそのマップファイルを /boot/System.map に持 っている。もし先進版のカーネルが /usr/src/linux の ‘標準の’ 配置でコ ン パ イルされているのであれば、システムマップは /usr/src/linux/System.map に存在する。klogd は先進版のもとで起動する時 に は /usr/src/linux/Sys- tem.map マップファイル を優先して利用し、 /boot/System.map マップファイ ルは無視する。 1.3.43 以降の最近のカーネルでは klogd がきちんと理解し、変換できるよ う に 重要なカーネルアドレスは適切に整列されている。それ以前のカーネルはカ ーネルのソースコードへのパッチが必要であり、そのパッチは sysklogd の ソ ースコードと共に提供されている。 カ ーネル保護違反の分析処理は、静的カーネルに対しては非常にうまくいく。 ローダブルカーネルモジュールで発生したエラーを診断しようとするとさら な る 困難に出会うことになる。ローダブルカーネルモジュールはカーネルの機能 の一部を自由にロードしたりアンロードしたりするのに用いられる。ローダ ブ ル モジュールはデバッグの観点から有用であり、カーネルが必要とするメモリ の量を減らすのにも有用である。 ローダブルモジュールのエラー診断が困難なのは、カーネルモジュールが動 的 で あるということによる。モジュールがロードされるとカーネルはモジュール を保持するためのメモリを確保し、モジュールがアンロードされるとこのメ モ リ はカーネルに返される。動的にメモリが確保されるため、カーネルローダブ ルモジュールの変数や関数のアドレスの詳細を記したマップファイルを作成 す る ことは不可能である。マップファイルなしではカーネルモジュールによる保 護違反が発生した時にカーネル開発者が何が悪いのかを判断することは不可 能 である。 klogd はカーネルローダブルモジュールで発生した保護違反を診断する際に生 じるこの問題を扱えるようになっている。プログラム開始時やシグナルを受 け 取 った時に、klogd は全てのロードされているモジュールとそれらがロードさ れているメモリアドレスの一覧を問い合わせる。これらの外部シンボルのア ド レスもこの問い合わせ処理の間に決定される。 保 護違反が発生すると、静的シンボルテーブルからカーネルアドレスの解決を 試みる。これに失敗した場合、現在ロードされているモジュールのシンボル を 用いてアドレスの解決を試みる。これにより、最小限ではあるが、 klogd は保 護違反を起こしたローダブルモジュールがどれかを示すことができるように な る 。もしモジュール開発者がモジュールからシンボル情報をエクスポートする ようにしていれば、追加の情報も得られる。 カーネルモジュールのアドレスを適切かつ正確に解決するためには、カーネ ル モ ジ ュールの状態が変わる度にそれを klogd に知らせる必要がある。 -i と -I オプションは現在起動しているデーモンにシンボル情報を再読み込みするよ う に指示するために使われる。ほとんどの場合、適切にモジュールシンボルを 解決させるために必要なのは -i オプションである。カーネルモジュールが 追 加または削除される度に、以下のコマンドを実行するべきである。 klogd -i -p オプションもカーネルシンボル情報が最新であることを保証するために用い られる。このオプションは、保護違反が発生する度に klogd にモジュールシン ボ ル情報を再読み込みするように指示する。プログラムを「パラノイア」モー ドで動かす前に注意してほしい。保護違反が発生した時のカーネルと実行環 境 の 安定性は常に疑問である。モジュールシンボル情報を読み込むために klogd デーモンがシステムコールを実行する必要があるため、システムが不安定に な っ て有用な情報が得られなくなる可能性がある。モジュールがロード・アンロ ードされた時に klogd (の情報)が更新されることを保証する方が遥かによい方 法 である。最新のシンボル情報をあらかじめ読み込んでおくことにより、保護 違反が起きた時にそれを正しく解決する可能性が上昇する。 sysklogd のソースパッケージには modules-2.0.0 パッケージに対するパッ チ が含まれている。このパッチを適用すると、 insmod, rmmod, modprobe を使っ てカーネルにモジュールを追加・削除した時に自動的に klogd にシグナルを送 るようになる。 シグナルの処理 klogd は 以 下の 8 種類のシグナルに反応する: SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGTSTP, SIGUSR1, SIGUSR2, SIGCONT 。このうち SIGINT, SIGKILL, SIGTERM, SIGHUP の各シグナルはデーモンにカーネルログの生成源を閉じさせ 、適切に終了させる。 SIGTSTPと SICONT の両シグナルはカーネルロギングの開始と終了のために利用 される。 SIGTSTP シグナルを受信するとデーモンはそのログの生成源を閉じ、 アイドルループに突入する。その次に SIGCONT を受信するとデーモンは初期化 を 実 行したのち、その入力源を再度選択し実行を再開する。 SIGSTOPと SIG- CONT の組合せは無停止でカーネルログの入力源を再選択させることができる。 例 えば、/proc ファイルシステムの利用を解除するには次の順番でコマンドを 実行すればよい: # kill -TSTP pid # umount /proc # kill -CONT pid LOG_INFO 優先順位を持つシステムログがその停止/再開を記録する。 SIGUSR1 と SIGUSR2 はカーネルシンボル情報を(再)読み込みさせるために用い る 。 SIGUSR1 はカーネルモジュールシンボルを再読み込みさせる。 SIGUSR2 は静的カーネルシンボルとカーネルモジュールシンボルの両方を再読み込み さ せる。 System.map ファイルが適切な位置に置かれているなら、最も有効なシグナルは 一般に SIGUSR1 である。このシグナルはカーネルモジュールが(再)読み込みさ れ た時のために用意されている。カーネルモジュールの状態が変わった後にこ のシグナルをデーモンに送れば、カーネルモジュールが占めているアドレス 空 間で保護違反が起きた時に適切にシンボルを解決できることが保証される。 ファイル /proc/kmsg klogd の記録するカーネルメッセージ源の一つ /var/run/klogd.pid klogd のプロセス id が記録されているファイル /boot/System.map, /System.map, /usr/src/linux/System.map カーネルシステムマップのデフォルト位置 バグ 多分、沢山。整理されたコンテキスト diff を送ってくれれば歓迎します。 著者 klogd の オ リジナルは Steve Lord (lord@crya.com)によって書かれ、Greg Wettstein が多くの改善を施した。 Dr. Greg Wettstein (greg@wind.enjellic.com) Enjellic Systems Development Oncology Research Divsion Computing Facility Roger Maris Cancer Center Fargo, ND 58122 Version 1.4 21 August, 1999 KLOGD(8)
コロナウイルスの日ごとの感染者数・死者数をグラフ化してみました。どの国が増加傾向にあり、どの国が終息に向かっているかを視覚化しています。
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa