SNMP サービス導入
ネットワークは常時正常に動作していることが求められる。そのためには,構築後にも放置せず定期的にメンテナンスする必要がある。日々管理を行うための具体的な方法としては,サーバが書き出すログ情報を見たり,セキュリティホールを埋めるパッチを当てたりと,きめ細やかな配慮が必要だ。
しかしこれらの作業だけでなく,ハードウェアや回線のトラブルがなく,ネットワークに接続されている機器類が正常に動作しているのかどうかを調べることも,安定した動作を保つのに欠かせないことだ。このようなネットワーク機器の監視を行う場合に便利なのが,「SNMP(Simple Network Management Protocol)」の利用である。本稿では,SNMPを使い,MRTGと組み合わせてネットワークモニタリングを行う方法を解説しよう。
proc行
procの設定では,どのプロセスをSNMPから監視したいのかを指定する。proc行の設定書式は次のようになっている。
プロセス名には,SNMPから監視したいプロセス名を,ps -eコマンドの出力で得られる形で指定する。そして,最大数の部分には,「このプロセスが最大いくつ存在する場合にエラーとして記録するのか」,最小数の部分には,「このプロセスが最低いくつ存在しない場合にエラーとして記録するのか」をそれぞれ指定する。最大数を省略した場合には無限大,最小数を省略した場合には1を指定したものとみなされる。
デフォルトのsnmpd.confファイルには,次のようなproc行がある。
procmountd
procntalkd 4
procsendmail 10 1 |
この意味は次の通りである。
- moutdプロセスが1つも存在しない場合にはエラーとして記録
- ntalkdプロセスが4つ以上存在する場合にはエラーとして記録
- sendmailプロセスが1つも存在しない場合,もしくは,10個以上存在する場合にはエラーとして記録
記録情報は,prTableサブツリー(1.3.6.1.4.1.2021.2)内に含まれる。proc行で指定した情報は,snmpd.confファイルに登場する順番で,先頭から1,2,3,…というインデックス番号が振られる。この例でいえば,mountdが1,ntalkdが2,sendmailが3にそれぞれ対応する。そしてprTableサブツリーには,配列のような形で各データが保存される(Table 10)。
Table 10 prTableサブツリー(1.3.6.1.4.1.2021.2)
OID |
1.3.6.1.4.1.2021.2.1 |
サブツリー名 |
prEntry |
用途 |
プロセスの情報一覧を含むテーブルを構成する階層ツリー。値はない |
OID |
1.3.6.1.4.1.2021.2.1.1.i |
サブツリー名 |
prIndex |
用途 |
このプロセス情報に割り当てられたインデックス番号。proc行の登場する順に,1,2,…と割り当てられる。iと同じ |
OID |
1.3.6.1.4.1.2021.2.1.2.i |
サブツリー名 |
prNames |
用途 |
proc行のプロセス名に指定したプロセス名 |
OID |
1.3.6.1.4.1.2021.2.1.3.i |
サブツリー名 |
prMin |
用途 |
proc行の最小値に設定した値 |
OID |
1.3.6.1.4.1.2021.2.1.4.i |
サブツリー名 |
prMax |
用途 |
proc行の最大値に設定した値 |
OID |
1.3.6.1.4.1.2021.2.1.5.i |
サブツリー名 |
prCount |
用途 |
prNamesに指定されたプロセスが現在動いている数 |
OID |
1.3.6.1.4.1.2021.2.1.100.i |
サブツリー名 |
prErrorFlag |
用途 |
エラーとなった場合1が設定される。エラーとなっていない場合0が設定される |
OID |
1.3.6.1.4.1.2021.2.1.101.i |
サブツリー名 |
prErrMessage |
用途 |
prErrorFlagが1になったとき,エラーメッセージが格納される |
OID |
1.3.6.1.4.1.2021.2.1.102.i |
サブツリー名 |
prErrFix |
用途 |
管理者がこのオブジェクトに1を設定すると,あらかじめsnmpd.confファイルのprocfix行で指定したコマンドが実行される |
OID |
1.3.6.1.4.1.2021.2.1.103.i |
サブツリー名 |
prErrFixCmd |
用途 |
prErrFixに1が設定されたときに実行されるコマンド名 |
|
※iはインデックス番号。snmpd.confファイル中に出てきたproc行の登場順に,先頭から1,2,3,…という値。
snmpd.confファイルのproc行の設定で指定した条件がエラーとなった場合,1.3.6.1.4.1.2021.2.1.100.iの値が1となり,そのエラーメッセージが1.3.6.1.4.1.2021.2.1.101.iに格納される(iはインデックス番号)。デフォルトのsnmpd.confファイルの設定であれば,次のような動作をすることになる。
- mountdプロセスが1つも存在しない場合
1.3.6.1.4.2021.2.1.100.1の値が1。1.3.6.1.4.2021.2.1.101.1の値がそのエラーメッセージ。
- ntalkdプロセスが4つ以上存在する場合
1.3.6.1.4.2021.2.1.100.2の値が1,1.3.6.1.4.2021.2.1.101.2の値がそのエラーメッセージ。
- sendmailプロセスが1つも存在しないか10個以上存在する場合
1.3.6.1.4.2021.2.1.100.3の値が1,1.3.6.1.4.2021.2.1.101.3の値がそのエラーメッセージ。
このようにproc行を指定するとプロセスの状態が監視できるので,SNMPを通じて,特定のプロセスが何らかのトラブルにより消滅してしまったり,処理の増加により予想以上に増えてしまったりしたときの情報を取得できるというわけだ。
proc行をどのように設定すればよいのかは,Linux上で動作しているどのプロセスを監視したいのかによる。たとえば,デフォルトの設定をすべてコメントアウト(先頭に“#”を挿入する)し,sendmail,httpd,named,syslogdの4つのプロセスを管理するには,次のようにproc行を設定すればよい
proc sendmail 10 1
proc httpd 20 1
proc named
proc syslogd |
snmpd.confファイルを変更した場合,それを反映させるためには,snmpdに対してkill -HUPを実行しなければならない。kill -HUPを実行するには,次のようにする。
$ ps -ax | grep snmpd<--- プロセス番号を調べる
30711 ?S0:14 [snmpd] <--- プロセス番号は30711
$ su <--- rootユーザーとしてログインする
Password:rootユーザーのパスワードを入力する
# kill -HUP 30711 <--- psコマンドで参照したプロセス番号に対してkill -HUPを実行する
# exit <--- 一般ユーザーに戻る |
snmpd.confファイルをこのように変更した場合,prTableサブツリー(1.3.6.1.4.2021.2.1)以下をsnmpwalkコマンドで取得すると,次のようになる。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.2.1
enterprises.ucdavis.prTable.prEntry.prIndex.1 = 1
enterprises.ucdavis.prTable.prEntry.prIndex.2 = 2
enterprises.ucdavis.prTable.prEntry.prIndex.3 = 3
enterprises.ucdavis.prTable.prEntry.prIndex.4 = 4
enterprises.ucdavis.prTable.prEntry.prNames.1 = sendmail
enterprises.ucdavis.prTable.prEntry.prNames.2 = httpd
enterprises.ucdavis.prTable.prEntry.prNames.3 = named
enterprises.ucdavis.prTable.prEntry.prNames.4 = syslogd
enterprises.ucdavis.prTable.prEntry.prMin.1 = 1
enterprises.ucdavis.prTable.prEntry.prMin.2 = 1
enterprises.ucdavis.prTable.prEntry.prMin.3 = 0
enterprises.ucdavis.prTable.prEntry.prMin.4 = 0
enterprises.ucdavis.prTable.prEntry.prMax.1 = 10
enterprises.ucdavis.prTable.prEntry.prMax.2 = 20
enterprises.ucdavis.prTable.prEntry.prMax.3 = 0
enterprises.ucdavis.prTable.prEntry.prMax.4 = 0
enterprises.ucdavis.prTable.prEntry.prCount.1 = 1
enterprises.ucdavis.prTable.prEntry.prCount.2 = 0
enterprises.ucdavis.prTable.prEntry.prCount.3 = 0
enterprises.ucdavis.prTable.prEntry.prCount.4 = 1
enterprises.ucdavis.prTable.prEntry.prErrorFlag.1 = 0
enterprises.ucdavis.prTable.prEntry.prErrorFlag.2 = 1
enterprises.ucdavis.prTable.prEntry.prErrorFlag.3 = 1
enterprises.ucdavis.prTable.prEntry.prErrorFlag.4 = 0
enterprises.ucdavis.prTable.prEntry.prErrMessage.1 =
enterprises.ucdavis.prTable.prEntry.prErrMessage.2 = Too few httpd running (# = 0)
enterprises.ucdavis.prTable.prEntry.prErrMessage.3 = No named process running.
enterprises.ucdavis.prTable.prEntry.prErrMessage.4 =
enterprises.ucdavis.prTable.prEntry.prErrFix.1 = 0
enterprises.ucdavis.prTable.prEntry.prErrFix.2 = 0
enterprises.ucdavis.prTable.prEntry.prErrFix.3 = 0
enterprises.ucdavis.prTable.prEntry.prErrFix.4 = 0
enterprises.ucdavis.prTable.prEntry.prErrFixCmd.1 =
enterprises.ucdavis.prTable.prEntry.prErrFixCmd.2 =
enterprises.ucdavis.prTable.prEntry.prErrFixCmd.3 =
enterprises.ucdavis.prTable.prEntry.prErrFixCmd.4 = |
上の結果は,snmpwalkコマンドを実行したときに,sendmailとsyslogdは動いているけれどもhttpdとnamedは動いていないという状況を示したものだ。この結果を見るとわかるように,httpdに相当する2番目の項目とnamedに相当する3番目の項目に相当する,“1.3.6.1.4.1.2021.2.1.100.2”と“1.3.6.1.4.1.2021.2.1.100.3”は1となり,“1.3.6.1.4.1.2021.2.1.101.2”と“1.3.6.1.4.1.2021.2.1.101.3”にはエラーメッセージが格納されていることが確認できる。
なおsnmpdでは,snmpd.confファイルにprocfix行をあらかじめ設定しておくと,管理者がprErrFixオブジェクト(1.3.6.1.4.1.2021.2.1.102.i)に1を書き込んだときに(値を書き込むにはsnmpsetというコマンドが使える),procfix行で定義しておいたプログラムを実行することができるようになっている。
たとえば,httpdを再起動したり,sendmailを再起動したりするといったプロセスを起動するようなプログラムを用意し,それをprocfix行で指定しておけば,管理者が異常を発見したときにSNMPマネージャを使ってprErrFixオブジェクト(1.3.6.1.4.1.2021.2.1.102.i)に1を書き込むことで,それらのプログラムを呼び出すことができるようになり,エラー状態からの復帰が可能となる。
この仕組みは,きちんと設定して使うと便利なのだが,管理者以外に悪用されると,システムにセキュリティホールが生じるという話にもなるので,今回は割愛する。
exec行
exec行を設定すると,特定のプログラムを実行し,その実行結果をSNMPのデータとして格納することができる。デフォルトのsnmpd.confファイルには,次のようなexec行がある。
execechotest /bin/echo hello world |
この設定は,“/bin/echo hello world”の実行結果――つまり,文字列"hello world"――をSNMPデータとして格納するというサンプルであり,大きな意味はない。
exec行は,次の書式で指定する。
設定名の部分には,任意の名前を指定する。そして実行ファイルのフルパス名には,実行したいプログラムのフルパス名を,引数には,そのプログラムに渡したい引数を指定する。デフォルトの設定は,echotestという設定名で/bin/echoを引数“hello world”を伴って実行するという設定になっている。
exec行にて指定した実行ファイルの実行結果は,extTableサブツリー(1.3.6.1.4.1.2021.8)内に配列の形で含まれる(Table 11)。exec行もproc行の設定と同様,snmpd.confファイルでの登場順に,先頭から,1,2,3…というインデックス番号が振られる。この例では,echotestという1つの項目しかないので,echotestという設定名を付けたexec行のインデックス番号は1となる。
Table 11 extTableサブツリー(1.3.6.1.4.1.2021.8)
OID |
1.3.6.1.4.1.2021.8.1 |
サブツリー名 |
extEntry |
用途 |
配下に実行結果のデータを含むテーブルを保持する階層ツリー。値はない |
OID |
1.3.6.1.4.1.2021.8.1.1.i |
サブツリー名 |
extIndex |
用途 |
exec行の登場順に,先頭から順に1,2,と割り当てられたインデックス番号。iの値と同じ |
OID |
1.3.6.1.4.1.2021.8.1.2.i |
サブツリー名 |
extNames |
用途 |
exec行の設定名に指定した名前 |
OID |
1.3.6.1.4.1.2021.8.1.3.i |
サブツリー名 |
extCommand |
用途 |
exec行に指定した実行ファイルのフルパス名と引数 |
OID |
1.3.6.1.4.1.2021.8.1.100.i |
サブツリー名 |
extResult |
用途 |
extCommandで指定された実行ファイルが実行時に返したエラーコード(戻り値) |
OID |
1.3.6.1.4.1.2021.8.1.101.i |
サブツリー名 |
extOutput |
用途 |
extCommandで指定された実行ファイルの実行結果(標準出力に書き出された文字列)の1行目。1行目以降は切り捨てられる |
OID |
1.3.6.1.4.1.2021.8.1.102.i |
サブツリー名 |
extErrFix |
用途 |
管理者がこのオブジェクトに1を設定すると,あらかじめsnmpd.confファイルのexecfix行で指定したコマンドが実行される |
OID |
1.3.6.1.4.1.2021.8.1.103.i |
サブツリー名 |
extErrFixCmd |
用途 |
extErrFixに1が設定されたときに実行されるコマンド名 |
|
※iはインデックス番号。snmpd.confファイル中に出てきたexec行の登場順に,先頭から1,2,3,…という値。
Table 11に示したように,exec行で指定したプログラムの実行結果は,“1.3.6.1.4.1.2021.8.1.100.i”と“1.3.6.1.4.2021.8.1.101.i”にそれぞれ格納される。前者には,実行したプログラムのエラーコード,後者には,プログラムが標準出力に書き出した1行目がそれぞれ格納される。デフォルトのsnmpd.confファイルでは,/bin/echoコマンドを使って“hello world”と書き出している。そのため,“1.3.6.1.4.2021.8.1.101.1”の値が“hello world”に設定される。これはsnmpwalkコマンドを使ってextTableサブツリー(1.3.6.1.4.1.2021.8)を参照すれば確認できる。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.8
enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
enterprises.ucdavis.extTable.extEntry.extNames.1 = echotest
enterprises.ucdavis.extTable.extEntry.extCommand.1 = /bin/echo hello world
enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
enterprises.ucdavis.extTable.extEntry.extOutput.1 = hello world
enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
enterprises.ucdavis.extTable.extEntry.extErrFixCmd.1 = |
exec行での設定は,さまざまな用途に使うことができる。たとえば,メールキューの情報を調べて,その数を返すようなスクリプトを用意すれば,SNMPを通じて,現在メールキューに溜まっているメールの数を調べるようなことができる。
なおexec行を設定するとき,特定のOIDを指定すると,指定した実行ファイルの実行結果を1行ごとに配列として階層ツリーに格納することもできる(その場合,Table 11に示した階層ツリーが若干異なる)。詳細はucd-snmpのmanを参照してほしい。
exec行の設定では,任意のプログラムを実行できるので自由度が高い反面,セキュリティには十分注意していただきたい。snmpdはrootユーザーで動作するため,exec行で指定した各種実行ファイルは,rootユーザーのもとで実行される。よってセキュリティ上懸念がありそうなプログラムを指定するのは避けるべきだ。もちろん,snmpdから実行される実行ファイルは,rootユーザー以外には書き換えできないようにするべきだ。そうしないとsnmpdから実行されるプログラムが他のユーザーに書き換えられてしまい,想定しなかったプログラムがrootユーザーの権限で実行されることになるだろう。
また,exec行での設定は,proc行の設定と同様,管理者がSNMPマネージャを使ってextErrFixオブジェクト(1.3.6.1.4.1.2021.8.1.102.i)に1を設定すると,snmpd.confファイル中のexecfix行で指定しておいたプログラムを実行することができるようになっている。そのときに実行するプログラム名を指定するのがexecfix行の設定だ。デフォルトのsnmpd.confファイルには,execfix行は1つもない。
execfix行を設定すると,管理者がSNMPマネージャを使って,特定のプログラムを実行できるようになるが,セキュリティ対策をとらないと,悪用される危険性がある。本稿ではexecfix行の設定についての説明は割愛する。
disk行
disk行を設定すると,特定のパス以下の空き容量が,指定されたキロバイト数以下になるもしくは指定されたパーセント以下になったときにエラー扱いとすることができる。disk行の設定書式は次の通りだ。
disk 調査するパス名最小容量またはパーセンテージ |
調査するパス名の部分には,調査したいディレクトリパスを指定する。そして,空白(またはタブ)で区切って,エラー扱いとしたい容量またはパーセンテージを指定する。容量の場合には,キロバイト単位で,パーセント値の場合には,“80%”とか“90%”といったように数字の後ろに“%”記号を伴って指定する。
デフォルトのsnmpd.confファイルでは,次の指定となっており,/ディレクトリの空き容量が10000キロバイト――すなわち10Mバイト――以下にになったならば,それをエラー扱いとする設定になっている。
disk行にて指定したディスクの調査結果は,dskTableサブツリー(1.3.6.1.4.1.2021.9)以下に,配列の形で格納される(Table 12)。
Table 12 dskTableサブツリー(1.3.6.1.4.1.2021.9)
OID |
1.3.6.1.4.1.2021.9.1 |
サブツリー名 |
dskEntry |
用途 |
配下にディスク情報を含むための階層ツリー。値はない |
OID |
1.3.6.1.4.1.2021.9.1.i |
サブツリー名 |
dskIndex |
用途 |
インデックス番号。disk行の登場順に,先頭から1,2,3,…というインデックス番号が振られる。iの値と同じ |
OID |
1.3.6.1.4.1.2021.9.2.i |
サブツリー名 |
dskPath |
用途 |
調査対象となるパス名。disk行の調査するパス名に指定した値 |
OID |
1.3.6.1.4.1.2021.9.3.i |
サブツリー名 |
dskDevice |
用途 |
dskPathが含まれるデバイス名。/dev/hda1など |
OID |
1.3.6.1.4.1.2021.9.4.i |
サブツリー名 |
dskMinimum |
用途 |
disk行で指定したエラー扱いとする最小容量。パーセント設定されているときには-1 |
OID |
1.3.6.1.4.1.2021.9.5.i |
サブツリー名 |
dskMinPercent |
用途 |
disk行で指定したエラー扱いとする最小容量のパーセンテージ。キロバイト単位で設定されているときには-1 |
OID |
1.3.6.1.4.1.2021.9.6.i |
サブツリー名 |
dskTotal |
用途 |
dskDeviceで指定されるデバイスが格納できる最大容量。キロバイト単位 |
OID |
1.3.6.1.4.1.2021.9.7.i |
サブツリー名 |
dskAvail |
用途 |
dskDeviceで指定されるデバイスの現在の空き容量。キロバイト単位 |
OID |
1.3.6.1.4.1.2021.9.8.i |
サブツリー名 |
dskUsed |
用途 |
dskDeviceで指定されるデバイスの現在の利用容量。キロバイト単位 |
OID |
1.3.6.1.4.1.2021.9.9.i |
サブツリー名 |
dskPercent |
用途 |
dskDeviceで指定されているディスクの使用率を百分率で示した値 |
OID |
1.3.6.1.4.1.2021.9.10.i |
サブツリー名 |
dskPercentNode |
用途 |
dskDeviceで指定されているディスクのiノードの使用率を百分率で示した値 |
OID |
1.3.6.1.4.1.2021.9.100.i |
サブツリー名 |
dskErrorFlag |
用途 |
空き容量がdisk行で指定された容量以下になったかどうかのエラーフラグ。1のときに容量以下になったことを,0のときにまだその空き容量以上空いていることを示す |
OID |
1.3.6.1.4.1.2021.9.101.i |
サブツリー名 |
dskErrorMsg |
用途 |
dskErrorFlagが1になっているとき,そのエラーメッセージ |
|
※iはインデックス番号。snmpd.confファイル中に出てきたdisk行の登場順に,先頭から1,2,3,…という値。
デフォルトの設定では,/ディレクトリの空き容量が10MB以下になったときにエラー扱いとなるように設定されている。snmpd.confファイルにはそれ以外にdisk行はなく,この項目にはインデックス番号として1が割り当てられる。よって,/ディレクトリの空き容量が10MB以下になったとき,1.3.6.1.4.1.2021.9.100.1の値が1に設定される。SNMPマネージャを使ってこの値を監視すれば,ディスクの空き容量不足を調べることができるというわけだ。snmpwalkコマンドを使ってdskTableサブツリー(1.3.6.1.4.1.2021.9)を参照した例を以下に示す。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.9
enterprises.ucdavis.dskTable.dskEntry.dskIndex.1 = 1
enterprises.ucdavis.dskTable.dskEntry.dskPath.1 = /
enterprises.ucdavis.dskTable.dskEntry.dskDevice.1 = /dev/hda1
enterprises.ucdavis.dskTable.dskEntry.dskMinimum.1 = 10000
enterprises.ucdavis.dskTable.dskEntry.dskMinPercent.1 = -1
enterprises.ucdavis.dskTable.dskEntry.dskTotal.1 = 128812
enterprises.ucdavis.dskTable.dskEntry.dskAvail.1 = 72437
enterprises.ucdavis.dskTable.dskEntry.dskUsed.1 = 49724
enterprises.ucdavis.dskTable.dskEntry.dskPercent.1 = 41
enterprises.ucdavis.dskTable.dskEntry.dskPercentNode.1 = 23
enterprises.ucdavis.dskTable.dskEntry.dskErrorFlag.1 = 0
enterprises.ucdavis.dskTable.dskEntry.dskErrorMsg.1 = |
参考までに,このホストの現在のディスク使用状況を知るべく,dfコマンドを実行したときの結果を以下に示す。
$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 128812 49724 72437 41% /
/dev/hda3 378743 53262 305926 15% /home
/dev/hda6 1277792 736196 476684 61% /usr |
dfコマンドの出力結果とdskTableサブツリー内のオブジェクトに格納されている値とを比べると,どれとどれが対応するのかがわかるだろう。
disk行は,もちろん必要なだけ追加することができる。disk行を追加するのであれば,パーティション単位に設定項目を追加しておくとよいだろう。たとえば,/,/home,/varの3つのパーティションを使っているのであれば,そのそれぞれを監視するよう,たとえば,次の設定をすればよい。
disk / 20%
disk /home 10%
disk /var 30% |
snmpd.confのdisk行を上記のようにしておくと,先頭の項目から順にインデックス番号が1,2,3と割り当てられる。よって,次のような動作になる。
- /ディレクトリの空き容量が20%を切ったとき
1.3.6.1.4.1.2021.9.1.100.1が1になる。
- /homeディレクトリの空き容量が10%を切ったとき
1.3.6.1.4.1.2021.9.1.100.2が1になる。
- /homeディレクトリの空き容量が30%を切ったとき
1.3.6.1.4.1.2021.9.1.100.3が1になる。
load行
load行を設定すると,システムのロードアベレージを調べることができる。ロードアベレージとは,簡単にいうと,CPUの稼働率のことで,1.00以下であれば滞りなくプロセスが実行されているということを,1.00以上であれば,負荷が重く,いくつかのプロセスの実行に遅延が生じていることを示す。
load行の設定書式は次の通りだ。
load 1分間の平均 5分間の平均 15分間の平均 |
それぞれの平均には,エラー扱いとしたいアベレージの値を指定する。5分間の平均,15分間の平均については省略してもかまわない。平均を省略したときには12が設定されたものとみなされる。
デフォルトのload行の設定は,次のようになっている。
この設定は,次のいずれかのときにエラー扱いとすることを示す。
- 1分間のロードアベレージの平均が12を越えたとき
- 5分間のロードアベレージの平均が14を越えたとき
- 15分間のロードアベレージの平均が14を越えたとき
一般にこの設定は,かなりの可負荷がかかっている状況であり,普通,ロードアベレージが5を越えると,かなりシステムが重くなったと感ずる。そのため,この設定値は,もう少し小さな値に設定しておいたほうがよいかも知れない。
load行で設定したロードアベレージの値は,laTableサブツリー(1.3.6.1.4.1.2021.10)に配列の形で含まれる(Table 13)。
Table 13 laTableサブツリー(1.3.6.1.4.1.2021.10)
OID |
1.3.6.1.4.1.2021.10.1 |
サブツリー名 |
laEntry |
用途 |
配下にロードアベレージ情報を格納する階層ツリー。値はない |
OID |
1.3.6.1.4.1.2021.10.1.1.i |
サブツリー名 |
laIndex |
用途 |
インデックス番号。1分平均値情報には1,5分平均値情報には2,15分平均情報には3がそれぞれ割り当てられる。iの値と同じ |
OID |
1.3.6.1.4.1.2021.10.1.2.i |
サブツリー名 |
laNames |
用途 |
監視名。1分平均値情報には“Load-1”,5分平均値情報には“Load-5”,15分平均値情報には“Load-15”がそれぞれ格納される |
OID |
1.3.6.1.4.1.2021.10.1.3.i |
サブツリー名 |
laLoad |
用途 |
ロードアベレージ値を文字列として表現したもの |
OID |
1.3.6.1.4.1.2021.10.1.4.i |
サブツリー名 |
laConfig |
用途 |
load行で設定されたエラー扱いとする平均値 |
OID |
1.3.6.1.4.1.2021.10.1.5i |
サブツリー名 |
laLoadInt |
用途 |
laLoadを百分率で示したもの |
OID |
1.3.6.1.4.1.2021.10.1.6.i |
サブツリー名 |
laLoadFloat |
用途 |
laLoadを小数値として示したもの |
OID |
1.3.6.1.4.1.2021.10.1.100.i |
サブツリー名 |
laLoadErrorFlag |
用途 |
エラーフラグ。設定されたロードアベレージの平均値を越えているときには1,そうでなければ0が格納される |
OID |
1.3.6.1.4.1.2021.10.1.101.i |
サブツリー名 |
laErrMessage |
用途 |
laLoadErrorFlagが1であるときのエラーメッセージ |
|
※iはインデックス番号。1分間の平均値が1,5分間の平均値が2,15分間の平均値が3。
laTableサブツリーは,1分間の平均値,5分間の平均値,15分間の平均値に,それぞれ1,2,3というインデックス番号が割り当てられ,配列のように格納される。たとえば1分間ロードアベレージに関する情報は1.3.6.1.4.1.2021.10.1.1.1,1.3.6.1.4.1. 2021.10.1.2.1,1.3.6.1.4.1.2021.10.1.3.1,…などに格納されている。
1分間の平均ロードアベレージがload行で設定されたロードアベレージの平均値を越えたときには,1.3.6.1.4.1.2021.10.1.100.1に1が設定され,エラーメッセージが1.3.6.1.4.1.2021.10.101.1に設定される。5分間や15分間のロードアベレージに関しても同様で,5分間のロードアベレージが設定平均値を超えている場合には1.3.6.1.4.1.2021.10.1.100.2が,15分間のロードアベレージが設定平均値を越えている場合には1.3.6.1.4.1.2021.10.1.100.3が,それぞれ1に設定される。これらの情報をSNMPマネージャを使って監視すれば,システムの負荷状態を知ることができる。
参考までにsnmpwalkコマンドを使って,laTableサブツリー(1.3.6.1.4.1.2021.10)以下を参照したものを以下に示す。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.10
enterprises.ucdavis.laTable.laEntry.laIndex.1 = 1
enterprises.ucdavis.laTable.laEntry.laIndex.2 = 2
enterprises.ucdavis.laTable.laEntry.laIndex.3 = 3
enterprises.ucdavis.laTable.laEntry.laNames.1 = Load-1
enterprises.ucdavis.laTable.laEntry.laNames.2 = Load-5
enterprises.ucdavis.laTable.laEntry.laNames.3 = Load-15
enterprises.ucdavis.laTable.laEntry.laLoad.1 = 0.00
enterprises.ucdavis.laTable.laEntry.laLoad.2 = 0.00
enterprises.ucdavis.laTable.laEntry.laLoad.3 = 0.00
enterprises.ucdavis.laTable.laEntry.laConfig.1 = 12.00
enterprises.ucdavis.laTable.laEntry.laConfig.2 = 14.00
enterprises.ucdavis.laTable.laEntry.laConfig.3 = 14.00
enterprises.ucdavis.laTable.laEntry.laLoadInt.1 = 0
enterprises.ucdavis.laTable.laEntry.laLoadInt.2 = 0
enterprises.ucdavis.laTable.laEntry.laLoadInt.3 = 0
enterprises.ucdavis.laTable.laEntry.laLoadFloat.1 = Opaque: Float: 0.000000
enterprises.ucdavis.laTable.laEntry.laLoadFloat.2 = Opaque: Float: 0.000000
enterprises.ucdavis.laTable.laEntry.laLoadFloat.3 = Opaque: Float: 0.000000
enterprises.ucdavis.laTable.laEntry.laErrorFlag.1 = 0
enterprises.ucdavis.laTable.laEntry.laErrorFlag.2 = 0
enterprises.ucdavis.laTable.laEntry.laErrorFlag.3 = 0
enterprises.ucdavis.laTable.laEntry.laErrMessage.1 =
enterprises.ucdavis.laTable.laEntry.laErrMessage.2 =
enterprises.ucdavis.laTable.laEntry.laErrMessage.3 = |
上の実行結果は,ほとんど負荷がないホスト上で実行したものだ。そのため,すべてのロードアベレージ値は0になっている。もう少し負荷がかかっているホストで実行すると,0.3とか0.5といった値が得られるはずだ。
file行
file行を設定すると,特定のファイルのファイルサイズを監視したり,ファイルが一定バイト数を越えたときにエラー扱いとしたりすることができる。file行の設定書式は,次の通りだ。
file監視するファイル名エラー扱いとするファイルサイズ |
エラー扱いとするファイルサイズはキロバイト単位で指定する。省略した場合には,無限大が設定されたものとみなされる。
デフォルトのsnmpd.confファイルには,file行は用意されていない。たとえば,/var/log/messagesファイルが5MBを越えたときにエラー扱いとしたいのであれば,snmp.confファイルに次のようなfile行を加える。
file/var/log/messages50000 |
file行で指定された項目の情報は,snmpd.confファイルに登場した順番で,先頭から1,2,3,…のようにインデックス番号が付けられ,fileTableサブツリー(1.3.6.1.4.1.2021.15)以下に配列の形で格納される(Table 14)。
Table 14 fileTableサブツリー(1.3.6.1.4.1.2021.15)
OID |
1.3.6.1.4.2021.15.1 |
サブツリー名 |
fileEntry |
用途 |
配下にファイル情報を含む階層ツリー。値はない |
OID |
1.3.6.1.4.2021.15.1.1.i |
サブツリー名 |
fileIndex |
用途 |
インデックス番号。file行の登場順に,先頭から1,2,…と振られる。iと同じ |
OID |
1.3.6.1.4.2021.15.1.2.i |
サブツリー名 |
fileNames |
用途 |
file行に指定した監視するファイル名 |
OID |
1.3.6.1.4.2021.15.1.3.i |
サブツリー名 |
fileSize |
用途 |
fileNamesで指定されているファイルの現在のファイルサイズ(キロバイト単位) |
OID |
1.3.6.1.4.2021.15.1.4.i |
サブツリー名 |
fileMax |
用途 |
file行に指定したエラー扱いとするファイルサイズ(キロバイト単位) |
OID |
1.3.6.1.4.2021.15.1.100.i |
サブツリー名 |
fileErrorFlag |
用途 |
fileNamesで指定されているファイルがfileMaxで指定されているファイルサイズよりも大きくなっているかどうかのエラーフラグ。大きくなっていれば1,そうでなければ0 |
OID |
1.3.6.1.4.2021.15.1.101.i |
サブツリー名 |
fileErrorMsg |
用途 |
fileErrorFlagが1であるとき,そのエラーメッセージ |
|
※iはインデックス番号。snmpd.confファイル中に出てきたfile行の登場順に,先頭から1,2,3,…という値。
上に挙げた/var/log/messagesファイルを監視する例であれば,1つしかfile行を用意していないので,この/var/log/messagesファイルの監視項目のインデックス番号は1となる。よって,/var/log/messagesファイルの現在のファイルサイズ(キロバイト単位)は,1.3.6.1.4.1.2021.15.1.3.1に格納される。そして,設定されたエラー扱いとするファイルサイズである5Mバイト(50000キロバイト)を越えたときには1.3.6.1.4.1.2021.15.1.100.1の値が1に設定され,そのときのエラーメッセージが1.3.6.1.4.1.2021.15.1.101.1に設定される。
このようにfile行を指定すると,特定のファイルを監視するのに便利だ。ただしfile行の指定は,あくまでも1つのファイルを監視対象とするものであり,あるディレクトリに含まれる総容量を調べるものではない。ディレクトリに含まれるファイルサイズを総和を監視したいのであれば,disk行の指定を使うか(ただしその場合,ディレクトリではなくパーティションの監視になる),特定のディレクトリに対するfindコマンドやduコマンドの結果を加工して出力するようなスクリプトを用意しておき,それをexec行の指定を使って呼び出すような手法をとることになる。
設定せずに参照できる値
以上で説明したように,snmpd.confファイルを編集することで,さまざまな値をSNMPデータに含めることができるようになる。しかしそれ以外に,とくにsnmpd.confファイルを設定しなくても,いくつかの値を参照することができる。ここでは簡単に,それらの情報について説明する。
○memoryサブツリー
memoryサブツリー(1.3.6.1.4.1.2021.4)には,freeコマンドを使って取得できるメモリの状態やスワップファイルに関する情報を保持するオブジェクトが格納されている(Table 15)。
Table 15 memoryサブツリー(1.3.6.1.4.1.2021.4)
OID |
1.3.6.1.4.2021.4.1 |
サブツリー名 |
memIndex |
用途 |
ダミーなインデックス番号.つねに0 |
OID |
1.3.6.1.4.2021.4.2 |
サブツリー名 |
memErrorName |
用途 |
ダミーな名前.つねに“swap” |
OID |
1.3.6.1.4.2021.4.3 |
サブツリー名 |
memTotalSwap |
用途 |
スワップファイルの確保容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.4 |
サブツリー名 |
memAvailSwap |
用途 |
スワップファイルの未使用容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.5 |
サブツリー名 |
memTotalReal |
用途 |
搭載されている実メモリ(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.6 |
サブツリー名 |
memAvailReal |
用途 |
空き実メモリ(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.7 |
サブツリー名 |
memTotalSwapTXT |
用途 |
テキストで使われるスワップファイルの確保領域(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.8 |
サブツリー名 |
memAvailSwapTXT |
用途 |
テキストで使われるスワップファイルの未使用容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.9 |
サブツリー名 |
memTotalRealTXT |
用途 |
テキストで使われる総実メモリ(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.10 |
サブツリー名 |
memAvailRealTXT |
用途 |
テキストで使われる空きメモリ(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.11 |
サブツリー名 |
memTotalFree |
用途 |
総空きメモリ(実空きメモリ+スワップ空き容量)。キロバイト単位 |
OID |
1.3.6.1.4.2021.4.12 |
サブツリー名 |
memMinimumSwap |
用途 |
エラー扱いとするスワップファイルの空きサイズ(キロバイト単位)。デフォルトでは16000(16Mバイト)。スワップファイルの空きサイズがこの値を下回ったとき,memSwapErrorが1に設定される |
OID |
1.3.6.1.4.2021.4.13 |
サブツリー名 |
memShared |
用途 |
総共有メモリの容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.14 |
サブツリー名 |
memBuffer |
用途 |
総バッファメモリの容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.15 |
サブツリー名 |
memCached |
用途 |
総キャッシュメモリ容量(キロバイト単位) |
OID |
1.3.6.1.4.2021.4.100 |
サブツリー名 |
memSwapError |
用途 |
スワップエラーフラグ。スワップファイルの空き容量がmemMininumSwapで指定された容量よりも小さくなったときに1が設定される。そうでなければ0が設定される |
OID |
1.3.6.1.4.2021.4.101 |
サブツリー名 |
memSwapErrorMsg |
用途 |
memSwapErrorが1になったとき,そのエラーメッセージ |
|
memoryサブツリーの配下に含まれるオブジェクトはすべて配列構造ではなく単一の値だ。よって,Table 15に示した各OIDの後ろに“.0”を付与して指定すれば,そのオブジェクトの値を取得できる.
参考までに,snmpwalkコマンドを使ってmemoryサブツリー(1.3.6.1.4.1.2021.4)以下の一覧を表示したものを下に示す。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.4
enterprises.ucdavis.memory.memIndex.0 = 0
enterprises.ucdavis.memory.memErrorName.0 = swap
enterprises.ucdavis.memory.memTotalSwap.0 = 133016
enterprises.ucdavis.memory.memAvailSwap.0 = 131256
enterprises.ucdavis.memory.memTotalReal.0 = 63092
enterprises.ucdavis.memory.memAvailReal.0 = 4116
enterprises.ucdavis.memory.memTotalFree.0 = 135372
enterprises.ucdavis.memory.memMinimumSwap.0 = 16000
enterprises.ucdavis.memory.memShared.0 = 54804
enterprises.ucdavis.memory.memBuffer.0 = 2796
enterprises.ucdavis.memory.memCached.0 = 21528
enterprises.ucdavis.memory.memSwapError.0 = 0
enterprises.ucdavis.memory.memSwapErrorMsg.0 = |
memoryサブツリー以下に含まれる情報を監視すれば,サーバーの使用メモリを調べたり,スワップファイルの空き容量が不足していないかどうかなどを調べたりすることができる。
systemStatsサブツリー(1.3.6.4.1.2021.11)
systemStatsサブツリーには,vmstatコマンドで取得できるCPUの状態を保持するオブジェクトが格納されている(Table 16)。
Table 16 systemStatsサブツリー(1.3.6.4.2021.11)
OID |
1.3.6.4.1.2021.11.1 |
サブツリー名 |
ssIndex |
用途 |
ダミーインデックス番号。つねに1 |
OID |
1.3.6.4.1.2021.11.2 |
サブツリー名 |
ssErrorName |
用途 |
systemStatsの名前。つねに“systemStats” |
OID |
1.3.6.4.1.2021.11.3 |
サブツリー名 |
ssSwapIn |
用途 |
スワップインにかかった時間(キロバイト/秒) |
OID |
1.3.6.4.1.2021.11.4 |
サブツリー名 |
ssSwapOut |
用途 |
スワップアウトにかかった時間(キロバイト/秒) |
OID |
1.3.6.4.1.2021.11.5 |
サブツリー名 |
ssIOSent |
用途 |
ブロックデバイスへの送信にかかった時間(ブロック/秒) |
OID |
1.3.6.4.1.2021.11.6 |
サブツリー名 |
ssIOReceive |
用途 |
ブロックデバイスからの受信にかかった時間(ブロック/秒) |
OID |
1.3.6.4.1.2021.11.7 |
サブツリー名 |
ssSysInterrupts |
用途 |
1秒間にかかった割り込みの回数。クロック割り込みも含む |
OID |
1.3.6.4.1.2021.11.8 |
サブツリー名 |
ssSysContext |
用途 |
1秒間に切り替えられたコンテキストスイッチの回数 |
OID |
1.3.6.4.1.2021.11.9 |
サブツリー名 |
ssCpuUser |
用途 |
ユーザーがCPUを使っている割合(百分率) |
OID |
1.3.6.4.1.2021.11.10 |
サブツリー名 |
ssCpuSystem |
用途 |
システムがCPUを使っている割合(百分率) |
OID |
1.3.6.4.1.2021.11.11 |
サブツリー名 |
ssCpuIdle |
用途 |
CPUがアイドルである割合(百分率) |
OID |
1.3.6.4.1.2021.11.50 |
サブツリー名 |
ssCpuRawUser |
用途 |
ユーザーがCPUを使っている時間(システム時間) |
OID |
1.3.6.4.1.2021.11.51 |
サブツリー名 |
ssCpuRawNice |
用途 |
niceプロセスの値(システム時間) |
OID |
1.3.6.4.1.2021.11.52 |
サブツリー名 |
ssCpuRawSystem |
用途 |
システムがCPUを使っている時間(システム時間) |
OID |
1.3.6.4.1.2021.11.53 |
サブツリー名 |
ssCpuRawIdle |
用途 |
CPUがアイドルである時間(システム時間) |
|
systemStatsサブツリーの配下に含まれるオブジェクトはすべて配列構造ではなく単一の値だ。よって,Table 16に示した各OIDの後ろに“.0”を付与して指定すれば,そのオブジェクトの値を取得できる。
Table 16に示したように,systemStatsサブツリーには,おもにシステムのCPUの状態などが含まれる。systemStatsサブツリー(1.3.6.4.1.2021.11)をsnmpwalkコマンドを使って参照した例を以下に示す。
$ snmpwalk localhost private .1.3.6.1.4.1.2021.11
enterprises.ucdavis.systemStats.ssIndex.0 = 1
enterprises.ucdavis.systemStats.ssErrorName.0 = systemStats
enterprises.ucdavis.systemStats.ssSwapIn.0 = 0
enterprises.ucdavis.systemStats.ssSwapOut.0 = 1
enterprises.ucdavis.systemStats.ssIOSent.0 = 14
enterprises.ucdavis.systemStats.ssIOReceive.0 = 1
enterprises.ucdavis.systemStats.ssSysInterrupts.0 = 127
enterprises.ucdavis.systemStats.ssSysContext.0 = 41
enterprises.ucdavis.systemStats.ssCpuUser.0 = 0
enterprises.ucdavis.systemStats.ssCpuSystem.0 = 0
enterprises.ucdavis.systemStats.ssCpuIdle.0 = 98
enterprises.ucdavis.systemStats.ssCpuRawUser.0 = Counter32: 3110
enterprises.ucdavis.systemStats.ssCpuRawNice.0 = Counter32: 1
enterprises.ucdavis.systemStats.ssCpuRawSystem.0 = Counter32: 3114
enterprises.ucdavis.systemStats.ssCpuRawIdle.0 = Counter32: 576100 |
その他のサブツリー
以上が,ucdavisサブツリーの配下にある,おもなサブツリーだ。しかしそれ以外にも次に示すサブツリーがサポートされている。
- snmperrsサブツリー(1.3.6.1.4.1.2021.101)
snmpdのエラー情報が格納される。
- versionサブサリー(1.3.6.1.4.1.2021.100)
snmpdのバージョン情報が格納される。
- mrTableサブツリー(1.3.6.1.4.1.2021.102)
snmpdはあとからモジュールを加えることで,機能拡張ができるようになっている。このmrTableサブツリーには,追加されたモジュールのそれぞれの情報が格納される。本稿では,モジュールについての説明は割愛する。
- ucdDemoMIBサブツリー(1.3.6.1.4.1.2021.14)
snmpdのデモンストレーション用のサブツリー。
本稿では,これらのサブツリーについての説明は割愛する。詳細は,snmpdのmanや/usr/loacl/share/snmp/mibsディレクトリにあるUCD-SNMP-MIB.txtファイルなどを参照してほしい。