2月 202012
 

それにしても ports で提供されている snmpd、つまりは net-mgmt/net-snmp なんですけども、最近のバージョンはあまりにひどすぎる。エラーログを延々とはき続けているは、CPU 食いまくっているわでロクなモンじゃない。いい加減使うのイヤになって来た。

で、思いついたのが bsnmpd。FreeBSD に標準で付加されるようになった snmpd なんだけども、やっぱり net-snmp があまりにもヒサンなので「自前で持ってしまえーっ!!」ってんで開発が始まったのかなぁ?経緯は知らないんですけども。

と、いうことで今回は net-snmp を利用するのをやめて、bsnmpd を利用することにしたのですが、その顛末を書いてみたいと思います。まず、最初に書いてしまいますが、僕的には net-snmp の代用に十分になることが確認できました。なので自宅のサーバは bsnmpd を稼働するようにしました。

まず、はじめの手順ですが、 ports からインストールする net-mgmt/net-snmp を停止します。ただし、snmpd を停止するのみで pkg_delete はしませんでした。snmpwalk は利用したいしねー。みたいな感じです。そしてその後、bsnmpd を起動するように /etc/rc.conf に以下の設定を追加します。

bsnmpd_enable="YES"

 
が、その前に /etc/snmpd.config の設定があるんですね。

あ。今回利用した FreeBSD のバージョンは 9.0-STABLE です。 /etc/snmpd.config の設定自体は SNMPv3 や ACL に対応したようでずいぶんと長くなりました。が、要らない部分も多いのでサクっと消して起動。って感じです。
あと、ports 的には net-mgmt/bsnmp-ucd もインストールしておきましょう。これ重要です;-)。

でもって今回は以下のポリシで設定してみました。

・ネットワークインターフェースからトラフィック情報を取得します。
・ただし snmp_netgraph.so や snmp_bridge.so 、 snmp_wlan.so などのモジュールは利用しません。
・SNMPv1・v2c でアクセスします。
・プライベートアドレスからのアクセスのため ACL は設定しません。
・Read な MIB のみを参照します。

設定はそんなに苦痛ではなかったですね。 /etc/snmpd.config の default の設定では基本的に system とか if MIB の情報しか取れないので ports でインストールした net-mgmt/bsnmp-ucd がディスク・メモリ・ロードアベレージと、net-snmp の exec にも対応してくれます。すごいっ!!

porst の net-mgmt/bsnmp-ucd をインストールすると /usr/local/share/examples/bsnmp-ucd/snmpd.config.sample がインストールされるので、これを編集して /etc/snmpd.config で include するか /etc/snmpd.config に直接書いてしまうのが手っ取り早いです。

以下は僕が設定した /etc/snmpd.config になります。

