pfSense のWebUIダッシュボードに表示されるようなサーバ 温度 を、The Dude SNMP マネージャにより継続的に監視すべく、FreeBSDのsysctlコマンドで得られる温度情報を NET-SNMP 拡張に渡し、 SNMP マネージャで受け取れるような仕組みを構築しました。
pfSenseのダッシュボードの温度表示
pfSenseのダッシュボードページでは、システム温度が次のように表示されます。
参照する温度センサに関する設定は、メニューを System → Advanced と進んで「Miscellaneous」タブから。実際に読み取れるかはハードウェアに依存しますが、CPU温度はまず取得出来ると思います。
この温度情報をSNMPで取得出来るようにして、SNMPマネージャから継続的に監視するのが今回の目標です。尚、ハードウェアやOSなどは以下の通り。
- pfsense 2.4.4-RELEASE (amd64)
- FreeBSD 11.2-RELEASE-p3
- IBM x3650 Type 7979
- Intel Xeon CPU E5405 @ 2.00GHz (4C4T)
sysctlで温度を取得
FreeBSDにおいて、sysctlコマンドを使って温度センサの値を得る手法については、こちらの記事がとても丁寧で参考になりました。Great Tnx!
実際にどんな情報が得られるのか、pfSenseのコンソール上で確認してみます。
1 2 3 4 5 |
[2.4.4-RELEASE]/root: /sbin/sysctl -a | grep temperature dev.cpu.3.temperature: 39.0C dev.cpu.2.temperature: 28.0C dev.cpu.1.temperature: 27.0C dev.cpu.0.temperature: 29.0C |
Xeon E5405は4コアなのでCPUコア温度も4つ出てきます。本来ならばx3650のシステムボード上のAmbientセンサ( hw.acpi.thermal )もあるはずなのですが、おそらくこれは何かドライバ入れないと取得出来ないのでしょう。ひとまず今回のデータソースはこれにします。
NET-SNMP拡張を定義
sysctlで得られる温度情報をスクリプトで整形し、NET-SNMP拡張に載せると言う今回のアイディアは、netgateフォーラムのこちらのスレッドによるものです(Great Tnx!!)。
NET-SNMP拡張が呼び出すスクリプトも、そのまま有り難く使わせていただきました。
1 2 |
#!/bin/sh /sbin/sysctl dev.cpu | /usr/bin/awk '/temperature/ {print $2;}' | sed 's/[CF]//g' |
この実行結果は以下のように、温度の数字のみが改行区切りで抽出された形になります。
1 2 3 4 5 |
[2.4.4-RELEASE]/root: /sbin/sysctl dev.cpu | /usr/bin/awk '/temperature/ {print $2;}' | sed 's/[CF]//g' 39.0 28.0 26.0 29.0 |
このスクリプトをpfSenseのNET-SHMP拡張に定義するのですが、メニューの Services → NET-SNMP ページの「Host Information」タブを開こうとするとFirefox(v88)では正しく開くことが出来ませんでした。
Chromeでは問題なく開くことが出来たので、その中の Extended Commandsに次の要領で拡張を登録します。
クライアントよりsnmpwalk
次に設定したNET-SNMP拡張が機能しているか、Ubuntu機からsnmpwalkで確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ snmpwalk -c #COM_STR# -v 2c #IP_ADDR# 1.3.6.1.4.1.8072.1.3.2 iso.3.6.1.4.1.8072.1.3.2.1.0 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.2.8.103.101.116.116.101.109.112.115 = STRING: "/root/pfs_gettemps.sh" iso.3.6.1.4.1.8072.1.3.2.2.1.3.8.103.101.116.116.101.109.112.115 = "" iso.3.6.1.4.1.8072.1.3.2.2.1.4.8.103.101.116.116.101.109.112.115 = "" iso.3.6.1.4.1.8072.1.3.2.2.1.5.8.103.101.116.116.101.109.112.115 = INTEGER: 5 iso.3.6.1.4.1.8072.1.3.2.2.1.6.8.103.101.116.116.101.109.112.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.7.8.103.101.116.116.101.109.112.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.2.1.20.8.103.101.116.116.101.109.112.115 = INTEGER: 4 iso.3.6.1.4.1.8072.1.3.2.2.1.21.8.103.101.116.116.101.109.112.115 = INTEGER: 1 iso.3.6.1.4.1.8072.1.3.2.3.1.1.8.103.101.116.116.101.109.112.115 = STRING: "39.0" iso.3.6.1.4.1.8072.1.3.2.3.1.2.8.103.101.116.116.101.109.112.115 = STRING: "39.0 28.0 22.0 24.0" iso.3.6.1.4.1.8072.1.3.2.3.1.3.8.103.101.116.116.101.109.112.115 = INTEGER: 4 iso.3.6.1.4.1.8072.1.3.2.3.1.4.8.103.101.116.116.101.109.112.115 = INTEGER: 0 iso.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.1 = STRING: "39.0" iso.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.2 = STRING: "28.0" iso.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.3 = STRING: "22.0" iso.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.4 = STRING: "24.0" |
監視に使うのは、上記出力結果の最後の4行のoidということがわかりました。もしかすると図04で空欄にしたoid欄を何か指定すれば、そのoidで呼び出せるのかも知れませんが、oidの規則をさほど理解しているわけでもないので、欲張らずにシステムの提示するoidに従います。
The Dude SNMPサーバにMIBを追加
以前にも何度か登場しているこのThe Dudeは、MikroTik社から出ているSNMPマネージャソフトウェアです。以前はWindows版のバイナリもリリースされていましたが、現行版がリリースされた当時はRouterOSの一機能としてのみでした。これを仮想マシンに構築して、SNMPによるネットワーク監視デバイスとしてのみ使用しています。現在、改めてダウンロードページをチェックしてみると、WindowsやLinux向けインストーラも再びラインナップされていますね。
今回利用しているNET-SNMP拡張機能は、NET-SNMP-EXTEND-MIBとしてMIBを公式サイトからダウンロードすることが出来ます。ダウンロードしたMIBをsftpにてThe Dudeへ転送して適用する手順については、以前まとめたこちらの記事を参考に。
尚、oidを数字で直接して使うのであれば、SNMPマネージャ側でのこの作業は必須ではないと思います。
The Dude SNMPサーバに監視項目を設定
The Dudeのsnmpwalkにて、以下のoidのサブツリーを要求してみます。
1 |
1.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115 |
得られた結果を右クリックして、監視項目とする為のプローブを作成することも可能ですが、今回は以前、UPSの温度監視に取り組んだ際と同じ様に、しきい値を設定してオーバーヒート警告の機能を盛り込みたいので、ここでは作成しません。
まずプローブウィンドウにおいて、新規にプローブを以下の要領で作成します(しきい値を45℃に設定)。
1 2 3 4 5 |
Type : Function Available: oid("1.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.1") Error : if(oid("1.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.1") < 45, "", "Over Heat") Value : oid("1.3.6.1.4.1.8072.1.3.2.4.1.2.8.103.101.116.116.101.109.112.115.1") Unit : C |
プローブの新規作成は手間の掛かる作業ですが、1つ作ってしまえばそれを複製して(下図緑枠内のボタン)、2つ目以降に編集出来るのは便利なので活用しましょう。
プローブの作成を終えたらpfSenseデバイスを開き、「Discover」ボタンを押すと追加したプローブが監視項目として追加されます。
追加直後はなかなか受信しなくてやきもきしますが、一晩放置した後、問題無く監視・記録していることを確認出来ました。