Using bsnmpd

いつの頃からかFreeBSD basesystemに付属しているbsnmpdを使ってみました。

環境整備

  • FreeBSD 6.0-RELEASE
    • 最新の driver が必要だったのでkernelのみ-STABLE
  • basesystemのbsnmpdを使用

設定ファイル

  • /etc/snmpd.config
    • host, location, contact, system read あたりを設定
    • write, trap は使わないので、$(write), $(trap) マクロを含むようなルールはコメントアウト
  • /etc/rc.conf
    • bsnmpd_enable="YES"

起動

接続テスト

  • 他のホストから適当に接続
    • snmpwalk -v1 -c COMMUNITY IPADDR
SNMPv2-MIB::sysDescr.0 = STRING: host.example.jp 0 FreeBSD 6.0-STABLE
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.12325.1.1.2.1.1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (178125) 0:29:41.25
SNMPv2-MIB::sysContact.0 = STRING: root@host.example.jp
SNMPv2-MIB::sysName.0 = STRING: host.example.jp
SNMPv2-MIB::sysLocation.0 = STRING: Japan
SNMPv2-MIB::sysServices.0 = INTEGER: 76
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (4) 0:00:00.04
SNMPv2-MIB::sysORID.1 = OID: SNMPv2-SMI::enterprises.12325.1.1.1.10.2
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-SMI::enterprises.12325.1.1.1.10.3
SNMPv2-MIB::sysORID.3 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-SMI::enterprises.12325.1.1
SNMPv2-MIB::sysORID.5 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ipMIB
SNMPv2-MIB::sysORID.7 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: IP-MIB::ip.24
SNMPv2-MIB::sysORDescr.1 = STRING: udp transport mapping
SNMPv2-MIB::sysORDescr.2 = STRING: lsock transport mapping
SNMPv2-MIB::sysORDescr.3 = STRING: The MIB module for SNMPv2 entities.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for the Begemot SNMPd.
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module to describe generic objects for network interface sub-layers.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations, but excluding their management of IP routes.
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing TCP implementations.
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations.
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB module for the display of CIDR multipath IP Routes.
IF-MIB::ifNumber.0 = INTEGER: 4
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: em0
IF-MIB::ifDescr.2 = STRING: em1
IF-MIB::ifDescr.3 = STRING: plip0
IF-MIB::ifDescr.4 = STRING: lo0

この辺りが取れます。

構成

/usr/sbin/bsnmpd
snmpd実行ファイル
/lib/libbegemot.so
Begemot SNMP library
/usr/lib/snmp_*
libbegemotから呼ばれる個別の実装モジュール、現状でatm,mibII,netgraph,pfの4モジュールがあります
/usr/lib/snmp_mibII.so
MIB-2の実装モジュール、詳しくは snmp_mibIIのmanpageや/usr/share/snmp/defs/mibII_tree.def
/etc/snmpd.config
設定ファイル、起動オプションで変更可能

雑感

ネットワーク関係は一通り取れるので、いわゆるMRTGのためだけに net-snmp の snmpd を入れる必要は無さそうです。
ただし、HOST-RESOURCES-MIBやUCD-SNMP-MIB::dsk系が無いので、ディスク容量の監視をしたい場合には使えません。後者は最近のnet-snmpにも廃止されているのでともかく、HOST-RECOURCES-MIBは有用な項目がたくさんあるので欲しいところですね……。

2005/12/25追記: ucdavis MIB

書き忘れていましたが、いわゆるucdavisサブツリーなどと呼ばれる.1.3.6.1.4.1.2021(enterprises.ucdavis)以下のMIBについては、上記のパッチを適用しても未実装のままです。この配下には、snmpdが動作しているホスト(SNMPエージェント)に関する情報が含まれており、特にロードアベレージを保持するlaTableサブツリーメモリ状態を保持するmemoryサブツリーが存在します。前者は、HostResources MIBのhrProcessorLoadで1分平均のloadを、後者はhrStorageUsed等にメモリ状況も含まれるのでそこから代替ができますが、多少文脈が変わってしまいます。また、hrStorageサブツリーの構成は環境によって変化するため、hrStorageDescr等で判断しなければならないのも面倒なところです。
また、net-snmpではsnmpd.confで指定するようなプログラム実行結果のようなものも当然代替できません。
というわけで、exec等はともかく、memoryサブツリーは欲しいところですね……。

2007/07/20追記: net-snmpとのあわせわざ

未だにbsnmpd等で検索するとこの記事が上位に出てくるのですが、net-snmpでbsnmpdにproxyして使うというやり方を紹介している方がいたので紹介しておきます。

おそらくこれが現状で幸せに一番近い道かなと思います。