第2回 PD思考法の基礎と情報収集(その2)障害発生時の金科玉条(1/3 ページ)

Linux環境で問題が発生した場合、管理者がするべきことは「その原因がどこにあるか」の正確な把握である。今回は、発生した問題に対し原因がどこにあるかを判別するための基本的な考え方と、問題判別に必要な情報収集の基礎について解説しよう。

» 2005年12月15日 17時00分 公開
[秋田英行(日本アイ・ビー・エム),オープンソースマガジン]

情報収集のポイント

 PDにおいて、問題を特定するために情報収集は必要不可欠である。実際に収集すべき情報はケースに応じて異なるが、問題自体に関する記録がないからといって、不要な情報であるとは限らない。情報の収集は、問題そのものを直接に特定するほか、システムの構成や問題点を絞り込むための要素を見つけるためにも必要である。そのことを認識して、情報収集を行っていただきたい。

 Linuxで取得できる情報には、OSやユーザープロセスの稼働に関するものと、ハードウェア関連の構成に関するものがある。また、ハードウェアの稼働に関する情報はBIOSから直接取得するほか、最近のIA系ハードウェア*でよく見られる管理プロセッサ*を通しても取得できる。まず、PDを行う上で、Linuxから取得できる情報についてまとめてみよう。

ログファイルとロギングの仕組み

 さて、PDの基礎として、ログを読み取ることは基本中の基本である。そこで、まずLinuxのロギングの仕組みとその特性を理解しておこう。いまさらと感じる方も多いとは思うが、復習の意味合いも兼ねて目を通していただければ幸いである。

 そもそも、Linuxのロギングはklogdとsyslogdというデーモンによって行われている。カーネルから上がるメッセージはリングバッファ*に格納され、klogdはリングバッファにマップされている仮想ファイル*である、/proc/kmsg経由でカーネルメッセージを抽出する。klogdが抽出したメッセージはsyslogdに渡され、syslogdはメッセージが持つログレベルと自身の設定によってログに記録する。Linuxではこのような仕組みによって、ログが作成されるのである。これらの相関関係を示したのが図4になる。なお、表2が一般的にLinuxシステムで記録されている/var/log以下の主なログである。

図4 図4 ロギングシステムの相関図
表2 表2 /var/log以下の主なログファイル

カーネルメッセージとklogd

 カーネルメッセージとは、カーネル領域で実行されるモジュールがprintk()関数を呼び出すことで出力されるメッセージである。printk()は与えられたメッセージに指定されたログレベルを付加してリングバッファに格納する、という動作を行う。

 一方、klogdはリングバッファ経由でカーネルメッセージを取得し、メッセージを抽出してsyslogdへと送信するほか、付加されているログレベルがあらかじめ設定されているコンソールログレベルよりも小さければコンソールにメッセージを出力する。

 ログレベルは/usr/src/linux/include/kernel.hで定義されており(リスト1)、数値が小さいほど重要なメッセージであることを表している。

リスト1 リスト1 定義されているログレベル

printk関数の使用例

 リスト2は、カーネルメッセージを出力するサンプルプログラムである。このプログラムは、モジュールの読み込み時と取り外し時にログレベルKERN_ALERTでカーネルメッセージを出力するものだ。

/* hello.c - kernel message sample program */
#define MODULE
#include <linux/module.h>
int init_module(void) {printk("<1>Hello, \n"); return 0;}
void cleanup_module(void) {printk("<1>Goodbye \n");}
リスト2 カーネルメッセージを出力するサンプルプログラム(hello.c)

 この例のように、カーネル領域で実行される各機能やデバイスドライバにはprintk()が実装されており、ソースコード内の至るところで確認できる。

 また、実行例1はこのプログラムをコンパイルし、カーネルモジュールとして組み込んだ例である。リングバッファと/var/log/messagesファイルそれぞれにメッセージが送られていることが確認できる。

# gcc -c hello.c

# insmod hello.o

# dmesg | grep -i hello

Hello,

# cat /var/log/messages | grep -i hello

Sep 14 23:58:52 lsc02 kernel: Hello,

# /sbin/rmmod hello


実行例1 カーネルメッセージの出力例

コンソールログレベルの設定

 コンソール出力を行うログレベルであるコンソールログレベルの変更は、仮想ファイル/proc/sys/kernel/printkの値およびklogdに与えるパラメータを変更することで行える。現在のコンソールログレベルを確認するには、実行例2のようにすれば良い。それぞれのパラメータの意味は表3のようになっている。 また、klogd起動時に与える引数でもコンソールログレベルは指定できる。

# klogd -c <ログレベル>


実行例2 実行例2 コンソールログレベル情報の取得

 

表3 /proc/sys/kernel/printkにおける各パラメータの意味
パラメータ 意味
console_loglevel 現在のコンソールログレベル
default_message_level ログレベルが指定されていないメッセージに付加するログレベル
minimum_console_loglevel コンソールログレベルに設定できる最小のログレベル
default_console_loglevel デフォルトのコンソールログレベル

 ただし、/proc/sys/kernel/printk中のminimum_console_loglevel値よりも小さいログレベルを指定した場合は、コンソールログレベルは強制的にminimum_console_loglevelの値に設定される。また、引数でログレベルを指定しない場合、コンソールログレベルはdefault_console_loglevelの値に設定される。

このページで出てきた専門用語

最近のIA系ハードウェア

IAとはIntel Architectureのこと。主にIntelまたはその互換CPUを載せたマシン。

管理プロセッサ

CPUとは別にシステムやハードウェアを監視する専用のプロセッサ。OS自体がダウンしても、システムやハードウェアに関する情報を取得できる。

リングバッファ

メモリ領域を仮想的にリング上につなぐことで、無限長のバッファを仮想的に構築する方法。

仮想ファイル

ストレージ上には実際には存在せず、OSが仮想的に提供するファイル。


       1|2|3 次のページへ

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.