稼動状況をモニタする MB温度からCPU使用率まで1

['04/03/06] 内容修正(CPU温度とM/B温度が入れ替わっていた)
['03/02/26] 初稿
■['04/03/06] お詫びと訂正
 ['04/03/06]以前に本ページで公開されていた設定では,CPU 温度と M/B 温度が入れ替わって 検出されるようになっていました.恐れ入りますが,以前の設定を用いて温度を計測している場合は, lm_sensorsの設定ファイル(sensors.conf)の書き換えをお願いします. なお,私が現在使用している設定は, このようになっております.

  # Temperature
#  label temp1   "CPU Temp"
#  ignore temp2
  ignore temp3
label temp1 "CPU Temp"
label temp2 "MB Temp"

m9841.info!さん,御指摘ありがとう ございました.

■サーバとネットワークとモニタリング
■サーバとして24時間運転でTerminatorを使う
 Terminator は対策を行うことにより,深夜に寝室で動いていても, 気にならないレベルにまで静音化が可能です.そのため,24時間運転の マシンとして利用している人はかなり居ると思いますが,サーバとして 利用している人も多いと思います.

 何を持ってサーバと称し,サーバとして動かすことによってどんな メリットがあるかについては説明を省略しますが,サーバを管理している 人は,常にどんな状態で動作しているかをモニタしたいという欲求がある と思います.

 例えば Terminator をファンレスによる静音化した場合に問題となる CPU や M/B(電源) の温度変化,ネットワークのトラフィック,CPU の 負荷の掛かり具合,ディスクの空き容量の変化等々.上げればきりが無い ほど監視したい項目が出てくると思います.特に温度変化に関しては, 関心が高いと思います.夏場に暑くなる部屋で動かしている場合,外出先で 『今日は気温が異常に高いし…温度は問題ないレベルだろうか』と,心配に なったりすることもあるでしょう.

 本ページでは,Linux ベースでどのようにマシンの稼働状況を監視 出来るかについて解説します.多くの項目は Terminator に特化した ものではありませんので,UNIX が稼働しているマシンであれば,汎用的 に応用できると思います.

■何を監視するか?
 監視できるものは何でも監視したいという方向もアリだと思いますが, とりあえずは以下の項目を監視することにしました.

  • CPU,M/B 温度
  • CPU 稼働率
  • ディスクの空き容量
  • ネットワークトラフィック

 なお,各ステータスは時系列での変化を追えるようにし,かつ, ネットワーク経由で他のマシンから監視を行えるようにすることを考えます.

■モニタリングの下準備1 【i2c,lm_sensorsのインストール】
 まずは温度変化を監視するために,lm_sensors というソフトを導入します. このソフトをインストールすることにより, Vcode,+12V等の各種電圧,ファンの回転数,CPUやM/B温度等のハードウエア モニタリングが可能になります.

■ダウンロード
 Linux の一部ディストリビューションでは,既に最初から lm_sensors が インストールされている場合もあるようです.Vine の場合はインストールされて いませんので,新規にインストールする必要があります.まずは, Linux System Hardware Monitoringのダウンロードページから, lm_sensorsi2cの tar ボールをダウンロードします. 直に任意のバージョンをダウンロードする場合, ここから 辿っても良いでしょう.

 bug fix や機能追加が成されている可能性があるため,最新版の方が 好ましいと思いますが,バージョンによっては,本ページの解説している 内容と設定方法が若干変更に なっている可能性もあります.ちなみに私はversion 2.7.0 を使用しました.

 使用したファイル
  i2c-2.7.0.tar.gz
  lm_sensors-2.7.0.tar.gz
 余談ですが,私は当初 2.6.4 を入れて温度監視のみ をしていました.この版は設定が面倒でしたが,2.6.5 で Terminator TU で使用 されている SiS630 用のドライバが追加されたとのこと.2.7.0 では設定が簡単 になっていました.
■展開とインストール
 任意のディレクトリで,tar xvzf <ファイル名>のように解凍&展開 を行います.2つの tar ボールに固められたファイルを展開すると, 『i2c-2.7.0』,『lm_sensors-2.0.7』 というディレクトリが作成されている筈です.

 次にインストールです.本当は Makefile を編集し,Vine のルールに合った 適切な場所に インストールする方が美しいのですが,説明を簡単にするために,本ページでは ファイルの編集を行わない方法で行うことにします.なお,以下の 作業は root 権限で行ってください(本当は make install の部分だけで良い. 以降説明を省略しますが,基本的にソフトのインストール時には root で行う ようにしてください).

# cd i2c-2.7.0
# make
# make install
# cd ../lm_sensors-2.0.7
# make
# make install

 エラーメッセージが出力された場合,適時問題を FIX してください.

■設定
 モジュール群は,/lib/modules/misc の下にインストールされます.Vine の場合,モジュールは /lib/modules/<カーネルのバージョン>/...の下に インストールする決まりがありますので,以下のコマンドを実行して,モジュール を正規の場所に移動します.今回は Vine2.6r1 環境で,カーネルは 2.4.19-0vl26 を使用しています.移動先のディレクトリ名は,利用中の環境により, 適時読み替えてください.

# cd /lib/modules
# mv misc/* /lib/modules/2.4.19-0vl26/kernel/drivers/i2c
# rm -rf misc
# depmod -a

※ /lib/modules/misc の下には,今回インストール した i2c, lm_sensors 関係 のモジュールのみが入っているという前提で行っています

 次に,現在利用中の環境をスキャンし,適切な設定を行います.

(lm_sensors を展開したディレクトリをカレントディレクトリにしておく. 例えばこの場合,"lm_sensors-2.7.0" の直下)
# cd ./prog/detect
# ./sensors-detect
We will now try to load each adapter module in turn.
Load `i2c-sis630' (say NO if built into your kernel)? (YES/no):
(後略)

 sensors-detect コマンドを実行すると,使用されているセンサーの スキャンを行うのと同時に,設定上の質問をいくつかして来ます.基本的に 全ての質問に対し,リターンキーを押して答えて行けば良いでしょう.実行が完了 すると,"/etc/sysconfig/lm_sensors" というファイルが出来ます.Terminator TU であれば,この時点で次のような内容になっているでしょう.

MODULE_0=i2c-sis630
MODULE_1=i2c-isa
MODULE_2=eeprom
MODULE_3=sis5595
MODULE_4=it87

 ここで注意して頂きたい点は,sis5595 が認識されていることです. lm_sensors のドキュメントを読むと,SiS630 が使用されている システムの場合,sis5595 が誤認識されてしまうという記述があります.実際, Terminator TU でsis5595 モジュールを読み込ませようとした場合,エラーが 発生します.

 そこで,このファイルを以下のように修正します.

MODULE_0=i2c-sis630
MODULE_1=i2c-isa
MODULE_2=eeprom
MODULE_3=it87

 次にドキュメントにある通り,SiS630 を使用する場合は it87 に "temp_type=0x31" オプションを付けて読み込ませないといけないため, "/etc/modules.conf" に以下の行を追加します.

options it87 temp_type=0x31

 これを行わないと,CPU 温度,M/B 温度共にとんでもない値を 示してしまいます.

 次に,sensor の設定ファイルを修正します.設定ファイルのサンプルが 提供されていますので,まずはこのファイルを /etc ディレクトリにコピー しましょう.

(lm_sensors を展開したディレクトリをカレントディレクトリにしておく. 例えばこの場合,"lm_sensors-2.7.0" の直下)
# cp etc/sensors.conf.eg /etc/sensors.conf

 次に,コピーした /etc/sensors.conf ファイルを SiS630 用に修正します. 具体的には,

# IT8705F or a SIS950 for monitoring with the SIS630.
# You will need to load the it87 module as follows to select the correct
# temperature sensor type.
# modprobe it87 temp_type=0x31
# The sensors-detect program reports lm78 and a sis5595 and lists the it87 as
# a misdetect.  Don't do the modprobe for the lm78 or sis5595 as suggested.
#
# delete or comment out above it87 section and uncomment the following.

 と,書かれている部分の直下,『chip "it87-*"』の行から,『chip "fscpos-*"』 と書かれている行の直前までのコメントを外します(当然ではありますが, コメントを意図して書かれている行は,コメントとして残しておいてください).

 次に,Terminator TU の場合は温度センサを2つ使用可能であり, 1つ目が CPU の温度,2つ目が M/B 温度にアサインされていることから,

  # Temperature
  label temp1   "CPU Temp"
  ignore temp2
  ignore temp3

 の部分を,以下のように修正します.

  # Temperature
#  label temp1   "CPU Temp"
#  ignore temp2
  ignore temp3
label temp1 "CPU Temp"
label temp2 "MB Temp"

 基本的な設定はこれで終わりです.
 次は,起動時に lm_sensors 関係のモジュールを自動的に読み込ませる ように設定します.まずは,起動用ファイルのサンプルを一度実行し, 正常に動くかどうかを確認してください.

# ./prog/init/lm_sensors.init restart

 実行後,sensor コマンドを実行し,次のように温度情報等が出たとしたら, 正常に動作しています.

# /usr/local/bin/sensors
eeprom-i2c-0-50
Adapter: SMBus SIS630 adapter at e480
(中略)
it87-isa-0290
Adapter: ISA adapter
Algorithm: ISA algorithm
VCore 1:   +1.88 V  (min =  +1.53 V, max =  +1.87 V)   ALARM
VCore 2:   +2.17 V  (min =  +2.25 V, max =  +2.75 V)   ALARM
+3.3V:     +3.04 V  (min =  +2.96 V, max =  +3.60 V)
+5V:       +3.86 V  (min =  +4.50 V, max =  +5.48 V)   ALARM
+12V:      +5.28 V  (min = +11.36 V, max = +13.80 V)   ALARM
3.3 Stdby:-16.62 V  (min = -15.86 V, max = -13.40 V)   ALARM
-12V:     -11.57 V  (min = -12.80 V, max = -11.98 V)   ALARM
Stdby:     +1.85 V  (min =  +4.50 V, max =  +5.48 V)   ALARM
VBat:      +0.00 V
fan1:        0 RPM  (min = 3000 RPM, div = 2)          ALARM
CPU Temp:     +46庵  (min =  +20庵, max =  +60庵)
MB Temp:    +36庵  (min =  +20庵, max =  +60庵)

 電圧関係は全て異常な値を表示していますが,これらは無視してください. 色々と調整してみましたが,Terminator TU で正常な値を表示することは 未だ成功していません(他の PC であれば,うまく動いているのですが…).

 ここで,『MB Temp』および『CPU Temp』が適正と思われる温度が表示 されているのを確認してください.なお,『庵』と表示されているのは, 『℃』が文字化けしたものです.ちなみに,BIOS や Asus Probe で 確認した温度と比較すると,若干高めの温度が表示されていると思います. これは設定ファイルを修正することにより微調整可能ですが,それほど 大きな違いは無いため,私はそのまま使用しています.

(余談ですが,これら値は "/proc/sys/dev/sensors/it87-***" 以下のファイルの 内容を見ることにより,直接読むこともできます)

 ここで問題が無いようであれば,起動時に自動的に必要なモジュールが 読み込まれるように設定します.

# cp ./prog/init/lm_sensors.init /etc/rc.d/init.d/lm_sensors
# /sbin/chkconfig --add lm_sensors

■モニタリングの下準備2 【ucd-snmpのインストール】
 SNMPとは,Simple Network Management Protocol の略で,ネットワーク 経由で通信機器やコンピュータを管理するためのプロトコルです.規格 としては,RFC1157で策定 されており,MIB(Management Information Base.RFC1156, RFC1213等で定義) と呼ばれる管理情報データベースを操作したり閲覧 することにより,機器類を容易に管理可能になります.この辺りの情報は,ZDnetの SNMPにおける情報取得の基礎に詳しく解説されていますので,詳細に関しては, そちらを参照してみてください.

 なお,今回インストールする ucd-snmp パッケージはには,SNMPの エージェント,ライブラリ,SNMP エージェント用のツール,SNMPトラップを 作成するためのツール等が含まれています.Linux で SNMP を使用する場合に 最も一般的に使われるパッケージであると思いますが,同パッケージは今後, net-snmp という名前になるようです.

■ダウンロードとインストール
 オリジナルの配布元はこちら ですが,Vine を使用しているのであれば,Vine Plus で提供されている RPM パッケージをインストールするのが楽でしょう.具体的には,まずは Vine のミラーサイトなどから,下記ファイルをダウンロードします.

 インストールしたファイル:
  ucd-snmp-4.2.3-1vl1.i386.rpm
  ucd-snmp-devel-4.2.3-1vl1.i386.rpm
  ucd-snmp-utils-4.2.3-1vl1.i386.rpm

 次にインストールですが,root 権限で rpm コマンドを使ってインストール するだけです.

# rpm -ivh ucd-snmp-4.2.3-1vl1.i386.rpm
ucd-snmp      ##################################################
# rpm -ivh ucd-snmp-devel-4.2.3-1vl1.i386.rpm
ucd-snmp-devel   ##################################################
# rpm -ivh ucd-snmp-utils-4.2.3-1vl1.i386.rpm
ucd-snmp-utils   ##################################################

 エラーが表示されていなければ,インストール完了です.

■設定
 ucd-snmp インストール後,まずはインストールしたマシン自身の 各種値の監視が出来るように,snmpd の設定を行います.設定ファイル は /etc/snmp/snmpd.conf に置かれており,とりあえずの初期 設定がされています.これをそのまま使い回しても良いのですが,私は 以下のように,主要な部分を一通り書き直しました.赤字で表示されている 部分が,修正を加えた部分です.

####
# First, map the community name "public" into a "security name"

#       sec.name  source          community
# com2sec notConfigUser  default       public

####
# Second, map the security name into a group name:

#       groupName      securityModel securityName
# group   notConfigGroup v1           notConfigUser
# group   notConfigGroup v2c           notConfigUser

####
# Third, create a view for us to let the group have rights to:

#       name           incl/excl     subtree         mask(optional)
# view    systemview     included      system

####
# Finally, grant the group read-only access to the systemview view.

#       group          context sec.model sec.level prefix read   write  notif
# access  notConfigGroup ""      any       noauth    exact  systemview none none

com2sec local     localhost       private
com2sec mynetwork 192.168.0.0/24  home

group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local
group MyROGroup v1 mynetwork
group MyROGroup v2c mynetwork
group MyROGroup usm mynetwork

view all    included  .1                               80

access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all all

 上記のように設定することにより,ローカルからは private,192.168.0.0/24 (192.168.0.0〜192.168.0.255)のマシンからは home というコミュニティ名で snmpd にアクセス可能になります.誰にでも接続を許可する場合はコミュニティ 名を public にする場合がありますが,これはパスワードのようなものなので, 慎重に選択した方が良いでしょう(書き換え権限を与えなければ,大きな問題に はることは少ないでしょうが).

 この他,2箇所ほど書き換えました.1つ目はシステムの名前と連絡先です.

syslocation Asus Terminator TU
syscontact root

 なお,2行目の syscontact は,管理者のメールアドレスにしておきます. 私は root 宛のメールはそのままフォワードしているため,上記のようにして いますが,直接管理者のアドレスを指定しても良いでしょう.

 2つ目は SNMP でディスクの空き容量もチェックするために,以下の行を追加し ました.

#disk / 10000

disk / 5%
disk /export/hd1 5%

 マウントポイントが "/" および "/export/hd1" の2台のディスクを 監視可能にし,空き容量が 5% を切ったらアラームが出る(念のため書いておく と,アラームが鳴り響くわけではない.『やばいですよ』というトリガを発し, SNMP のフロントエンドで何らかの処理を行えるようになる)ようにしました.

 なお,温度情報に関しても SNMP 経由で監視したい場合,例えば

# exec echotest /bin/echo hello world
exec  temp1 /bin/cat /proc/sys/dev/sensors/it87-isa-0290/temp2
exec  temp2 /bin/cat /proc/sys/dev/sensors/it87-isa-0290/temp1

 のように設定し,snmpd 実行後(後述),次のようにコマンドを実行すること により,見ることができます.

# snmpwalk -v 1 localhost private .1.3.6.1.4.1.2021.8

enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2
enterprises.ucdavis.extTable.extEntry.extNames.1 = temp1
enterprises.ucdavis.extTable.extEntry.extNames.2 = temp2
enterprises.ucdavis.extTable.extEntry.extCommand.1 = /bin/cat /proc/sys/dev/sens
ors/it87-isa-0290/temp1
enterprises.ucdavis.extTable.extEntry.extCommand.2 = /bin/cat /proc/sys/dev/sens
ors/it87-isa-0290/temp2
enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
enterprises.ucdavis.extTable.extEntry.extResult.2 = 0
enterprises.ucdavis.extTable.extEntry.extOutput.1 = 60.0 20.0 46.0
enterprises.ucdavis.extTable.extEntry.extOutput.2 = 60.0 20.0 36.0
enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0
enterprises.ucdavis.extTable.extEntry.extErrFixCmd.1 =
enterprises.ucdavis.extTable.extEntry.extErrFixCmd.2 =

 青文字で書かれている部分が温度情報で,上の行は CPU 温度,下の行が M/B 温度であり,それぞれ警告敷居値の MAX, MIN, 現在の温度を示しています.

■実行と使用
 /etc/snmp/snmpd.conf の設定が終わったら,snmpd を起動し,きちんと 情報が取得できるかを試してみます.まずは snmpd を起動するスクリプトを 実行します.

# /etc/rc.d/init.d/snmpd start
snmpdを起動中:                   [ OK ]

 ここで OK の表示がされていなかったり,/var/log/messages にエラーが 記録されていたら,もう一度設定ファイルの内容を確認し,snmpd を再起動 してください.snmpd を再起動する場合は, /etc/rc.d/init.d/snmpd restart と,実行します.

 ログファイルに以下のように出力されていたら,設定ファイルにエラーが 無く,とりあえずは snmpd が動作していると言えます.(ps コマンドで, プロセスが動いているかを確認するとより確実ですが)

Feb  xx 13:45:55 terminator ucd-snmp[8473]: UCD-SNMP version 4.2.3
Feb  xx 13:45:55 terminator  2月  6 13:45:55 snmpd: snmpd起動 succeeded

 それでは,snmpd から情報を取得してみまましょう.ucd-snmp パッケージには, SNMP のフロントエンドとして動作するコマンドがいくつか含まれています. これらのうちよく使用されるのは,snmpgetsnmpwalk の 2つです. 共に参照するホスト名,コミュニティ名,オブジェクトIDを指定する ことにより,SNMP を利用して情報を参照することができます.snmpget は 一意となるオブジェクトID (以下OID) を指定する必要がありますが, snmpwalk は,任意の OID ツリー以下の情報を連続して出力させることができます.

 まずは システム情報を SNMP 経由で取得してみましょう.

# snmpget localhost private .1.3.6.1.2.1.1.1.0
system.sysDescr.0 = Linux terminator 2.4.19-0vl26 #1 2002年 11月 23日 土曜日 09:48:34 JST i686

 環境によって表示される文字列は異なると思いますが,現在利用中のシステム の情報が表示されていたら,snmpd が正常に動作していると言えます.

 次に,SNMP 経由で参照可能なデータを,全て表示してみましょう.

# snmpwalk localhost private .
system.sysDescr.0 = Linux terminator 2.4.19-0vl26 #1 2002年 11月 23日 土曜日 09:48:3
4 JST i686
system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.linux
system.sysUpTime.0 = Timeticks: (21979886) 2 days, 13:03:18.86
system.sysContact.0 = root
system.sysName.0 = terminator
(後略)

 かなり膨大な数の情報が表示されるはずです.

 ここで引数として渡したパラメータを解説すると,「localhost」が ホスト名,「private」がコミュニティ名,"." から始まる番号が,OID です. なお,上記の実行例では,出力結果は OID が "system.sysObjectID.0" のように 文字列で表示されています.OID を数字で表示したい場合には, 次のように実行します.

# snmpwalk -On localhost private .
.1.3.6.1.2.1.1.1.0 = Linux terminator 2.4.19-0vl26 #1 2002年 11月 23日 土曜日 09:48:
34 JST i686
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2021.250.10
.1.3.6.1.2.1.1.3.0 = Timeticks: (22771884) 2 days, 15:15:18.84
.1.3.6.1.2.1.1.4.0 = Root 
.1.3.6.1.2.1.1.5.0 = terminator
.1.3.6.1.2.1.1.6.0 = Asus Terminator TU
(後略)

※snmpwalk や snmpget では OID を指定する際に, 先頭に"."を付けて指定します.snmpwalk 等の出力でも先頭にピリオドが付いてい ますが,RFC等で定義されている正式な OID は,先頭にピリオドは付いてい ません.

 そして snmpwalk コマンドの場合,任意の OID のツリー以下を表示する ことができます.例えば,上記の例で説明すると,OID として ".1.3.6.1.2.1.1" を与えると,"1.3.6.1.2.1.1" で始まるオブジェクトを 全て表示します.一方 snmpget の場合,一意となる OID を指定しなければ なりません(例:"1.3.6.1.2.1.1.1.0").

※数字で指定した方が入力し易いため,一般に,コマンドを 実行する際には数字で OID を指定します.しかし, 「snmpget localhost private system.sysDescr.0」のように名前で指定する こともできます

 きちんと snmpd が動作していることを確認したら,Linux ブート時に, 自動的に snmpd が起動するように設定します.

# /sbin/chkconfig --add snmpd

 これで ucd-snmp 関係の設定は完了です.

『稼動状況をモニタする MB温度からCPU使用率まで2』 へ続きます


『Asus Terminator 活用メモ』 へ戻る