1  # Set some common variables
2  location := "FreeBSD World."
3  contact  := "takachan@running-dog.net"
4  system   := 1   # FreeBSD
5  read     := "HelloWorld"
6
7  # Declarations for SNMP-USER-BASED-SM-MIB
8  NoAuthProtocol          := 1.3.6.1.6.3.10.1.1.1
9  HMACMD5AuthProtocol     := 1.3.6.1.6.3.10.1.1.2
10  HMACSHAAuthProtocol     := 1.3.6.1.6.3.10.1.1.3
11  NoPrivProtocol          := 1.3.6.1.6.3.10.1.2.1
12  DESPrivProtocol         := 1.3.6.1.6.3.10.1.2.2
13  AesCfb128Protocol       := 1.3.6.1.6.3.10.1.2.4
14
15  # Enumerations from SNMP-FRAMEWORK-MIB
16  securityModelAny        := 0
17  securityModelSNMPv1     := 1
18  securityModelSNMPv2c    := 2
19  securityModelUSM        := 3
20
21  # Message Processing models
22  MPmodelSNMPv1           := 0
23  MPmodelSNMPv2c          := 1
24  MPmodelSNMPv3           := 3
25
26  # Security levels
27  noAuthNoPriv := 1
28  authNoPriv := 2
29  authPriv := 3
30
31  # Configuration
32  %snmpd
33  begemotSnmpdDebugDumpPdus       = 2
34  begemotSnmpdDebugSyslogPri      = 7
35
36  begemotSnmpdCommunityString.0.1 = $(read)
37  begemotSnmpdCommunityDisable    = 1
38
39  # open standard SNMP ports
40  begemotSnmpdPortStatus.0.0.0.0.161 = 1
41
42  # open a unix domain socket
43  begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
44  begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4
45
46  sysContact      = $(contact)
47  sysLocation     = $(location)
48  sysObjectId     = 1.3.6.1.4.1.12325.1.1.2.1.$(system)
49
50  # Load MIB-2 module
51  begemotSnmpdModulePath."mibII"  = "/usr/lib/snmp_mibII.so"
52
53  # bsnmp-ucd (8)
54  begemotSnmpdModulePath."ucd" = "/usr/local/lib/snmp_ucd.so"
55  %ucd
56  memMinimumSwap = 1600
57  memSwapErrorMsg = "No free swap!"
58
59  laConfig.1 = "6.0"
60  laConfig.2 = "5.0"
61  laConfig.3 = "4.0"
62
63  laErrMessage.1 = "1min load average is high!"
64  laErrMessage.2 = "5min load average is high!"
65  laErrMessage.3 = "15min load average is high!"
66
67  # Process table
68  prNames.1 = "sendmail"
69  prMin.1 = 1
70  prMax.1 = 3
71  prNames.2 = "httpd"
72  prMin.2 = 3
73  prMax.2 = 100
74
75  # Extension commands (extTable)
76  extNames.1   = "CPUTemp"
77  extCommand.1 = "/usr/local/bin/cputz.sh CPU"
78  extNames.2   = "HDDTemp"
79  extCommand.2 = "/usr/local/bin/cputz.sh HDD"
80  extNames.3   = "CPUAUTO"
81  extCommand.3 = "/usr/local/bin/cpuspeed.sh AUTO"
82  extNames.4   = "CPUFULL"
83  extCommand.4 = "/usr/local/bin/cpuspeed.sh FULL"

 
default の部分を残してある設定もありますが、ほぼ不要と思われる設定を消しました。そして、

・54 行目で /usr/local/lib/snmp_ucd.so をロードしています。
・56 行目はメモリの設定
・63 行目は CPU ロードアベレージの設定
・68 行目でプロセス数の設定。今回は .1 で sendmail 、 .2 で httpd の数を取得することにしました。
・76 行目以降は net-snmp の exec に相当する機能です。僕の場合は CPU 温度と CPU 速度を返すスクリプトを呼ぶようにしています。

こんな感じで記述して後は /etc/rc.d/bsnmpd start とかして起動すれば OK です。

net-snmp をインストールしていると snmpwalk があるのですが、削除してしまった場合には net-mgmt/bsnmptools をインストールするとそれに対応するコマンドがインストールされます。僕の場合、クライアントは net-snmp のを利用するので動作確認はしていませんが;-)。

デーモンである bsnmpd を利用した感じですが、net-snmp の snmpd より軽いですね。 CPU 負荷が低い。あと、要らんログが出力されないのも良い。それでいて net-snmp のと同等機能で動作するのでこれまた良い感じです。

ただ、一点だけ。bsnmpd を起動して netstat -a で確認してみると udp6 のポートが空いてないんですね。と、いうことは bsnmpd は IPv6 に対応してないのかなぁ? という気がちょっとしています。オプションを調べても IPv6 のが無いですし・・。あ。ソースコードは読んでないです;-)。

と、いうことで、いいかげん嫌気がさしてきた net-snmp を置き換えて利用する bsnmpd ですが、今のところは十分に利用可能だと思われます。サーバ系では特に。情報収集のためのデーモンが一番 CPU を消費していてもらっては困りますしねX-|。